Nife version Beta
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

stackN.c 45 KiB

há 7 anos
há 10 anos
há 10 anos
há 10 anos
há 8 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 10 anos
há 8 anos
há 10 anos
há 9 anos
há 7 anos
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108
  1. /* Copyright (C) 2011-2016 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. /* stackN.c */
  14. #include "conf.h"
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <strings.h>
  19. #include <sys/types.h>
  20. #include <math.h>
  21. #include "nife.h"
  22. #include "mth.h"
  23. #include "err.h"
  24. #include "lib.h"
  25. #include "stackN.h"
  26. #include "stackL.h"
  27. #include "stackF.h"
  28. #include "stackV.h"
  29. #include "debug.h"
  30. #include "net.h"
  31. #include "scs.h"
  32. #define _VERIF_STACK_ if (StackN == VIDE) { messErr(2); return; }
  33. void IF_vars(void)
  34. {
  35. char * L;
  36. printf("DEBUG : ");
  37. if (Debug) printf("ON"); else printf("OFF");
  38. printf("\nDefault type=");
  39. if (DOUBLE) printf("REAL"); else printf("INTEGER");
  40. printf("\nPRINT MODE : ");
  41. switch(MODEPR) {
  42. case 1 :
  43. printf("HEX");
  44. break;
  45. case 2 :
  46. printf("OCT");
  47. break;
  48. case 3 :
  49. printf("BIN");
  50. break;
  51. default :
  52. printf("DEC");
  53. break;
  54. }
  55. printf("\nDefault echo=");
  56. if (ECHOOFF) printf("OFF"); else printf("ON");
  57. printf("\nNetServer : \"%s\"",NetServer);
  58. printf("\nSCS Key : 0x%lx",(long)getScs());
  59. printf("\nNetKey : 0x%lx",(long)NetKey);
  60. printf("\nVARS : ");
  61. switch(VARS) {
  62. case 1 :
  63. printf("DOWN");
  64. break;
  65. case 2 :
  66. printf("UP");
  67. break;
  68. default :
  69. printf("OFF");
  70. break;
  71. }
  72. printf("\nVariable Function : ");
  73. if ((L=libByAddr(FCT_INST)) != NULL) printf("%s (std lib)",L);
  74. else {
  75. if ((L=fctByAddr(FCT_INST)) != NULL) printf("%s (user function)",L);
  76. else {
  77. if ((L=varByAddr(FCT_INST)) != NULL) printf("%s (variable)",L);
  78. else printf("none");
  79. }
  80. }
  81. printf("\nNBTAB=%d\nNBLIG=%d\n",NBTAB,NBLIG);
  82. }
  83. void IFD_vars(void)
  84. {
  85. _IFD_BEGIN_
  86. IF_vars();
  87. _IFD_END_
  88. }
  89. void IF_REAL(void) { _MODIF_DOUBLE_(1); }
  90. void IF_INTEGER(void) { _MODIF_DOUBLE_(0); }
  91. void IF_DEC(void) { _MODIF_MODEPR_(0); }
  92. void IF_HEX(void) { _MODIF_MODEPR_(1); }
  93. void IF_OCT(void) { _MODIF_MODEPR_(2); }
  94. void IF_BIN(void) { _MODIF_MODEPR_(3); }
  95. void IF_ECHOFF(void) { _MODIF_ECHOOFF_(1); }
  96. void IF_ECHOON(void) { _MODIF_ECHOOFF_(0); }
  97. /* IMPORTANT **************************
  98. la taille t est codee sur 30 bits + a droite
  99. B31 = 1 si Var
  100. B32 = 1 si REAL
  101. **********************/
  102. #define MSK_T (uint32_t)(0x3FFFFFFF)
  103. #define MSK_V (uint32_t)(0x40000000)
  104. #define MSK_R (uint32_t)(0x80000000)
  105. struct Num {
  106. uint32_t t; /* taille : cf precisions ci-dessus */
  107. uint32_t key; /* net key */
  108. void *n;
  109. union {
  110. long long l;
  111. double d;
  112. };
  113. };
  114. int lAdrNum(void)
  115. {
  116. struct Num N;
  117. return((char*)&(N.l) - (char*)&(N.n));
  118. }
  119. void putLong(long long l)
  120. {
  121. void * M;
  122. struct Num * N;
  123. if ((M = malloc(sizeof(struct Num))) == NULL) stopErr("putLong","malloc");
  124. N = (struct Num*)M;
  125. N->t = 1;
  126. N->n = StackN;
  127. N->l = l;
  128. _MODIF_STACKN_(M);
  129. }
  130. void putDouble(double d)
  131. {
  132. void * M;
  133. struct Num * N;
  134. if ((M = malloc(sizeof(struct Num))) == NULL) stopErr("putDouble","malloc");
  135. N = (struct Num*)M;
  136. N->t = 1 | MSK_R;
  137. N->n = StackN;
  138. N->d = d;
  139. _MODIF_STACKN_(M);
  140. }
  141. int putVal(char *V)
  142. {
  143. void * M;
  144. char * R;
  145. struct Num * N;
  146. long long l;
  147. double d;
  148. #ifdef DEBUG
  149. printf("putVal (%s) \n",V);
  150. #endif
  151. l = strtoll(V,&R,0);
  152. if (strlen(R)==0) {
  153. if ((M = malloc(sizeof(struct Num))) == NULL) stopErr("putVal","malloc");
  154. N = (struct Num*)M;
  155. N->t = 1;
  156. N->n = StackN;
  157. N->l = l;
  158. if (fctEnCours) makeFct(T_NUM,M);
  159. else _MODIF_STACKN_(M);
  160. return 1;
  161. } else {
  162. d = strtod(V,&R);
  163. if (strlen(R)==0) {
  164. if ((M=malloc(sizeof(struct Num))) == NULL) stopErr("putVal","malloc");
  165. N = (struct Num*)M;
  166. N->t = 1 | MSK_R;
  167. N->n = StackN;
  168. N->d = d;
  169. if (fctEnCours) makeFct(T_NUM,M);
  170. else _MODIF_STACKN_(M);
  171. return 1;
  172. }
  173. }
  174. return 0;
  175. }
  176. static int isScalar(void)
  177. {
  178. struct Num *Elt;
  179. int t;
  180. if(StackN == VIDE) return 0;
  181. Elt = (struct Num *)StackN;
  182. if ((t = Elt->t&MSK_T) == 1) return 1;
  183. return 0;
  184. }
  185. static int dropElt(void)
  186. {
  187. struct Num *Elt;
  188. if(StackN == VIDE) return 0;
  189. Elt = (struct Num *)StackN;
  190. _MODIF_STACKN_(Elt->n);
  191. if (!(Elt->t&MSK_V)) free((void*)Elt);
  192. return 1;
  193. }
  194. void IF_drop(void)
  195. {
  196. _VERIF_STACK_
  197. dropElt();
  198. }
  199. static long long getVal(void)
  200. {
  201. struct Num *Elt;
  202. Elt = (struct Num *)StackN;
  203. if (Elt->t & MSK_R) return((long long)Elt->d);
  204. else return(Elt->l);
  205. }
  206. void IF_vers(void)
  207. {
  208. putDouble(atof(VERSION));
  209. }
  210. /* fonction pour les autres */
  211. int getParLong(long *V)
  212. {
  213. if (StackN == VIDE) {
  214. messErr(2); return 0 ;
  215. }
  216. if (!isScalar()) {
  217. messErr(36); return 0 ;
  218. }
  219. *V = (long)getVal();
  220. dropElt();
  221. return 1;
  222. }
  223. void putVar(void * V)
  224. {
  225. struct Num *Elt;
  226. if (V==VIDE) return;
  227. Elt = (struct Num *)V;
  228. Elt->n = StackN;
  229. _MODIF_STACKN_(V);
  230. }
  231. void * getVar(void)
  232. {
  233. void * N;
  234. struct Num *Elt;
  235. N = StackN;
  236. if (N != VIDE) {
  237. Elt = (struct Num *)N;
  238. _MODIF_STACKN_(Elt->n); /* drop no free !! */
  239. Elt->n = VIDE;
  240. Elt->t = Elt->t|MSK_V; /* VARIABLE ! */
  241. }
  242. return N;
  243. }
  244. void IF_NBTAB(void)
  245. {
  246. long V;
  247. if (getParLong(&V)) _MODIF_NBTAB_(V);
  248. }
  249. void IF_NBLIG(void)
  250. {
  251. long V;
  252. if (getParLong(&V)) _MODIF_NBLIG_(V);
  253. }
  254. void IF_VAROFF(void) { _MODIF_VARS_(0); }
  255. void IF_VARDOWN(void) { _MODIF_VARS_(1); }
  256. void IF_VARUP(void) { _MODIF_VARS_(2); }
  257. void insertVal(void*A)
  258. {
  259. void * M;
  260. struct Num *Elt;
  261. if ((M = malloc(sizeof(struct Num))) == NULL) stopErr("insertVal","malloc");
  262. bcopy(A,M,sizeof(struct Num));
  263. Elt=(struct Num*)M;
  264. Elt->n = StackN;
  265. _MODIF_STACKN_(M);
  266. }
  267. static void Ramp(int D)
  268. {
  269. long n, i, dep=1;
  270. void * M;
  271. struct Num * N;
  272. long long *T;
  273. _VERIF_STACK_
  274. if (!isScalar()) {
  275. messErr(36); return;
  276. }
  277. n = (long)getVal();
  278. dropElt();
  279. if (n > 1) {
  280. if (D) { /* double ramp */
  281. dep = -n;
  282. n = (2*n) +1;
  283. }
  284. if ((M = malloc(sizeof(struct Num)+((n-1)*(sizeof(double))))) == NULL)
  285. stopErr("Ramp","malloc");
  286. N = (struct Num*)M;
  287. N->t = n;
  288. N->n = StackN;
  289. _MODIF_STACKN_(M);
  290. T = &(N->l);
  291. for(i=0;i<n;i++) T[i]=i+dep;
  292. } else messErr(30);
  293. }
  294. void IF_ramp(void)
  295. {
  296. Ramp(0);
  297. }
  298. void IF_dramp(void)
  299. {
  300. Ramp(1);
  301. }
  302. void IF_stack_clear(void)
  303. {
  304. while (StackN != VIDE) dropElt();
  305. }
  306. static printLL(char * F, long long l)
  307. {
  308. char c, buf[68];
  309. unsigned long long v;
  310. int i;
  311. switch(MODEPR) {
  312. case 1 :
  313. c='x';
  314. printf("0x");
  315. break;
  316. case 2 :
  317. c='o';
  318. printf("0");
  319. break;
  320. case 3 :
  321. c='b';
  322. break;
  323. default :
  324. c='d';
  325. }
  326. if (c =='b') {
  327. if (l) {
  328. v = (unsigned long long)l;
  329. buf[67]='\0';
  330. i = 67;
  331. while (v) {
  332. i--;
  333. if (v & 1) buf[i]='1';
  334. else buf[i]='0';
  335. v >>= 1;
  336. }
  337. printf("%s ",buf+i);
  338. } else printf("0 ");
  339. } else {
  340. strcpy(buf,F);
  341. buf[3]=c;
  342. printf(buf,l);
  343. }
  344. }
  345. #define ELT_POINT -9
  346. static void printElt(struct Num * N, long I)
  347. {
  348. long n, i, m, nt, IB;
  349. long long *l;
  350. double *d;
  351. IB = I;
  352. n = N->t&MSK_T;
  353. if (IB < 0) nt = 3;
  354. else nt = NBTAB;
  355. if (n > nt) m=nt-1;
  356. else m=n-1;
  357. if (I==ELT_POINT) {
  358. IB=0;
  359. n=2;
  360. m=1;
  361. }
  362. if (IB) printf(" ");
  363. if(N->t & MSK_R) {
  364. if (n==1) printf("%g (REAL)",N->d);
  365. else {
  366. d = &N->d;
  367. for(i=0;i<m;i++) printf("%g ",*d++);
  368. if (I==ELT_POINT) return;
  369. if (n > nt) printf("... ");
  370. printf("%g (REAL)[%ld]",*(&N->d+(n-1)),n);
  371. }
  372. } else {
  373. if (n==1) {
  374. printLL("%lld ",N->l);
  375. printf("(INTEGER)");
  376. } else {
  377. l = &N->l;
  378. for(i=0;i<m;i++) printLL("%lld ",*l++);
  379. if (I==ELT_POINT) return;
  380. if (n > nt) printf("... ");
  381. printLL("%lld ",*(&N->l+(n-1)));
  382. printf("(INTEGER)[%ld]",n);
  383. }
  384. }
  385. if ((IB>0) && (N->t&MSK_V)) printf(" Var. %s",varByAddrA((void*)N));
  386. if (IB==1) printf(" <- top");
  387. if (IB) printf("\n");
  388. }
  389. void printNumber(void * E)
  390. {
  391. printElt((struct Num*)E, 0);
  392. }
  393. void numVarOff(void * A)
  394. {
  395. struct Num * N;
  396. N = (struct Num*) A;
  397. N->t = N->t & ~MSK_V;
  398. }
  399. void IF_show_stack(void)
  400. {
  401. void * Next;
  402. struct Num * N;
  403. long i=0,Nbl;
  404. char s;
  405. Nbl=NBLIG;
  406. Next = StackN;
  407. while (Next != VIDE) {
  408. N = (struct Num*) Next;
  409. i++;
  410. if (i<=Nbl) printElt(N,i);
  411. Next = N->n;
  412. }
  413. if (i<=Nbl) printf("<end of stack>\n");
  414. else {
  415. if (i==Nbl+1) s = ' ';
  416. else s = 's';
  417. printf(" ... and %ld other%c element%c !\n",i-Nbl,s,s);
  418. }
  419. }
  420. void IFD_show_stack(void)
  421. {
  422. _IFD_BEGIN_
  423. IF_show_stack();
  424. _IFD_END_
  425. }
  426. void IF_point(void)
  427. {
  428. struct Num *Elt;
  429. _VERIF_STACK_
  430. Elt = (struct Num *)StackN;
  431. printElt(Elt,ELT_POINT);
  432. /* printf("\n"); */
  433. dropElt();
  434. }
  435. void * duplicateNum(void * S, int vSoff)
  436. {
  437. struct Num *Elt, *NElt;
  438. void * M;
  439. uint32_t n;
  440. int s;
  441. Elt = (struct Num*)S;
  442. n = Elt->t&MSK_T;
  443. s = sizeof(struct Num)+((n-1)*(sizeof(double)));
  444. if ((M = malloc(s)) == NULL) stopErr("dupElt","malloc");
  445. bcopy((void*)Elt,M,s);
  446. NElt = (struct Num *)M;
  447. NElt->n = VIDE;
  448. NElt->t = Elt->t;
  449. if (vSoff) Elt->t = Elt->t & ~MSK_V; /* Source no more a Var */
  450. return(M);
  451. }
  452. static void dupElt(struct Num * Elt)
  453. {
  454. struct Num *NElt;
  455. void * M;
  456. uint32_t n;
  457. int s;
  458. n = Elt->t&MSK_T;
  459. s = sizeof(struct Num)+((n-1)*(sizeof(double)));
  460. if ((M = malloc(s)) == NULL) stopErr("dupElt","malloc");
  461. bcopy((void*)Elt,M,s);
  462. NElt = (struct Num *)M;
  463. NElt->n = StackN;
  464. NElt->t = Elt->t & ~MSK_V; /* au cas ou Var */
  465. _MODIF_STACKN_(M);
  466. }
  467. void IF_dup(void)
  468. {
  469. _VERIF_STACK_
  470. dupElt((struct Num *)StackN);
  471. }
  472. void IF_swap(void)
  473. {
  474. struct Num *Elt, *Elt2;
  475. _VERIF_STACK_
  476. Elt = (struct Num *)StackN;
  477. if (Elt->n != VIDE) {
  478. _MODIF_STACKN_(Elt->n);
  479. Elt2 = (struct Num *)StackN;
  480. Elt->n = Elt2->n;
  481. Elt2->n = (void*)Elt;
  482. }
  483. else messErr(4);
  484. }
  485. void IF_over (void)
  486. {
  487. struct Num *Elt;
  488. _VERIF_STACK_
  489. Elt = (struct Num *)StackN;
  490. if (Elt->n != VIDE)
  491. dupElt((struct Num *)Elt->n);
  492. else messErr(4);
  493. }
  494. void IF_pick(void)
  495. {
  496. void * Next;
  497. struct Num * N;
  498. long n, i;
  499. _VERIF_STACK_
  500. if (!isScalar()) {
  501. messErr(36); return;
  502. }
  503. n = (long)getVal();
  504. dropElt();
  505. if (n>0) {
  506. Next = StackN;
  507. i=1;
  508. while (Next != VIDE) {
  509. if (i==n) break;
  510. N = (struct Num*) Next;
  511. Next = N->n;
  512. i++;
  513. }
  514. if (Next != VIDE) dupElt((struct Num *)Next);
  515. else messErr(4);
  516. } else messErr(29);
  517. }
  518. static int rotateBid(long n, int d) /* d=0 : rot d=1 : unrot */
  519. {
  520. void **ANext;
  521. struct Num * N, *N1;
  522. long i;
  523. ANext = _ADDR_STACKN_;
  524. i=1;
  525. while (*ANext != VIDE) {
  526. if (i==n) break;
  527. N = (struct Num*) *ANext;
  528. ANext = &N->n;
  529. i++;
  530. }
  531. if (*ANext != VIDE) {
  532. N = (struct Num*) *ANext;
  533. if (d) { /* unrot */
  534. N1 = (struct Num*) StackN;
  535. _MODIF_STACKN_(N1->n);
  536. N1->n = N->n;
  537. N->n = (void*)N1;
  538. } else { /* rot */
  539. *ANext = N->n;
  540. N->n = StackN;
  541. _MODIF_STACKN_((void*)N);
  542. }
  543. return 1;
  544. } else return 0;
  545. }
  546. void IF_rot(void)
  547. {
  548. if (!rotateBid(3L,0)) messErr(4);
  549. }
  550. void IF_unrot(void)
  551. {
  552. if (!rotateBid(3L,1)) messErr(4);
  553. }
  554. void IF_roll(void)
  555. {
  556. long n;
  557. _VERIF_STACK_
  558. if (!isScalar()) {
  559. messErr(36); return;
  560. }
  561. n = (long)getVal();
  562. dropElt();
  563. if (n>1) {
  564. if (!rotateBid(n,0)) messErr(4);
  565. } else messErr(30);
  566. }
  567. void IF_unroll(void)
  568. {
  569. long n;
  570. _VERIF_STACK_
  571. if (!isScalar()) {
  572. messErr(36); return;
  573. }
  574. n = (long)getVal();
  575. dropElt();
  576. if (n>1) {
  577. if (!rotateBid(n,1)) messErr(4);
  578. } else messErr(30);
  579. }
  580. void IF_depth(void)
  581. {
  582. void * Next;
  583. struct Num * N;
  584. long long i=0;
  585. Next = StackN;
  586. while (Next != VIDE) {
  587. N = (struct Num*) Next;
  588. i++;
  589. Next = N->n;
  590. }
  591. putLong(i);
  592. }
  593. int nbOnStack(void* A)
  594. {
  595. void * Next;
  596. struct Num * N;
  597. int i=0;
  598. Next = StackN;
  599. while (Next != VIDE) {
  600. N = (struct Num*) Next;
  601. if (Next == A) i++;
  602. Next = N->n;
  603. }
  604. return i;
  605. }
  606. static uint32_t nbSizeTypeOnStack(uint32_t n,uint32_t *T)
  607. {
  608. void * Next;
  609. struct Num * N;
  610. uint32_t i=0, D=0, S=0;
  611. Next = StackN;
  612. while (Next != VIDE) {
  613. N = (struct Num*) Next;
  614. S += N->t&MSK_T;
  615. if (N->t&MSK_R) D=1;
  616. Next = N->n;
  617. i++;
  618. if (i==n) break;
  619. }
  620. if (D) S = S|MSK_R;
  621. *T = S;
  622. return i;
  623. }
  624. void IF_Ndrop(void)
  625. {
  626. long n, i;
  627. _VERIF_STACK_
  628. if (!isScalar()) {
  629. messErr(36); return;
  630. }
  631. n = (long)getVal();
  632. dropElt();
  633. for(i=0;i<n;i++) if (!dropElt()) break;
  634. if (i<n) messErr(4); /* erreur pour la rigueur ! */
  635. }
  636. void IF_Ndup(void)
  637. {
  638. void *Next, *M, *NewS, **P;
  639. struct Num * Elt, * NElt;
  640. uint32_t n, i=0, t;
  641. int s;
  642. _VERIF_STACK_
  643. if (!isScalar()) {
  644. messErr(36); return;
  645. }
  646. n = (long)getVal();
  647. dropElt();
  648. if (n>0) {
  649. NewS=VIDE;
  650. P=&NewS;
  651. Next = StackN;
  652. while (Next != VIDE) {
  653. Elt = (struct Num*) Next;
  654. t = Elt->t&MSK_T;
  655. s = sizeof(struct Num)+((t-1)*(sizeof(double)));
  656. if ((M = malloc(s)) == NULL) stopErr("IF_Ndup","malloc");
  657. bcopy(Next,M,s);
  658. *P = M;
  659. NElt = (struct Num *)M;
  660. NElt->t = NElt->t & ~MSK_V; /* au cas ou Var */
  661. P=&NElt->n;
  662. i++;
  663. if (i==n) break;
  664. Next = Elt->n;
  665. }
  666. NElt->n = StackN;
  667. _MODIF_STACKN_(NewS);
  668. if (i<n) messErr(4); /* erreur pour la rigueur ! */
  669. } else messErr(29);
  670. }
  671. static void toDouble(struct Num * N)
  672. {
  673. uint32_t n;
  674. int i;
  675. double *d;
  676. long long *l;
  677. if (N->t & MSK_R) return;
  678. n = N->t&MSK_T;
  679. d = &N->d;
  680. l = &N->l;
  681. for(i=0; i<n; i++) *d++ = (double)*l++;
  682. N->t = N->t|MSK_R;
  683. }
  684. /* NET Functions for STSP */
  685. void IF_NetKey (void)
  686. {
  687. _VERIF_STACK_
  688. if (!isScalar()) {
  689. messErr(36); return;
  690. }
  691. _MODIF_NetKey_((uint32_t)getVal());
  692. dropElt();
  693. }
  694. void IF_NetErrVal (void)
  695. {
  696. putLong(-(long long)NetKey);
  697. }
  698. void StackToNet(long n)
  699. {
  700. struct Num *Elt;
  701. int i;
  702. uint32_t t, l;
  703. for (i=0; i<n ; i++) {
  704. if(StackN == VIDE) break;
  705. Elt = (struct Num *)StackN;
  706. t = Elt->t&MSK_T;
  707. l=(sizeof(struct Num)+((t-1)*(sizeof(double))));
  708. Elt->key = NetKey;
  709. sendDataC(StackN, l);
  710. dropElt();
  711. }
  712. }
  713. int NetDepth(uint32_t k)
  714. {
  715. void * Next;
  716. struct Num * N;
  717. int v=0;
  718. Next = StackN;
  719. while (Next != VIDE) {
  720. N = (struct Num*) Next;
  721. if (N->key == k) v++;
  722. Next = N->n;
  723. }
  724. return v;
  725. }
  726. void NetToStack(int s, uint32_t k)
  727. {
  728. void * Next;
  729. struct Num * N;
  730. uint32_t t, l;
  731. Next = StackN;
  732. while (Next != VIDE) {
  733. N = (struct Num*) Next;
  734. if (N->key == k) {
  735. t = N->t&MSK_T;
  736. l=(sizeof(struct Num)+((t-1)*(sizeof(double))));
  737. sendData(s, Next, l);
  738. }
  739. Next = N->n;
  740. }
  741. }
  742. void IF_show_netStack(uint32_t k)
  743. {
  744. void * Next;
  745. struct Num * N;
  746. Next = StackN;
  747. printf("<bottom of net stack>\n");
  748. while (Next != VIDE) {
  749. N = (struct Num*) Next;
  750. if (k == UNI_KEY) {
  751. printf("<0x%.8lx> ",(long)N->key);
  752. printElt(N,(long)-1);
  753. } else {
  754. if (N->key == k) printElt(N,(long)-1);
  755. }
  756. Next = N->n;
  757. }
  758. printf("<top of net stack> key=0x%lx\n",(long)k);
  759. }
  760. void IF_netDrop(uint32_t k)
  761. {
  762. void * Next, **ANext;
  763. struct Num * N;
  764. Next = StackN;
  765. ANext = _ADDR_STACKN_;
  766. while (Next != VIDE) {
  767. N = (struct Num*) Next;
  768. if (k == N->key) {
  769. *ANext = N->n;
  770. free(Next);
  771. Next = *ANext;
  772. continue;
  773. }
  774. Next = N->n;
  775. ANext = &(N->n);
  776. }
  777. }
  778. /* end of Net functions */
  779. static void IF_fct_2(char O)
  780. {
  781. struct Num *Elt, *Elt2;
  782. long long ConstL, *l1, *l2;
  783. double ConstD, *d1, *d2;
  784. int D1=0, D2=0, T1, T2, i;
  785. int M_C, M_D, M_S; /* Mode Const : 1 ou 0 | Double : 1 ou 0 | Swap : 1 ou 0 */
  786. bool B=TRUE;
  787. _VERIF_STACK_
  788. Elt = (struct Num *)StackN;
  789. T1 = Elt->t&MSK_T;
  790. D1 = Elt->t&MSK_R;
  791. if (Elt->n == VIDE) {
  792. messErr(4);
  793. return;
  794. }
  795. Elt2 = (struct Num *)Elt->n;
  796. T2 = Elt2->t&MSK_T;
  797. D2 = Elt2->t&MSK_R;
  798. /* si 2 tab de dim diff pas possible !! */
  799. if ((T1>1) && (T2>1) && (T1!=T2)) {
  800. messErr(3);
  801. return;
  802. }
  803. M_S = M_C = M_D = 0;
  804. if ((T1>1) && (T2==1)) { /* on swap */
  805. IF_swap();
  806. D1=D2=0;
  807. Elt = (struct Num *)StackN;
  808. T1 = Elt->t&MSK_T;
  809. D1 = Elt->t&MSK_R;
  810. Elt2 = (struct Num *)Elt->n;
  811. T2 = Elt2->t&MSK_T;
  812. D2 = Elt2->t&MSK_R;
  813. M_S=1;
  814. }
  815. if (D1!=D2) { /* on transforme long en double */
  816. if (D2) toDouble(Elt); else toDouble(Elt2);
  817. M_D = 1;
  818. } else if(D1) M_D = 1;
  819. l1 = &Elt->l;
  820. l2 = &Elt2->l;
  821. d1 = &Elt->d;
  822. d2 = &Elt2->d;
  823. if (T1==1) {
  824. M_C=1;
  825. if (M_D) ConstD = *d1;
  826. else ConstL = *l1;
  827. }
  828. /* pour debug
  829. printf("T1=%d T2=%d M_C=%d M_D=%d M_S=%d ",T1,T2,M_C,M_D,M_S);
  830. if (M_C)
  831. if (M_D) printf("ConstD=%g",ConstD); else printf("ConstL=%lld",ConstL);
  832. printf("\n");
  833. *****/
  834. switch(O) {
  835. case '+' :
  836. if (M_C) {
  837. if (M_D) for (i=0;i<T2;i++) *d2++ += ConstD;
  838. else for (i=0;i<T2;i++) *l2++ += ConstL;
  839. } else {
  840. if (M_D) for (i=0;i<T2;i++) *d2++ += *d1++;
  841. else for (i=0;i<T2;i++) *l2++ += *l1++;
  842. }
  843. break;
  844. case '-' :
  845. if (M_C) {
  846. if (M_S) {
  847. if (M_D) for (i=0;i<T2;i++) *d2++ = ConstD - *d2;
  848. else for (i=0;i<T2;i++) *l2++ = ConstL - *l2;
  849. } else {
  850. if (M_D) for (i=0;i<T2;i++) *d2++ -= ConstD;
  851. else for (i=0;i<T2;i++) *l2++ -= ConstL;
  852. }
  853. } else {
  854. if (M_D) for (i=0;i<T2;i++) *d2++ -= *d1++;
  855. else for (i=0;i<T2;i++) *l2++ -= *l1++;
  856. }
  857. break;
  858. case '*' :
  859. if (M_C) {
  860. if (M_D) for (i=0;i<T2;i++) *d2++ *= ConstD;
  861. else for (i=0;i<T2;i++) *l2++ *= ConstL;
  862. } else {
  863. if (M_D) for (i=0;i<T2;i++) *d2++ *= *d1++;
  864. else for (i=0;i<T2;i++) *l2++ *= *l1++;
  865. }
  866. break;
  867. case '/' :
  868. if (M_C) {
  869. if (M_S) {
  870. if (M_D) for (i=0;i<T2;i++) *d2++ = ConstD / *d2;
  871. else for (i=0;i<T2;i++) *l2++ = ConstL / *l2;
  872. } else {
  873. if (M_D) for (i=0;i<T2;i++) *d2++ /= ConstD;
  874. else for (i=0;i<T2;i++) *l2++ /= ConstL;
  875. }
  876. } else {
  877. if (M_D) for (i=0;i<T2;i++) *d2++ /= *d1++;
  878. else for (i=0;i<T2;i++) *l2++ /= *l1++;
  879. }
  880. break;
  881. case 'm' : /* min */
  882. if (M_C) {
  883. if (M_D) for(i=0;i<T2;i++) { if (*d2>ConstD) *d2=ConstD; d2++; }
  884. else for(i=0;i<T2;i++) { if (*l2>ConstL) *l2=ConstL; l2++; }
  885. } else {
  886. if (M_D) for (i=0;i<T2;i++) { if (*d2>*d1) *d2=*d1; d2++; d1++; }
  887. else for (i=0;i<T2;i++) { if (*l2>*l1) *l2=*l1; l2++; l1++; }
  888. }
  889. break;
  890. case 'M' : /* max */
  891. if (M_C) {
  892. if (M_D) for(i=0;i<T2;i++) { if (*d2<ConstD) *d2=ConstD; d2++; }
  893. else for(i=0;i<T2;i++) { if (*l2<ConstL) *l2=ConstL; l2++; }
  894. } else {
  895. if (M_D) for (i=0;i<T2;i++) { if (*d2<*d1) *d2=*d1; d2++; d1++; }
  896. else for (i=0;i<T2;i++) { if (*l2<*l1) *l2=*l1; l2++; l1++; }
  897. }
  898. break;
  899. case '%' : /* modulo */
  900. if (M_C) {
  901. if (M_S) {
  902. if (M_D) for (i=0;i<T2;i++) *d2++ = fmod(ConstD,*d2);
  903. else for (i=0;i<T2;i++) *l2++ = ConstL % *l2;
  904. } else {
  905. if (M_D) for (i=0;i<T2;i++) *d2++ = fmod(*d2,ConstD);
  906. else for (i=0;i<T2;i++) *l2++ %= ConstL;
  907. }
  908. } else {
  909. if (M_D) for (i=0;i<T2;i++) { *d2++ = fmod(*d2,*d1); d1++; }
  910. else for (i=0;i<T2;i++) *l2++ %= *l1++;
  911. }
  912. break;
  913. case '^' : /* puissance */
  914. if (! M_D) { /* passage en double force car + pratique */
  915. toDouble(Elt); toDouble(Elt2);
  916. if (M_C) ConstD=*d1;
  917. }
  918. if (M_C) {
  919. if (M_S) {
  920. for (i=0;i<T2;i++) *d2++ = pow(ConstD,*d2);
  921. } else {
  922. for (i=0;i<T2;i++) *d2++ = pow(*d2,ConstD);
  923. }
  924. } else {
  925. for (i=0;i<T2;i++) { *d2++ = pow(*d2,*d1); d1++; }
  926. }
  927. break;
  928. case '=' : /* test egal */
  929. if (M_C) {
  930. if (M_D) for(i=0;i<T2;i++) {
  931. if (*d2 != ConstD) {B=FALSE; break;} d2++; }
  932. else for (i=0;i<T2;i++) {
  933. if (*l2 != ConstL) {B=FALSE; break;} l2++; }
  934. } else {
  935. if (M_D) for (i=0;i<T2;i++) {
  936. if (*d2 != *d1) {B=FALSE; break;} d1++; d2++; }
  937. else for (i=0;i<T2;i++) {
  938. if (*l2 != *l1) {B=FALSE; break;} l1++; l2++; }
  939. }
  940. putBool(B);
  941. dropElt(); /* suppression des 2 !! */
  942. break;
  943. case '#' : /* test different */
  944. if (M_C) {
  945. if (M_D) for(i=0;i<T2;i++) {
  946. if (*d2 == ConstD) {B=FALSE; break;} d2++; }
  947. else for (i=0;i<T2;i++) {
  948. if (*l2 == ConstL) {B=FALSE; break;} l2++; }
  949. } else {
  950. if (M_D) for (i=0;i<T2;i++) {
  951. if (*d2 == *d1) {B=FALSE; break;} d1++; d2++; }
  952. else for (i=0;i<T2;i++) {
  953. if (*l2 == *l1) {B=FALSE; break;} l1++; l2++; }
  954. }
  955. putBool(B);
  956. dropElt(); /* suppression des 2 !! */
  957. break;
  958. case '<' : /* test inf */
  959. if (M_C) {
  960. if (M_S) {
  961. if (M_D) for(i=0;i<T2;i++) {
  962. if (*d2 < ConstD) {B=FALSE; break;} d2++; }
  963. else for (i=0;i<T2;i++) {
  964. if (*l2 < ConstL) {B=FALSE; break;} l2++; }
  965. } else {
  966. if (M_D) for(i=0;i<T2;i++) {
  967. if (*d2 >= ConstD) {B=FALSE; break;} d2++; }
  968. else for (i=0;i<T2;i++) {
  969. if (*l2 >= ConstL) {B=FALSE; break;} l2++; }
  970. }
  971. } else {
  972. if (M_D) for (i=0;i<T2;i++) {
  973. if (*d2 >= *d1) {B=FALSE; break;} d1++; d2++; }
  974. else for (i=0;i<T2;i++) {
  975. if (*l2 >= *l1) {B=FALSE; break;} l1++; l2++; }
  976. }
  977. putBool(B);
  978. dropElt(); /* suppression des 2 !! */
  979. break;
  980. case '>' : /* test sup */
  981. if (M_C) {
  982. if (M_S) {
  983. if (M_D) for(i=0;i<T2;i++) {
  984. if (*d2 > ConstD) {B=FALSE; break;} d2++; }
  985. else for (i=0;i<T2;i++) {
  986. if (*l2 > ConstL) {B=FALSE; break;} l2++; }
  987. } else {
  988. if (M_D) for(i=0;i<T2;i++) {
  989. if (*d2 <= ConstD) {B=FALSE; break;} d2++; }
  990. else for (i=0;i<T2;i++) {
  991. if (*l2 <= ConstL) {B=FALSE; break;} l2++; }
  992. }
  993. } else {
  994. if (M_D) for (i=0;i<T2;i++) {
  995. if (*d2 <= *d1) {B=FALSE; break;} d1++; d2++; }
  996. else for (i=0;i<T2;i++) {
  997. if (*l2 <= *l1) {B=FALSE; break;} l1++; l2++; }
  998. }
  999. putBool(B);
  1000. dropElt(); /* suppression des 2 !! */
  1001. break;
  1002. case 'i' : /* test inf ou egal */
  1003. if (M_C) {
  1004. if (M_S) {
  1005. if (M_D) for(i=0;i<T2;i++) {
  1006. if (*d2 <= ConstD) {B=FALSE; break;} d2++; }
  1007. else for (i=0;i<T2;i++) {
  1008. if (*l2 <= ConstL) {B=FALSE; break;} l2++; }
  1009. } else {
  1010. if (M_D) for(i=0;i<T2;i++) {
  1011. if (*d2 > ConstD) {B=FALSE; break;} d2++; }
  1012. else for (i=0;i<T2;i++) {
  1013. if (*l2 > ConstL) {B=FALSE; break;} l2++; }
  1014. }
  1015. } else {
  1016. if (M_D) for (i=0;i<T2;i++) {
  1017. if (*d2 > *d1) {B=FALSE; break;} d1++; d2++; }
  1018. else for (i=0;i<T2;i++) {
  1019. if (*l2 > *l1) {B=FALSE; break;} l1++; l2++; }
  1020. }
  1021. putBool(B);
  1022. dropElt(); /* suppression des 2 !! */
  1023. break;
  1024. case 's' : /* test sup ou egal */
  1025. if (M_C) {
  1026. if (M_S) {
  1027. if (M_D) for(i=0;i<T2;i++) {
  1028. if (*d2 >= ConstD) {B=FALSE; break;} d2++; }
  1029. else for (i=0;i<T2;i++) {
  1030. if (*l2 >= ConstL) {B=FALSE; break;} l2++; }
  1031. } else {
  1032. if (M_D) for(i=0;i<T2;i++) {
  1033. if (*d2 < ConstD) {B=FALSE; break;} d2++; }
  1034. else for (i=0;i<T2;i++) {
  1035. if (*l2 < ConstL) {B=FALSE; break;} l2++; }
  1036. }
  1037. } else {
  1038. if (M_D) for (i=0;i<T2;i++) {
  1039. if (*d2 < *d1) {B=FALSE; break;} d1++; d2++; }
  1040. else for (i=0;i<T2;i++) {
  1041. if (*l2 < *l1) {B=FALSE; break;} l1++; l2++; }
  1042. }
  1043. putBool(B);
  1044. dropElt(); /* suppression des 2 !! */
  1045. break;
  1046. default :
  1047. printf("%c : not yet implemented !\n",O);
  1048. break;
  1049. }
  1050. dropElt(); /* suppression du 1er */
  1051. }
  1052. void IF_plus(void) { IF_fct_2('+'); }
  1053. void IF_moins(void) { IF_fct_2('-'); }
  1054. void IF_mult(void) { IF_fct_2('*'); }
  1055. void IF_div(void) { IF_fct_2('/'); }
  1056. void IF_min(void) { IF_fct_2('m'); }
  1057. void IF_max(void) { IF_fct_2('M'); }
  1058. void IF_modulo(void) { IF_fct_2('%'); }
  1059. void IF_puiss(void) { IF_fct_2('^'); }
  1060. void IF_neg(void)
  1061. {
  1062. putLong((long long)-1);
  1063. IF_mult();
  1064. }
  1065. void IF_Legal(void) { IF_fct_2('='); }
  1066. void IF_Ldiff(void) { IF_fct_2('#'); }
  1067. void IF_Lsup(void) { IF_fct_2('>'); }
  1068. void IF_Linf(void) { IF_fct_2('<'); }
  1069. void IF_Lsupeg(void) { IF_fct_2('s'); }
  1070. void IF_Linfeg(void) { IF_fct_2('i'); }
  1071. void IF_fctD_1(double(*f)(double))
  1072. {
  1073. struct Num *Elt;
  1074. uint32_t n;
  1075. long long *L;
  1076. double *D;
  1077. int i;
  1078. _VERIF_STACK_
  1079. Elt = (struct Num *)StackN;
  1080. n = Elt->t&MSK_T;
  1081. if (Elt->t&MSK_R) { /* double */
  1082. D = &(Elt->d);
  1083. for(i=0;i<n;i++) *D++ = f(*D);
  1084. } else {
  1085. D = &(Elt->d);
  1086. L = &(Elt->l);
  1087. for(i=0;i<n;i++) *D++ = f((double)*L++);
  1088. Elt->t = Elt->t | MSK_R;
  1089. }
  1090. }
  1091. void IF_fctB_1(long long (*f1)(long long), double(*f2)(double))
  1092. {
  1093. struct Num *Elt;
  1094. uint32_t n;
  1095. long long *L;
  1096. double *D;
  1097. int i;
  1098. _VERIF_STACK_
  1099. Elt = (struct Num *)StackN;
  1100. n = Elt->t&MSK_T;
  1101. if (Elt->t&MSK_R) { /* double */
  1102. D = &(Elt->d);
  1103. for(i=0;i<n;i++) *D++ = f2(*D);
  1104. } else {
  1105. L = &(Elt->l);
  1106. for(i=0;i<n;i++) *L++ = f1(*L);
  1107. }
  1108. }
  1109. void IF_fctD_1L(long long(*f)(double))
  1110. {
  1111. struct Num *Elt;
  1112. uint32_t n;
  1113. long long *L;
  1114. double *D;
  1115. int i;
  1116. _VERIF_STACK_
  1117. Elt = (struct Num *)StackN;
  1118. n = Elt->t&MSK_T;
  1119. if (Elt->t&MSK_R) { /* double */
  1120. D = &(Elt->d);
  1121. L = &(Elt->l);
  1122. for(i=0;i<n;i++) *L++ = f(*D++);
  1123. Elt->t = Elt->t & ~MSK_R; /* change type */
  1124. }
  1125. /* rien si long */
  1126. }
  1127. void IF_fctD_1LB(long long(*f)(double))
  1128. {
  1129. struct Num *Elt;
  1130. uint32_t n;
  1131. long long *L;
  1132. double *D;
  1133. int i;
  1134. _VERIF_STACK_
  1135. Elt = (struct Num *)StackN;
  1136. n = Elt->t&MSK_T;
  1137. D = &(Elt->d);
  1138. L = &(Elt->l);
  1139. if (Elt->t&MSK_R) { /* double */
  1140. for(i=0;i<n;i++) *L++ = f(*D++);
  1141. Elt->t = Elt->t & ~MSK_R; /* change type */
  1142. } else {
  1143. for(i=0;i<n;i++) *L++ = f(*L);
  1144. }
  1145. }
  1146. void IF_inFile_1d(FILE * fd, char delim, int virg)
  1147. {
  1148. struct Num *Elt;
  1149. uint32_t n;
  1150. long long *L;
  1151. double *D;
  1152. int i;
  1153. char buf[40], *pt;
  1154. _VERIF_STACK_
  1155. Elt = (struct Num *)StackN;
  1156. n = Elt->t&MSK_T;
  1157. if (Elt->t&MSK_R) { /* double */
  1158. D = &(Elt->d);
  1159. for(i=0;i<n;i++) {
  1160. sprintf(buf,"%.15f%c",*D++,delim);
  1161. pt = buf + strlen(buf) - 2;
  1162. while (*pt == '0') pt--;
  1163. pt++;
  1164. *pt++ = delim;
  1165. *pt='\0';
  1166. if (virg)
  1167. if ((pt = strchr(buf, (int)'.')) != NULL) *pt = ',';
  1168. fprintf(fd,buf);
  1169. }
  1170. } else {
  1171. L = &(Elt->l);
  1172. for(i=0;i<n;i++) fprintf(fd,"%lld%c",*L++,delim);
  1173. }
  1174. fprintf(fd,"\n");
  1175. dropElt(); /* suppression */
  1176. }
  1177. void IF_inFile_1(FILE * fd)
  1178. {
  1179. struct Num *Elt;
  1180. uint32_t n;
  1181. long long *L;
  1182. double *D;
  1183. int i;
  1184. _VERIF_STACK_
  1185. Elt = (struct Num *)StackN;
  1186. n = Elt->t&MSK_T;
  1187. if (Elt->t&MSK_R) { /* double */
  1188. D = &(Elt->d);
  1189. for(i=0;i<n;i++) fprintf(fd,"%d %g\n",i,*D++);
  1190. } else {
  1191. L = &(Elt->l);
  1192. for(i=0;i<n;i++) fprintf(fd,"%d %lld\n",i,*L++);
  1193. }
  1194. }
  1195. void IF_inFile_2(FILE * fd)
  1196. {
  1197. struct Num *Elt, *Elt2;
  1198. uint32_t n, n2;
  1199. long long *L, *L2;
  1200. double *D, *D2;
  1201. int i;
  1202. _VERIF_STACK_
  1203. Elt = (struct Num *)StackN;
  1204. n = Elt->t&MSK_T;
  1205. Elt2 = Elt->n;
  1206. n2 = Elt2->t&MSK_T;
  1207. if (n>n2) n=n2;
  1208. if (Elt->t&MSK_R) { /* double */
  1209. D = &(Elt->d);
  1210. if (Elt2->t&MSK_R) { /* double */
  1211. D2 = &(Elt2->d);
  1212. for(i=0;i<n;i++) fprintf(fd,"%g %g\n",*D2++,*D++);
  1213. } else {
  1214. L2 = &(Elt2->l);
  1215. for(i=0;i<n;i++) fprintf(fd,"%lld %g\n",*L2++,*D++);
  1216. }
  1217. } else {
  1218. L = &(Elt->l);
  1219. if (Elt2->t&MSK_R) { /* double */
  1220. D2 = &(Elt2->d);
  1221. for(i=0;i<n;i++) fprintf(fd,"%g %lld\n",*D2++,*L++);
  1222. } else {
  1223. L2 = &(Elt2->l);
  1224. for(i=0;i<n;i++) fprintf(fd,"%lld %lld\n",*L2++,*L++);
  1225. }
  1226. }
  1227. }
  1228. static int dimTab(void * A)
  1229. {
  1230. struct Num *N;
  1231. uint32_t l;
  1232. if (A==VIDE) return 0L;
  1233. N = (struct Num*)A;
  1234. l = N->t&MSK_T;
  1235. return (int)l;
  1236. }
  1237. static long transLongTo(long long * C)
  1238. {
  1239. struct Num *Elt;
  1240. int i;
  1241. uint32_t l;
  1242. long long *L;
  1243. double *D;
  1244. Elt = (struct Num *)StackN;
  1245. l = Elt->t&MSK_T;
  1246. L = &(Elt->l)+l-1;
  1247. D = &(Elt->d)+l-1;
  1248. if (Elt->t & MSK_R)
  1249. for (i=0;i<l;i++) *C--=(long long)*D--;
  1250. else
  1251. for (i=0;i<l;i++) *C--=*L--;
  1252. dropElt();
  1253. return(l);
  1254. }
  1255. static long transDoubTo(double * C)
  1256. {
  1257. struct Num *Elt;
  1258. int i;
  1259. uint32_t l;
  1260. long long *L;
  1261. double *D;
  1262. Elt = (struct Num *)StackN;
  1263. l = Elt->t&MSK_T;
  1264. L = &(Elt->l)+l-1;
  1265. D = &(Elt->d)+l-1;
  1266. if (Elt->t & MSK_R)
  1267. for (i=0;i<l;i++) *C--=*D--;
  1268. else
  1269. for (i=0;i<l;i++) *C--=(double)*L--;
  1270. dropElt();
  1271. return(l);
  1272. }
  1273. void IF_toArray( void )
  1274. {
  1275. uint32_t n, i, l, T, t;
  1276. long long *L;
  1277. double *D;
  1278. void * M;
  1279. struct Num *N;
  1280. _VERIF_STACK_
  1281. if (!isScalar()) {
  1282. messErr(36); return;
  1283. }
  1284. n = (uint32_t)getVal();
  1285. dropElt();
  1286. if (n>1) {
  1287. i = nbSizeTypeOnStack(n,&t);
  1288. if (i<n) messErr(4);
  1289. else {
  1290. T = t & MSK_T;
  1291. if ((M = malloc(sizeof(struct Num)+((T-1)*(sizeof(double))))) == NULL)
  1292. stopErr("IF_toArray","malloc");
  1293. N = (struct Num*)M;
  1294. N->t = t;
  1295. if (t & MSK_R) {
  1296. D = &(N->d)+(T-1);
  1297. for(i=0;i<n;i++) { l=transDoubTo(D); D -= l; }
  1298. } else {
  1299. L = &(N->l)+(T-1);
  1300. for(i=0;i<n;i++) { l=transLongTo(L); L -= l; }
  1301. }
  1302. /* on the stack */
  1303. N->n = StackN;
  1304. _MODIF_STACKN_(M);
  1305. }
  1306. } else messErr(30);
  1307. }
  1308. static void toScalar( int s )
  1309. {
  1310. struct Num *Elt;
  1311. uint32_t l;
  1312. int i;
  1313. double *D;
  1314. long long * L;
  1315. _VERIF_STACK_
  1316. Elt = (struct Num *)StackN;
  1317. l = Elt->t&MSK_T;
  1318. if (l==1) return;
  1319. _MODIF_STACKN_(Elt->n); /* depile */
  1320. if (s) {
  1321. L = &(Elt->l);
  1322. D = &(Elt->d);
  1323. if (Elt->t & MSK_R)
  1324. for(i=0;i<l;i++) putDouble(*D++);
  1325. else
  1326. for(i=0;i<l;i++) putLong(*L++);
  1327. } else {
  1328. L = &(Elt->l)+l-1;
  1329. D = &(Elt->d)+l-1;
  1330. if (Elt->t & MSK_R)
  1331. for(i=0;i<l;i++) putDouble(*D--);
  1332. else
  1333. for(i=0;i<l;i++) putLong(*L--);
  1334. }
  1335. if (!(Elt->t&MSK_V)) free((void*)Elt);
  1336. }
  1337. void IF_toScalar( void )
  1338. {
  1339. toScalar(1);
  1340. }
  1341. void IF_toScalarR( void )
  1342. {
  1343. toScalar(0);
  1344. }
  1345. static void tabShift(void **A,long s)
  1346. {
  1347. struct Num *Elt, *NElt;
  1348. void * M;
  1349. long j, k;
  1350. uint32_t l;
  1351. long long *L, *NL;
  1352. _VERIF_STACK_
  1353. Elt = (struct Num *)*A;
  1354. l = Elt->t&MSK_T;
  1355. if (l==1) return;
  1356. if (s>0)
  1357. while (s>=l) s-=l;
  1358. else while (-s>=l) s+=l;
  1359. if (s==0) return;
  1360. if (s>0) j=s;
  1361. else j=l+s;
  1362. k = sizeof(struct Num)+((l-1)*(sizeof(double)));
  1363. if ((M = malloc(k)) == NULL) stopErr("tabShift","malloc");
  1364. NElt = (struct Num *)M;
  1365. *A = M;
  1366. NElt->t = Elt->t;
  1367. NElt->n = Elt->n;
  1368. L = &(Elt->l);
  1369. NL = &(NElt->l);
  1370. k=l-j;
  1371. bcopy((void*)&L[0],(void*)&NL[j],k*sizeof(long long));
  1372. bcopy((void*)&L[k],(void*)&NL[0],j*sizeof(long long));
  1373. if (!(Elt->t&MSK_V)) free((void*)Elt);
  1374. }
  1375. void IF_TShiftR( void )
  1376. {
  1377. tabShift(_ADDR_STACKN_,1);
  1378. }
  1379. void IF_TShiftL( void )
  1380. {
  1381. tabShift(_ADDR_STACKN_,-1);
  1382. }
  1383. static void nTabShift( int v )
  1384. {
  1385. void ** ANext;
  1386. struct Num * N;
  1387. long i=0, n;
  1388. _VERIF_STACK_
  1389. if (!isScalar()) {
  1390. messErr(36); return;
  1391. }
  1392. n = (long)getVal();
  1393. dropElt();
  1394. if (n>0) {
  1395. ANext = _ADDR_STACKN_;
  1396. while (*ANext != VIDE) {
  1397. tabShift(ANext,v);
  1398. N = (struct Num*) *ANext;
  1399. ANext = &(N->n);
  1400. i++;
  1401. if (i==n) break;
  1402. }
  1403. } else messErr(29);
  1404. }
  1405. void IF_NTShiftR( void )
  1406. {
  1407. nTabShift(1);
  1408. }
  1409. void IF_NTShiftL( void )
  1410. {
  1411. nTabShift(-1);
  1412. }
  1413. void IF_TNShiftR( void )
  1414. {
  1415. long n;
  1416. _VERIF_STACK_
  1417. if (!isScalar()) {
  1418. messErr(36); return;
  1419. }
  1420. n = (long)getVal();
  1421. dropElt();
  1422. tabShift(_ADDR_STACKN_,n);
  1423. }
  1424. void IF_TNShiftL( void )
  1425. {
  1426. long n;
  1427. _VERIF_STACK_
  1428. if (!isScalar()) {
  1429. messErr(36); return;
  1430. }
  1431. n = (long)getVal();
  1432. dropElt();
  1433. tabShift(_ADDR_STACKN_,-n);
  1434. }
  1435. static void nTNShift( int s )
  1436. {
  1437. long n;
  1438. _VERIF_STACK_
  1439. if (!isScalar()) {
  1440. messErr(36); return;
  1441. }
  1442. n = (long)getVal();
  1443. dropElt();
  1444. nTabShift(n*s);
  1445. }
  1446. void IF_NTNShiftR( void )
  1447. {
  1448. nTNShift(1);
  1449. }
  1450. void IF_NTNShiftL( void )
  1451. {
  1452. nTNShift(-1);
  1453. }
  1454. static void subTab(void **pA , long n, char r) /* r=1 : right else left */
  1455. {
  1456. struct Num *Elt, *Elt2;
  1457. uint32_t l;
  1458. long k;
  1459. long long *L, *Lf;
  1460. void *A, * M;
  1461. double *D, *Df;
  1462. _VERIF_STACK_
  1463. A = *pA;
  1464. Elt = (struct Num *)A;
  1465. l = Elt->t&MSK_T;
  1466. if (l==n) return;
  1467. k = sizeof(struct Num)+((n-1)*(sizeof(long long)));
  1468. if ((M = malloc(k)) == NULL) stopErr("subTab","malloc");
  1469. Elt2 = (struct Num *)M;
  1470. Elt2->n = Elt->n;
  1471. Elt2->t = (Elt->t&MSK_R) | n;
  1472. *pA = M;
  1473. if (n<l) {
  1474. L = &(Elt->l);
  1475. if (r) L += (l-n);
  1476. bcopy((void*)L,(void*)&(Elt2->l),n*sizeof(long long));
  1477. } else { /* fill with zero */
  1478. L = &(Elt2->l);
  1479. if (!r) L += (n-l);
  1480. bcopy((void*)&(Elt->l),(void*)L,l*sizeof(long long));
  1481. if (Elt->t&MSK_R) {
  1482. D = &(Elt2->d);
  1483. if (r) D += l;
  1484. Df = D + (n-l);
  1485. while (D < Df) *D++ = (double)0;
  1486. } else {
  1487. L = &(Elt2->l);
  1488. if (r) L += l;
  1489. Lf = L + (n-l);
  1490. while (L < Lf) *L++ = 0L;
  1491. }
  1492. }
  1493. if (!(Elt->t&MSK_V)) free(A);
  1494. }
  1495. void IF_subTab(void)
  1496. {
  1497. long n;
  1498. _VERIF_STACK_
  1499. if (!isScalar()) {
  1500. messErr(36); return;
  1501. }
  1502. n = (long)getVal();
  1503. dropElt();
  1504. if (n>0) subTab(_ADDR_STACKN_, n, 0);
  1505. else messErr(29);
  1506. }
  1507. void IF_subTabR(void)
  1508. {
  1509. long n;
  1510. _VERIF_STACK_
  1511. if (!isScalar()) {
  1512. messErr(36); return;
  1513. }
  1514. n = (long)getVal();
  1515. dropElt();
  1516. if (n>0) subTab(_ADDR_STACKN_, n, (char)1);
  1517. else messErr(29);
  1518. }
  1519. static void NSubTab( char r )
  1520. {
  1521. void **pNext;
  1522. struct Num * N;
  1523. long i=0, n, l;
  1524. _VERIF_STACK_
  1525. if (!isScalar()) {
  1526. messErr(36); return;
  1527. }
  1528. l = (long)getVal();
  1529. dropElt();
  1530. if (l>0) {
  1531. if (!isScalar()) {
  1532. messErr(36); return;
  1533. }
  1534. n = (long)getVal();
  1535. dropElt();
  1536. if (n>0) {
  1537. pNext = _ADDR_STACKN_;
  1538. while (*pNext != VIDE) {
  1539. subTab(pNext,l,r);
  1540. N = (struct Num*) *pNext;
  1541. pNext = &(N->n);
  1542. i++;
  1543. if (i==n) break;
  1544. }
  1545. } else messErr(29);
  1546. } else messErr(29);
  1547. }
  1548. void IF_NsubTab(void)
  1549. {
  1550. NSubTab((char)0);
  1551. }
  1552. void IF_NsubTabR(void)
  1553. {
  1554. NSubTab((char)1);
  1555. }
  1556. static void tabRev( void* A )
  1557. {
  1558. struct Num *Elt;
  1559. uint32_t l;
  1560. double *D, *FD, vD;
  1561. long long * L, *FL, vL;
  1562. _VERIF_STACK_
  1563. Elt = (struct Num *)A;
  1564. l = Elt->t&MSK_T;
  1565. if (l==1) return;
  1566. if (Elt->t & MSK_R) {
  1567. D = &(Elt->d);
  1568. FD = D+l-1;
  1569. while (D<FD) {
  1570. vD=*D; *D=*FD; *FD=vD;
  1571. D++; FD--;
  1572. }
  1573. } else {
  1574. L = &(Elt->l);
  1575. FL=L+l-1;
  1576. while (L<FL) {
  1577. vL=*L; *L=*FL; *FL=vL;
  1578. L++; FL--;
  1579. }
  1580. }
  1581. }
  1582. void IF_TabRev( void )
  1583. {
  1584. tabRev(StackN);
  1585. }
  1586. void IF_NTabRev( void )
  1587. {
  1588. void * Next;
  1589. struct Num * N;
  1590. long i=0, n;
  1591. _VERIF_STACK_
  1592. if (!isScalar()) {
  1593. messErr(36); return;
  1594. }
  1595. n = (long)getVal();
  1596. dropElt();
  1597. if (n>0) {
  1598. Next = StackN;
  1599. while (Next != VIDE) {
  1600. N = (struct Num*) Next;
  1601. tabRev(Next);
  1602. Next = N->n;
  1603. i++;
  1604. if (i==n) break;
  1605. }
  1606. } else messErr(29);
  1607. }
  1608. static void tabTransp (int sens)
  1609. {
  1610. void * Next, *Next2, **Suiv, *SNext, **Last;
  1611. struct Num * N, *N2;
  1612. long i=0, j, n;
  1613. uint32_t l;
  1614. short Doub=0;
  1615. double *D, *D2;
  1616. long long *L, *L2;
  1617. _VERIF_STACK_
  1618. if (!isScalar()) {
  1619. messErr(36); return;
  1620. }
  1621. n = (long)getVal();
  1622. dropElt();
  1623. if (n>0) {
  1624. if (n==1) {
  1625. if (sens) toScalar(1);
  1626. else toScalar(0);
  1627. return;
  1628. }
  1629. /* the n elts on stack must have the same dim */
  1630. Next = StackN;
  1631. while (Next != VIDE) {
  1632. N = (struct Num*) Next;
  1633. if (i) {
  1634. if (l != (N->t&MSK_T)) break;
  1635. } else l = N->t&MSK_T;
  1636. if (N->t&MSK_R) Doub=1;
  1637. i++;
  1638. if (i==n) break;
  1639. Next = N->n;
  1640. }
  1641. if (i!=n) {
  1642. if (Next == VIDE) messErr(4);
  1643. else messErr(3);
  1644. } else {
  1645. /* make l elts of dim n */
  1646. Suiv = &Next2;
  1647. for (i=0;i<l;i++) {
  1648. if ((*Suiv=malloc(sizeof(struct Num)+((n-1)*(sizeof(double)))))==NULL)
  1649. stopErr("tabTransp","malloc");
  1650. N2 = (struct Num*) *Suiv;
  1651. N2->t = n;
  1652. if (Doub) N2->t |= MSK_R;
  1653. /* remplissage */
  1654. if (sens) {
  1655. j=0;
  1656. if (sens==1) {
  1657. N2->n = SNext;
  1658. SNext = Next2;
  1659. if (i==0) Last = &(N2->n);
  1660. } else
  1661. Suiv = &N2->n;
  1662. } else {
  1663. j=n-1;
  1664. Suiv = &N2->n;
  1665. }
  1666. if (Doub) {
  1667. D2 = &(N2->d);
  1668. } else {
  1669. L2 = &(N2->l);
  1670. }
  1671. Next = StackN;
  1672. while (Next != VIDE) {
  1673. N = (struct Num*) Next;
  1674. if (Doub) {
  1675. if (N->t&MSK_R) {
  1676. D = &(N->d);
  1677. if (sens) D+=(l-i-1);
  1678. else D+=i;
  1679. *(D2+j) = *D;
  1680. } else {
  1681. L = &(N->l);
  1682. if (sens) L+=(l-i-1);
  1683. else L+=i;
  1684. *(D2+j) = (double)*L;
  1685. }
  1686. } else {
  1687. L = &(N->l);
  1688. if (sens) L+=(l-i-1);
  1689. else L+=i;
  1690. *(L2+j) = *L;
  1691. /* printf("%ld ",*L); */
  1692. }
  1693. if (sens) {
  1694. j++;
  1695. if (j>=n) break;
  1696. } else {
  1697. j--;
  1698. if (j<0) break;
  1699. }
  1700. Next = N->n;
  1701. }
  1702. /* printf("\n"); */
  1703. }
  1704. if (sens!=1) Last = &(N2->n);
  1705. /* drop n elts */
  1706. for (i=0;i<n;i++) dropElt();
  1707. /* put new elts on the stack */
  1708. *Last = StackN;
  1709. _MODIF_STACKN_(Next2);
  1710. }
  1711. } else messErr(29);
  1712. }
  1713. void IF_TabTransp (void) /* crot */
  1714. {
  1715. tabTransp(0);
  1716. }
  1717. void IF_TabTranspN (void) /* transpose */
  1718. {
  1719. tabTransp(1);
  1720. }
  1721. void IF_TabTranspT (void) /* trot */
  1722. {
  1723. tabTransp(-1);
  1724. }
  1725. int is1Tab(void)
  1726. {
  1727. if (dimTab(StackN) < 2L) return 0;
  1728. return 1;
  1729. }
  1730. int is2Tab(void)
  1731. {
  1732. struct Num *N;
  1733. if (dimTab(StackN) < 2L) return 0;
  1734. N = (struct Num*)StackN;
  1735. if (dimTab(N->n) < 2L) return 0;
  1736. return 1;
  1737. }
  1738. int isNTabSameDim(int n)
  1739. {
  1740. void * Next;
  1741. struct Num * N;
  1742. long i=0;
  1743. uint32_t l;
  1744. /* the n elts on stack must have the same dim */
  1745. Next = StackN;
  1746. while (Next != VIDE) {
  1747. N = (struct Num*) Next;
  1748. if (i) {
  1749. if (l != (long)(N->t&MSK_T)) break;
  1750. } else l = N->t&MSK_T;
  1751. i++;
  1752. if (i==n) return 1; /* OK */
  1753. Next = N->n;
  1754. }
  1755. return 0;
  1756. }
  1757. /* []functions ****/
  1758. static void TAB_Fct(char C)
  1759. {
  1760. struct Num *Elt;
  1761. uint32_t n;
  1762. long long *L, L1, L2;
  1763. double *D, D1, D2;
  1764. int i;
  1765. _VERIF_STACK_
  1766. Elt = (struct Num *)StackN;
  1767. n = Elt->t&MSK_T;
  1768. if (n>1) {
  1769. if (Elt->t&MSK_R) { /* double */
  1770. switch(C) {
  1771. case 'm' :
  1772. D1 = Elt->d;
  1773. D = &(Elt->d)+1;
  1774. for(i=1;i<n;i++) { if (*D<D1) D1=*D; D++; }
  1775. putDouble(D1);
  1776. break;
  1777. case 'M' :
  1778. D1 = Elt->d;
  1779. D = &(Elt->d)+1;
  1780. for(i=1;i<n;i++) { if (*D>D1) D1=*D; D++; }
  1781. putDouble(D1);
  1782. break;
  1783. case '+' :
  1784. D1 = Elt->d;
  1785. D = &(Elt->d)+1;
  1786. for(i=1;i<n;i++) D1 += *D++;
  1787. putDouble(D1);
  1788. break;
  1789. case '*' :
  1790. D1 = Elt->d;
  1791. D = &(Elt->d)+1;
  1792. for(i=1;i<n;i++) D1 *= *D++;
  1793. putDouble(D1);
  1794. break;
  1795. default : /* E = extrems */
  1796. D1 = D2 = Elt->d;
  1797. D = &(Elt->d)+1;
  1798. for(i=1;i<n;i++) {
  1799. if (*D>D2) D2=*D;
  1800. if (*D<D1) D1=*D; D++;
  1801. }
  1802. putDouble(D1);
  1803. IF_swap();
  1804. putDouble(D2);
  1805. break;
  1806. }
  1807. } else {
  1808. switch(C) {
  1809. case 'm' :
  1810. L1 = Elt->l;
  1811. L = &(Elt->l)+1;
  1812. for(i=1;i<n;i++) { if (*L<L1) L1=*L; L++; }
  1813. putLong(L1);
  1814. break;
  1815. case 'M' :
  1816. L1 = Elt->l;
  1817. L = &(Elt->l)+1;
  1818. for(i=1;i<n;i++) { if (*L>L1) L1=*L; L++; }
  1819. putLong(L1);
  1820. break;
  1821. case '+' :
  1822. L1 = Elt->l;
  1823. L = &(Elt->l)+1;
  1824. for(i=1;i<n;i++) L1 += *L++;
  1825. putLong(L1);
  1826. break;
  1827. case '*' :
  1828. L1 = Elt->l;
  1829. L = &(Elt->l)+1;
  1830. for(i=1;i<n;i++) L1 *= *L++;
  1831. putLong(L1);
  1832. break;
  1833. default : /* E = extrems */
  1834. L1 = L2 = Elt->l;
  1835. L = &(Elt->l)+1;
  1836. for(i=1;i<n;i++) {
  1837. if (*L>L2) L2=*L;
  1838. if (*L<L1) L1=*L; L++;
  1839. }
  1840. putLong(L1);
  1841. IF_swap();
  1842. putLong(L2);
  1843. break;
  1844. }
  1845. }
  1846. IF_swap();
  1847. dropElt();
  1848. } else messErr(12);
  1849. }
  1850. void IF_TABMin(void) { TAB_Fct('m'); }
  1851. void IF_TABMax(void) { TAB_Fct('M'); }
  1852. void IF_TABProd(void) { TAB_Fct('*'); }
  1853. void IF_TABSum(void) { TAB_Fct('+'); }
  1854. void IF_TABMinMax(void) { TAB_Fct('E'); }
  1855. #define LENT 20
  1856. void dump_eltN(int fd, void *A, uint32_t MSK)
  1857. {
  1858. struct Num * N;
  1859. long l;
  1860. long long v;
  1861. uint32_t t;
  1862. N = (struct Num*)A;
  1863. t = N->t;
  1864. if ((MSK) && (t & MSK_V)) {
  1865. v = (long long)iVarByAddrA(A);
  1866. t = 1 | MSK_V;
  1867. write(fd, (void*)&t, sizeof(t));
  1868. write(fd, (void*)&v, sizeof(v));
  1869. } else {
  1870. /* t &= ~MSK_V; */
  1871. write(fd, (void*)&t, sizeof(t));
  1872. l = t & MSK_T;
  1873. write(fd, (void*)&(N->l), (size_t)(l*sizeof(double)));
  1874. }
  1875. }
  1876. static int NbARIV;
  1877. void restore_links_stackN(void)
  1878. {
  1879. void **ANext, *A;
  1880. struct Num * N, *T;
  1881. if (NbARIV == 0) return;
  1882. ANext = &StackN;
  1883. while (*ANext != VIDE) {
  1884. N = (struct Num*) *ANext;
  1885. if (N->t & MSK_V) {
  1886. A = varAddrAByInd(N->l);
  1887. T = (struct Num*) A;
  1888. T->n = N->n;
  1889. *ANext = A;
  1890. free((void*)N);
  1891. }
  1892. ANext = &(N->n);
  1893. }
  1894. rest_links_pr(NbARIV, "variable", "numerical");
  1895. }
  1896. void dump_stackN(int fd)
  1897. {
  1898. void * Next;
  1899. struct Num * N;
  1900. uint32_t n=0;
  1901. int i,j;
  1902. Next = StackN;
  1903. while (Next != VIDE) {
  1904. N = (struct Num*) Next;
  1905. n++;
  1906. Next = N->n;
  1907. }
  1908. write(fd, (void*)&n, sizeof(n));
  1909. for (i=n; i>0; i--) {
  1910. Next = StackN;
  1911. j=0;
  1912. while (Next != VIDE) {
  1913. N = (struct Num*) Next;
  1914. j++;
  1915. if (i==j) break;
  1916. Next = N->n;
  1917. }
  1918. dump_eltN(fd, Next, MSK_V);
  1919. }
  1920. dump_rest_pr(0,n,"numerical");
  1921. }
  1922. static void * restore_eltN_l(int fd, int K)
  1923. {
  1924. uint32_t t, u;
  1925. int s;
  1926. void * M;
  1927. struct Num * N;
  1928. read(fd, (void*)&t, sizeof(t));
  1929. u = t & MSK_T;
  1930. if ((t & MSK_V) && K) NbARIV++;
  1931. /* printf("%u : %d\n", u, NbARIV); /* debug */
  1932. s = sizeof(struct Num)+((u-1)*(sizeof(double)));
  1933. if ((M = malloc(s)) == NULL) stopErr("restore_eltN","malloc");
  1934. N = (struct Num*)M;
  1935. N->t = t;
  1936. N->n = StackN;
  1937. read(fd, (void*)&(N->l), u*sizeof(double));
  1938. return M;
  1939. }
  1940. void * restore_eltN(int fd)
  1941. {
  1942. return restore_eltN_l(fd,0);
  1943. }
  1944. void restore_stackN(int fd)
  1945. {
  1946. uint32_t n=0, i;
  1947. void * M;
  1948. NbARIV = 0;
  1949. if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return;
  1950. IF_stack_clear();
  1951. for (i=0; i<n; i++) {
  1952. M = restore_eltN_l(fd,1);
  1953. _MODIF_STACKN_(M);
  1954. }
  1955. dump_rest_pr(1,n,"numerical");
  1956. }
  1957. /* gestion des meta-stacks */
  1958. void IF_new_stackN(void)
  1959. {
  1960. if (G_i_TStackN == LSTACKS) {
  1961. messErr(60); return;
  1962. }
  1963. G_TStackN[G_i_TStackN++] = StackN;
  1964. StackN = G_TStackN[G_i_TStackN];
  1965. }
  1966. void IF_old_stackN(void)
  1967. {
  1968. if (G_i_TStackN == 0) {
  1969. messErr(61); return;
  1970. }
  1971. G_TStackN[G_i_TStackN--] = StackN;
  1972. StackN = G_TStackN[G_i_TStackN];
  1973. }
  1974. void IF_show_TStacks(void)
  1975. {
  1976. printf("Indices of meta-stacks :\n");
  1977. printf("Numerical stack = %d\n",G_i_TStackN+1);
  1978. printf("Character stack = %d\n",G_i_TStackC+1);
  1979. printf("Logical stack = %d\n",G_i_TStackL+1);
  1980. }