This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
Typedefs | |
| typedef int | logical |
Functions | |
| logical | Istrue (int n) |
| int C2F() | run (void) |
| int C2F() | adjustrhs (void) |
| int C2F() adjustrhs | ( | void | ) |
Definition at line 1343 of file run.c.
References C2F, nsiz, Pt, and Rhs.
Referenced by run().
01344 { 01345 /* to adjust rhs in the case it is only fixed at run time example 01346 * l=list(....); foo(a,l(2:3)). the parser supposes that the rhs 01347 * for foo is 2. at run time it is really 3. See begrhs. 01348 * Copyright INRIA 01349 * Author S. Steer 01350 */ 01351 static int *Ids = C2F(recu).ids-nsiz-1; 01352 static int *Rstk = C2F(recu).rstk-1; 01353 static int *Pstk = C2F(recu).pstk-1; 01354 01355 if (Rstk[Pt] == 617) { 01356 Rhs += Pstk[Pt]; 01357 --Pt; 01358 } else if (Rstk[Pt] == 501) { 01359 /* retained for 2.4.1 compatiblity */ 01360 Rhs += Ids[5 + Pt * nsiz]; 01361 Ids[5 + Pt * nsiz] = 0; 01362 } 01363 return 0; 01364 }
Here is the caller graph for this function:

| int C2F() run | ( | void | ) |
Definition at line 94 of file run.c.
References abs, adjustrhs(), basbrk, basout(), bexec(), Bot, bptlg, buf, C2F, c__0, c__1, checkevts(), clunit(), createref1(), cremat(), cresmat(), cvname(), ddt, defmat(), Eptover(), eqid(), equal, Err, err1, err2, errpt, extrac, FALSE_, fin, fun, funs(), getendian(), getmen(), getsimat(), gettype(), i2, icopy(), idstk, ierr, ifin, iflag, ifun, Infstk, insert, interruptible, ip, ir, isafunptr(), ismenu(), Istrue(), ix, j, L, lc, lgptrs, Lhs, lr, Lstk, m, macnms, max, mkindx(), mode, Msgs(), n, name2var(), nc, nentry, nextj(), niv, nlr, nmacs, nsiz, objvide(), ok, op, p, print(), prompt, Pt, Ptover(), putid(), ref2val(), Rhs, rio, rte, SciError(), scilab_timer_check(), sciquit(), semi, stackg(), stackp(), sxevents(), t, Top, TRUE_, varfunptr(), vcopyobj(), and x.
00095 { 00096 /* Initialized data */ 00097 /* Fortran common data equivalence */ 00098 static int *Ids = C2F(recu).ids-nsiz-1; 00099 static int *Rstk = C2F(recu).rstk-1; 00100 static int *Pstk = C2F(recu).pstk-1; 00101 static int *Lstk = C2F(vstk).lstk-1; 00102 static int *Lin = C2F(iop).lin-1; 00103 static int *Lpt = C2F(iop).lpt-1; 00104 static int *Lct = C2F(iop).lct-1; 00105 static double *Stk = C2F(stack).Stk-1; 00106 static int *Istk = (int *)( C2F(stack).Stk)-1; 00107 static int *Infstk = C2F(vstk).infstk-1; 00108 00109 static double equiv_4[1]; 00110 #define x (equiv_4) 00111 #define ix ((int *)equiv_4) 00112 00113 /* Local variables */ 00114 static int ifin, iesc, ibpt, tref, ifun; 00115 static int ierr, ndel; 00116 static int j, k, m, n, p, r, t; 00117 static int lname, imode; 00118 static int l0; 00119 static int id[6], lc, kc, nc, lb, li, il, io, ip; 00120 static logical ok; 00121 static int ir, lr, op; 00122 static int inxsci; 00123 static int mm1; 00124 static int nn1; 00125 static int nentry, lastindpos; 00126 static int lcc, kid, nlr; 00127 int i2; 00128 00129 static char tmp[80]; 00130 00131 tref = 0; 00132 C2F(checkevts)(&inxsci); 00133 if (C2F(iop).ddt == 4) { 00134 sprintf(tmp," run pt:%d rstk(pt):%d",Pt,Rstk[Pt]); 00135 C2F(basout)(&io, &C2F(iop).wte,tmp, strlen(tmp)); 00136 } 00137 00138 l0 = 0; 00139 nc = 0; 00140 00141 if (Ptover(0)) { 00142 return 0; 00143 } 00144 00145 r = Rstk[Pt]; 00146 ir = r / 100; 00147 if (ir != 6) { 00148 goto L1; 00149 } 00150 switch ((int)(r - 600)) { 00151 case 1: goto L33; 00152 case 2: goto L66; 00153 case 3: goto L82; 00154 case 4: goto L92; 00155 case 5: goto L58; 00156 case 6: goto L116; 00157 case 7: goto L250; 00158 case 8: /*Rstk[Pt]=1101;*/ goto L254; 00159 case 9: /*Rstk[Pt]=1101;*/ goto L240; 00160 00161 } 00162 00163 00164 L1: /* Start execution of a "compiled" function */ 00165 tref = clock(); 00166 C2F(errgst).toperr = Top; 00167 k = Lpt[1] - (13+nsiz); 00168 lc = Lin[k + 7]; 00169 00170 L10: /* Current opcode finished handle error, interruptions,...*/ 00171 if (Err > 0) return 0; 00172 00173 if (C2F(basbrk).iflag) { 00174 C2F(basbrk).iflag = FALSE_; 00175 goto L91; 00176 } 00177 if (C2F(errgst).err1 != 0 ) { 00178 if ((C2F(errgst).errpt >0) && (Pt >= C2F(errgst).errpt) && (Rstk[C2F(errgst).errpt]==618)) { 00179 /* error under try catch */ 00180 Pt = C2F(errgst).errpt; 00181 goto L271; 00182 } 00183 /* errcatch in exec(function,'errcatch') 00184 * or catched error in an external 00185 * or errcatch in execstr('foo()','errcatch') */ 00186 if (C2F(errgst).errcatch == 0) goto L999; 00187 /* error under errcatch(....,'continue') */ 00188 if (Rstk[Pt - 1] == 903 || Rstk[Pt - 1] == 909 || Rstk[Pt] == 1001 || Rstk[Pt] == 1002) return 0; 00189 } 00190 if (lc - l0 == nc) { /* is current opcodes block (if, for, .. structure) finished ?*/ 00191 /* yes */ 00192 r = Rstk[Pt] - 610; 00193 switch (r) { 00194 case 1: goto L46; 00195 case 2: goto L47; 00196 case 3: goto L52; 00197 case 4: goto L56; 00198 case 5: goto L57; 00199 case 6: goto L61; 00200 case 8: goto L271; 00201 case 9: goto L272; 00202 } 00203 } 00204 00205 00206 L11: /* next opcode */ 00207 op = Istk[lc]; 00208 /* label 49 retains to be able issue a compatibility error message */ 00209 switch ((int)op) { /* step to corresponding part*/ 00210 case 1: goto L20; 00211 case 2: goto L25; 00212 case 3: goto L40; 00213 case 4: goto L42; 00214 case 5: goto L30; 00215 case 6: goto L41; 00216 case 7: goto L45; 00217 case 8: goto L49; 00218 case 9: goto L49; 00219 case 10: goto L55; 00220 case 11: goto L270;/* try */ 00221 case 12: goto L90; 00222 case 13: goto L95; 00223 case 14: goto L100; 00224 case 15: goto L105; 00225 case 16: goto L110; 00226 case 17: goto L120; 00227 case 18: goto L130; 00228 case 19: goto L140; 00229 case 20: goto L150; 00230 case 21: goto L160; 00231 case 22: goto L170; 00232 case 23: goto L180; 00233 case 24: goto L190; 00234 case 25: goto L200; 00235 case 26: goto L210; 00236 case 27: goto L220; 00237 case 28: goto L97; 00238 case 29: goto L230; 00239 case 30: goto L260; 00240 case 31: goto L261; 00241 00242 } 00243 if (op >= 100) { 00244 /* ------------- primitive call (matfn's) -------------- */ 00245 goto L80; 00246 } 00247 00248 if (op == 99) { 00249 /* ------------- return -------------------------------- */ 00250 /* check if "return" occured in a for loop */ 00251 p = Pt + 1; 00252 L12: 00253 --p; 00254 if (Rstk[p] == 612) { 00255 /* yes, remove the for loop variable */ 00256 --Top; 00257 goto L12; 00258 } else if (Rstk[p] != 501) { 00259 goto L12; 00260 } 00261 C2F(com).fin = 2; 00262 goto L998; 00263 } 00264 00265 if (op <= 0) { 00266 /* ------------- nop ---------------------------------- */ 00267 lc += Istk[1 + lc]; 00268 goto L11; 00269 } 00270 00271 SciError(60); 00272 return 0; 00273 00274 L20: /* stackp, retplaced by assign */ 00275 /* retained for 2.7 and earlier versions compatibility */ 00276 C2F(stackp)(&Istk[1 + lc], &c__0); 00277 /* store info if printing is required see code 22 */ 00278 C2F(putid)(id, &Istk[1 + lc]); 00279 kid = C2F(com).fin; 00280 lc += 7; 00281 goto L10; 00282 00283 L25: /* stackg */ 00284 C2F(com).fin = Istk[7 + lc]; 00285 ifin = C2F(com).fin; 00286 Rhs = Istk[8 + lc]; 00287 lname = lc + 1; 00288 L26: 00289 C2F(stackg)(&Istk[lname]); 00290 if (Err > 0||C2F(errgst).err1 > 0) { 00291 lc += 9; 00292 goto L10; 00293 } 00294 if (C2F(com).fin != 0) {/* variable exists */ 00295 goto L28; 00296 } 00297 C2F(funs)(&Istk[1 + lc]); /* check if it is a function */ 00298 if (Err > 0||C2F(errgst).err1 > 0) { 00299 lc += 9; 00300 goto L10; 00301 } 00302 if (C2F(com).fun != -2) { 00303 C2F(putid)(&Ids[1 +(Pt + 1) * nsiz ], &Istk[1 + lc]); 00304 if (C2F(com).fun == 0) { 00305 --Top; 00306 SciError(4); 00307 if (Err > 0||C2F(errgst).err1 > 0) { 00308 lc += 9; 00309 goto L10; 00310 } 00311 } else { 00312 /* referenced name was function at compile time it is now a 00313 * primitive. Modify the code for further use */ 00314 if (ifin != -4 && ifin != 0) { 00315 /* function call */ 00316 /* change current opcode to nop */ 00317 Istk[lc] = 0; 00318 Istk[1 + lc] = 9; 00319 lc += 9; 00320 /* change the following opcode to matfn opcode */ 00321 op = C2F(com).fun * 100; 00322 Istk[lc] = op; 00323 Istk[1 + lc] = Istk[2 + lc] - 1; 00324 Istk[2 + lc] = Istk[3 + lc]; 00325 Istk[3 + lc] = C2F(com).fin; 00326 goto L80; 00327 } else { 00328 /* only reference to a function */ 00329 /* stackg opcode replaced by varfun opcode */ 00330 Istk[lc] = 27; 00331 Istk[1 + lc] = C2F(com).fun; 00332 Istk[2 + lc] = C2F(com).fin; 00333 C2F(putid)(&Istk[3 + lc], &Ids[1 + (Pt + 1) * nsiz]); 00334 goto L10; 00335 } 00336 } 00337 lc += 9; 00338 goto L10; 00339 } 00340 C2F(com).fin = Istk[7 + lc]; 00341 goto L26; 00342 L28: 00343 if (Rhs == 0 && ((Istk[7 + lc] == -2)||(Istk[7 + lc] == -1)) && C2F(com).fin == -1) { 00344 lc += 9; 00345 00346 if (Istk[7 + lc-9] == -2) { 00347 00348 /* instruction reduced to <name> with name not a function, replace */ 00349 /* next two op code by a single store */ 00350 /* skip extract op-code <5 3 1 1> */ 00351 if (Istk[lc] != 5 || Istk[1 + lc] != 3) { 00352 strcpy(C2F(cha1).buf,"Unexpected opcode, please report"); 00353 SciError(9999); 00354 return 0; 00355 } 00356 lc += 4; 00357 } 00358 /* skip assignment op_code <29 43 ans 0> */ 00359 if (Istk[lc] != 29) { 00360 strcpy(C2F(cha1).buf,"Unexpected opcode, please report"); 00361 SciError(9999); 00362 return 0; 00363 } 00364 lc += 10; 00365 /* store */ 00366 Rhs = 1; 00367 C2F(ref2val)(); 00368 C2F(stackp)(&Istk[lname], &c__0); 00369 if (Err > 0 ||C2F(errgst).err1 > 0) { 00370 goto L10; 00371 } 00372 goto L10; 00373 } 00374 lc += 9; 00375 if (C2F(com).fin > 0) { 00376 goto L65; 00377 } 00378 goto L10; 00379 00380 /* allops */ 00381 L30: 00382 C2F(com).fin = Istk[1 + lc]; 00383 Rhs = Istk[2 + lc]; 00384 Lhs = Istk[3 + lc]; 00385 lc += 4; 00386 if (C2F(com).fin == extrac) { 00387 C2F(isafunptr)(&Top, id, &ifun, &ifin); 00388 if (ifun != 0) { 00389 --Top; 00390 --Rhs; 00391 C2F(com).fun = ifun; 00392 C2F(com).fin = ifin; 00393 C2F(adjustrhs)(); 00394 goto L81; 00395 } 00396 } 00397 if (C2F(com).fin == extrac || C2F(com).fin == insert) { 00398 C2F(adjustrhs)(); 00399 } 00400 ++Pt; 00401 Rstk[Pt] = 601; 00402 Ids[1 + Pt * nsiz] = tref; 00403 Ids[3 + Pt * nsiz] = l0; 00404 Ids[4 + Pt * nsiz] = nc; 00405 C2F(recu).icall = 4; 00406 /* pstk(pt) is used by allops to get the name of output variable (insertion) */ 00407 Pstk[Pt] = lc; 00408 /* *call* allops */ 00409 return 0; 00410 L33: 00411 tref = Ids[1 + Pt * nsiz]; 00412 l0 = Ids[3 + Pt * nsiz]; 00413 nc = Ids[4 + Pt * nsiz]; 00414 lc = Pstk[Pt]; 00415 --Pt; 00416 goto L70; 00417 00418 /* string */ 00419 L40: 00420 n = Istk[1 + lc]; 00421 if (C2F(errgst).err1 <= 0) { 00422 ++Top; 00423 if (C2F(cresmat)("run", &Top, &c__1, &c__1, &n, 3L)) { 00424 C2F(getsimat)("run", &Top, &Top, &mm1, &nn1, &c__1, & 00425 c__1, &lr, &nlr, 3L); 00426 C2F(icopy)(&n, &Istk[2 + lc], &c__1, &Istk[lr], &c__1); 00427 } 00428 } 00429 lc = lc + n + 2; 00430 goto L10; 00431 00432 /* num */ 00433 L41: 00434 if (C2F(errgst).err1 <= 0) { 00435 if (C2F(getendian)() == 1) { 00436 ix[0] = Istk[1 + lc]; 00437 ix[1] = Istk[2 + lc]; 00438 } else { 00439 ix[1] = Istk[1 + lc]; 00440 ix[0] = Istk[2 + lc]; 00441 } 00442 ++Top; 00443 if (C2F(cremat)("run", &Top, &c__0, &c__1, &c__1, &lr, &lcc, 3L)) { 00444 Stk[lr] = *x; 00445 } 00446 } 00447 lc += 3; 00448 goto L10; 00449 00450 L42: 00451 C2F(defmat)(); 00452 ++lc; 00453 goto L10; 00454 00455 /* for */ 00456 L45: 00457 nc = Istk[1 + lc]; 00458 lc += 2; 00459 l0 = lc; 00460 if (Ptover(1)) { 00461 lc += nc; 00462 lc = lc + nsiz + Istk[lc]; 00463 goto L10; 00464 } 00465 Rstk[Pt] = 611; 00466 Ids[1 + Pt * nsiz] = l0; 00467 Ids[2 + Pt * nsiz] = nc; 00468 goto L10; 00469 00470 L46: 00471 nc = Istk[lc]; 00472 l0 = lc + 7; 00473 Rstk[Pt] = 612; 00474 Pstk[Pt] = 0; 00475 Ids[1 + Pt * nsiz] = l0; 00476 Ids[2 + Pt * nsiz] = Lct[8]; 00477 Ids[3 + Pt * nsiz] = Top; 00478 Ids[4 + Pt * nsiz] = C2F(errgst).toperr; 00479 C2F(errgst).toperr = Top; 00480 L47: 00481 lc = l0; 00482 if (Top != Ids[3 + Pt * nsiz]) { 00483 SciError(115); 00484 goto L48; 00485 } 00486 C2F(nextj)(&Istk[1 + l0 - 7], &Pstk[Pt]); 00487 if (Pstk[Pt] != 0) { 00488 Lct[8] = Ids[2 + Pt * nsiz]; 00489 00490 if (inxsci == 1 && scilab_timer_check() ) C2F(sxevents)(); 00491 if (C2F(ismenu)() == 1 && C2F(basbrk).interruptible) goto L115; 00492 goto L10; 00493 } 00494 /* fin for */ 00495 L48: 00496 lc += nc; 00497 C2F(errgst).toperr = Ids[4 + Pt * nsiz]; 00498 --Pt; 00499 goto L70; 00500 00501 /* Very old if - while (removed) */ 00502 L49: 00503 if (Istk[1 + lc] < 0) { 00504 goto L55; 00505 } 00506 L52: 00507 strcpy(C2F(cha1).buf, "Functions compiled with very old versions are no more handled"); 00508 SciError(997); 00509 return 0; 00510 00511 /* "select- case" or "if elseif else end" */ 00512 L55: 00513 if (Ptover(1)) { 00514 lc += (i2 = Istk[1 + lc], abs(i2)); 00515 goto L10; 00516 } 00517 Pstk[Pt] = lc; 00518 Ids[3 + Pt * nsiz] = C2F(errgst).toperr; 00519 00520 L551: 00521 if (Istk[1 + lc] > 0) { 00522 /* first expression */ 00523 nc = Istk[3 + lc]; 00524 Rstk[Pt] = 614; 00525 lc += 4; 00526 l0 = lc; 00527 Ids[1 + Pt * nsiz] = l0; 00528 Ids[2 + Pt * nsiz] = nc; 00529 goto L10; 00530 } else { 00531 lc += 4; 00532 } 00533 00534 /* expri */ 00535 L56: 00536 if (Istk[Pstk[Pt]] == 10) { 00537 /* copy first expression */ 00538 i2 = Top + 1; 00539 if (! C2F(vcopyobj)("run", &Top, &i2,3L)) { 00540 return 0; 00541 } 00542 ++Top; 00543 } 00544 00545 nc = Istk[lc]; 00546 Rstk[Pt] = 615; 00547 ++lc; 00548 l0 = lc; 00549 Ids[1 + Pt * nsiz] = l0; 00550 Ids[2 + Pt * nsiz] = nc; 00551 goto L10; 00552 00553 /* instructions i */ 00554 L57: 00555 if (nc == 0) { 00556 /* if nc=0 the instruction correspond to the else */ 00557 ok = TRUE_; 00558 if (Istk[Pstk[Pt]] == 10) { 00559 --Top; 00560 } 00561 goto L59; 00562 } else if (Istk[Pstk[Pt]] != 10) { 00563 ok = Istrue(1); 00564 if (Err > 0 || C2F(errgst).err1 > 0) { 00565 goto L10; 00566 } 00567 goto L59; 00568 } 00569 ++Pt; 00570 C2F(com).fin = equal; 00571 Rhs = 2; 00572 Lhs = 1; 00573 Rstk[Pt] = 605; 00574 C2F(recu).icall = 4; 00575 Pstk[Pt] = lc; 00576 Ids[1 + Pt * nsiz] = tref; 00577 /* *call* allops(equal) */ 00578 return 0; 00579 00580 L58: 00581 lc = Pstk[Pt]; 00582 tref = Ids[1 + Pt * nsiz]; 00583 --Pt; 00584 ok = Istrue(1); 00585 if (Err > 0 || C2F(errgst).err1 > 0) { 00586 goto L10; 00587 } 00588 L59: 00589 nc = Istk[lc]; 00590 C2F(errgst).toperr = Top; 00591 if (ok) { 00592 ++lc; 00593 if (Istk[Pstk[Pt]] == 10) { 00594 --Top; 00595 } 00596 l0 = lc; 00597 Ids[1 + Pt * nsiz] = l0; 00598 Ids[2 + Pt * nsiz] = nc; 00599 Rstk[Pt] = 616; 00600 if (inxsci == 1 && scilab_timer_check() ) C2F(sxevents)(); 00601 if (C2F(ismenu)() == 1 && C2F(basbrk).interruptible) goto L115; 00602 goto L10; 00603 } else { 00604 if (Istk[Pstk[Pt]] == 9) { 00605 goto L62; 00606 } 00607 lc = lc + nc + 1; 00608 goto L56; 00609 } 00610 00611 L61: 00612 /* fin if while select/case */ 00613 l0 = Pstk[Pt]; 00614 if (Istk[Pstk[Pt]] == 9) { 00615 lc = l0 + 4; 00616 goto L56; 00617 } 00618 L62: 00619 l0 = Pstk[Pt]; 00620 lc = l0 + (i2 = Istk[1 + l0], abs(i2)); 00621 C2F(errgst).toperr = Ids[3 + Pt * nsiz]; 00622 --Pt; 00623 goto L70; 00624 00625 /* macro */ 00626 L65: 00627 i2 = Istk[2 + lc] - 1; 00628 Rhs = max(i2,0); 00629 C2F(adjustrhs)(); 00630 Lhs = Istk[3 + lc]; 00631 00632 lc += 4; 00633 00634 if (Ptover(1)) { 00635 goto L10; 00636 } 00637 Rstk[Pt] = 602; 00638 Pstk[Pt] = lc; 00639 /* Ids[1 + Pt * nsiz] = C2F(dbg).wmac; *//*moved into macro.f*/ 00640 Ids[2 + Pt * nsiz] = tref; 00641 Ids[3 + Pt * nsiz] = l0; 00642 Ids[4 + Pt * nsiz] = nc; 00643 C2F(recu).icall = 5; 00644 C2F(com).fun = 0; 00645 /* *call* macro */ 00646 return 0; 00647 L66: 00648 lc = Pstk[Pt]; 00649 /*C2F(dbg).wmac = Ids[1 + Pt * nsiz];*//*moved into macro.f*/ 00650 tref = Ids[2 + Pt * nsiz]; 00651 l0 = Ids[3 + Pt * nsiz]; 00652 nc = Ids[4 + Pt * nsiz]; 00653 --Pt; 00654 goto L70; 00655 00656 L70: 00657 /* re entering run to continue macro evaluation */ 00658 if (inxsci == 1 && scilab_timer_check() ) C2F(sxevents)(); 00659 if (C2F(ismenu)() == 1 && C2F(basbrk).interruptible) goto L115; 00660 00661 L71: 00662 /* reset proper values for l0 and nc if a control structure had been escaped*/ 00663 r = Rstk[Pt] - 610; 00664 switch ((int)r) { 00665 case 1: 00666 l0 = Ids[1 + Pt * nsiz]; 00667 nc = Ids[2 + Pt * nsiz]; 00668 goto L10; 00669 case 2: /* back to a for */ 00670 j = Pstk[Pt]; 00671 l0 = Ids[1 + Pt * nsiz]; 00672 nc = Istk[l0 - 7]; 00673 goto L10; 00674 case 3: /* back to an if or a while */ 00675 li = Ids[1 + Pt * nsiz]; 00676 kc = Ids[2 + Pt * nsiz]; 00677 nc = Istk[2 + li]; 00678 l0 = li + 5; 00679 if (kc == 0) { 00680 goto L10; 00681 } 00682 l0 += nc; 00683 nc = Istk[3 + li]; 00684 if (kc == 1) { 00685 goto L10; 00686 } 00687 l0 += nc; 00688 nc = Istk[4 + li]; 00689 goto L10; 00690 case 4: 00691 case 5: 00692 case 6: 00693 /* back to a select case */ 00694 l0 = Ids[1 + Pt * nsiz]; 00695 nc = Ids[2 + Pt * nsiz]; 00696 goto L10; 00697 case 8: /*back to a try*/ 00698 l0 = Ids[1 + Pt * nsiz]; 00699 nc = Istk[l0 - 2]; 00700 goto L10; 00701 case 9: /*back to a catch*/ 00702 l0 = Ids[1 + Pt * nsiz]; 00703 nc = Istk[l0 - 1]; 00704 l0 = l0 + Istk[l0 - 2]; 00705 goto L10; 00706 default : 00707 goto L10; 00708 } 00709 00710 L80: 00711 C2F(com).fun = op / 100; 00712 Rhs = Istk[1 + lc]; 00713 C2F(adjustrhs)(); 00714 Lhs = Istk[2 + lc]; 00715 C2F(com).fin = Istk[3 + lc]; 00716 lc += 4; 00717 00718 L81: 00719 ++Pt; 00720 Rstk[Pt] = 603; 00721 Pstk[Pt] = lc; 00722 C2F(recu).icall = 9; 00723 Ids[2 + Pt * nsiz] = 0; 00724 Ids[3 + Pt * nsiz] = tref; 00725 Ids[4 + Pt * nsiz] = l0; 00726 Ids[5 + Pt * nsiz] = nc; 00727 /* *call* matfns */ 00728 return 0; 00729 L82: 00730 /* warning if builtin is "resume" control is passed to macro and not here */ 00731 lc = Pstk[Pt]; 00732 tref = Ids[3 + Pt * nsiz]; 00733 l0 = Ids[4 + Pt * nsiz]; 00734 nc = Ids[5 + Pt * nsiz]; 00735 --Pt; 00736 goto L70; 00737 00738 /* pause */ 00739 L90: 00740 ++lc; 00741 L91: 00742 if (Ptover(1)) { 00743 goto L10; 00744 } 00745 Pstk[Pt] = C2F(iop).rio; 00746 C2F(iop).rio = C2F(iop).rte; 00747 C2F(com).fin = 2; 00748 if (Lct[4] <= -10) { 00749 C2F(com).fin = -1; 00750 Lct[4] = -Lct[4] - 11; 00751 } 00752 Ids[1 + Pt * nsiz] = lc; 00753 Ids[2 + Pt * nsiz] = Top; 00754 Ids[3 + Pt * nsiz] = tref; 00755 Ids[4 + Pt * nsiz] = l0; 00756 Ids[5 + Pt * nsiz] = nc; 00757 Rstk[Pt] = 604; 00758 C2F(recu).icall = 5; 00759 /* *call* macro */ 00760 return 0; 00761 L92: 00762 lc = Ids[1 + Pt * nsiz]; 00763 Top = Ids[2 + Pt * nsiz]; 00764 tref = Ids[3 + Pt * nsiz]; 00765 l0 = Ids[4 + Pt * nsiz]; 00766 nc = Ids[5 + Pt * nsiz]; 00767 C2F(iop).rio = Pstk[Pt]; 00768 --Pt; 00769 goto L70; 00770 00771 /* break */ 00772 L95: 00773 p = Pt + 1; 00774 L96: 00775 --p; 00776 if (p == 0) { 00777 ++lc; 00778 goto L10; 00779 } 00780 if (Rstk[p] == 612) { 00781 /* break in a for */ 00782 l0 = Ids[1 + p * nsiz]; 00783 lc = l0 + Istk[1 + l0 - 8]; 00784 Pt = p - 1; 00785 --Top; 00786 goto L70; 00787 } else if (Rstk[p] == 616 && Istk[1 + Pstk[p] - 1] == 9) 00788 { 00789 /* break in a while */ 00790 l0 = Pstk[p]; 00791 lc = l0 + (i2 = Istk[1 + l0], abs(i2)); 00792 Pt = p - 1; 00793 goto L70; 00794 } else if (Rstk[p] == 501 || Rstk[p] == 502 || 00795 Rstk[p] == 503) { 00796 /* going outside a function an exec (break ignored) */ 00797 ++lc; 00798 goto L10; 00799 } else { 00800 goto L96; 00801 } 00802 /* continue */ 00803 L97: 00804 p = Pt + 1; 00805 L98: 00806 --p; 00807 if (p == 0) { 00808 ++lc; 00809 goto L10; 00810 } 00811 if (Rstk[p] == 612) { 00812 /* continue in a for */ 00813 l0 = Ids[1 + p * nsiz]; 00814 /* nc is required for the end of loop */ 00815 lc = l0 - 7; 00816 nc = Istk[lc]; 00817 Pt = p; 00818 goto L47; 00819 } else if (Rstk[p] == 616 && Istk[1 + Pstk[p] - 1] == 9) 00820 { 00821 /* continue in a while */ 00822 l0 = Pstk[p]; 00823 lc = l0; 00824 nc = Istk[lc]; 00825 Pt = p; 00826 goto L551; 00827 } else { 00828 goto L98; 00829 } 00830 /* abort */ 00831 L100: 00832 ++Pt; 00833 L101: 00834 --Pt; 00835 if (Pt == 0) { 00836 goto L102; 00837 } 00838 if (Rstk[Pt] / 100 == 5) { 00839 k = Lpt[1] - (13 + nsiz); 00840 Lpt[1] = Lin[1 + k]; 00841 Lpt[2] = Lin[2 + k]; 00842 Lpt[3] = Lin[3 + k]; 00843 Lpt[4] = Lin[4 + k]; 00844 Lct[4] = Lin[6 + k ]; 00845 Lpt[6] = k; 00846 if (Rstk[Pt] <= 502) { 00847 if (Pt>1) { 00848 if (Rstk[Pt-1] != 903 && Rstk[Pt-1] != 909 && Rstk[Pt-1] != 706) 00849 C2F(vstk).bot = Lin[5 + k];} 00850 else 00851 C2F(vstk).bot = Lin[5 + k]; 00852 } 00853 else if (Rstk[Pt] == 503) { 00854 if (C2F(iop).rio == C2F(iop).rte) { 00855 /* abort dans une pause*/ 00856 C2F(iop).rio = Pstk[Pt-1]; 00857 C2F(recu).paus--; 00858 C2F(vstk).bot = Lin[5 + k];} 00859 else { 00860 int mode[3]; 00861 /* abort dans un exec*/ 00862 mode[0]=0; 00863 C2F(clunit)(-C2F(iop).rio,C2F(cha1).buf,mode); 00864 C2F(iop).rio = Pstk[Pt-1]; 00865 } 00866 } 00867 } 00868 goto L101; 00869 L102: 00870 C2F(recu).icall = 10; 00871 Top = 0; 00872 C2F(com).comp[0] = 0; 00873 if (C2F(recu).niv > 1) { 00874 Err = 9999999; 00875 } 00876 return 0; 00877 00878 L105: 00879 /* eol */ 00880 /* la gestion de la recuperation des erreurs devrait plutot se trouver */ 00881 /* a la fin de l'instruction (mais il n'y a pas actuellement d'indicateur */ 00882 /* de fin d'instruction dans les macros */ 00883 if (C2F(errgst).err1 != 0) { 00884 if (C2F(errgst).err2 == 0) { 00885 C2F(errgst).err2 = C2F(errgst).err1; 00886 } 00887 if (C2F(errgst).errcatch == 1) { 00888 /* running under errcatch(num,....) */ 00889 C2F(errgst).err1 = 0; 00890 if (Pt<C2F(errgst).errpt) C2F(errgst).errcatch = 0; 00891 } 00892 imode = (i2 = C2F(errgst).errct / 100000, abs(i2)); 00893 if (imode - (imode / 8 << 3) == 2) { 00894 C2F(basbrk).iflag = TRUE_; 00895 } 00896 } 00897 /* gestion des points d'arrets dynamiques */ 00898 if (C2F(dbg).nmacs != 0) { /* there are breakpoints set */ 00899 int kfin=C2F(dbg).wmac-1; /*the stack index of the current function*/ 00900 /* first test if the function has breakpoints */ 00901 int kmac; 00902 for (kmac=0;kmac<C2F(dbg).nmacs;kmac++) { /* loop on table of functions containing breakpoints */ 00903 /* does the name of the current funtion fit the registered name*/ 00904 if (C2F(eqid)(&(C2F(vstk).idstk[kfin * nsiz]), &(C2F(dbg).macnms[kmac * nsiz]))) {/* yes */ 00905 /* test if there is a registered breakpoint at the current line*/ 00906 i2 = C2F(dbg).lgptrs[kmac+1] - 1; 00907 for (ibpt = C2F(dbg).lgptrs[kmac]; ibpt <= i2; ++ibpt) { 00908 if (Lct[8] == C2F(dbg).bptlg[ibpt - 1]) { /* yes */ 00909 /* display a message */ 00910 C2F(cvname)(&C2F(dbg).macnms[kmac * nsiz], tmp, &c__1, 24L); 00911 sprintf(C2F(cha1).buf,"%s %5d",tmp, Lct[8]); 00912 Msgs(32, 0); 00913 /* raise the interruption flag */ 00914 C2F(basbrk).iflag = TRUE_; 00915 goto L107; 00916 } 00917 } 00918 break; 00919 } 00920 } 00921 } 00922 L107: 00923 00924 if (Lct[4] / 2 % 2 == 1) { 00925 i2 = Lct[4] / 4; 00926 C2F(prompt)(&i2, &iesc); 00927 } 00928 ++Lct[8]; 00929 ++lc; 00930 00931 if (inxsci == 1 && scilab_timer_check() ) C2F(sxevents)(); 00932 if (C2F(ismenu)() == 1 && C2F(basbrk).interruptible) goto L115; 00933 00934 goto L10; 00935 00936 /* set line number. 00937 * 00938 * Au debut de chaque expression liee a un then et a la fin de 00939 * chaque clause, le compilateur (compcl) inscrit la valeur de la 00940 * ligne. ceci permet de mettre rapidement a jour le compteur de 00941 * ligne sans avoir a analyser la suite des codes operatoires */ 00942 00943 L110: 00944 Lct[8] = Istk[1 + lc]; 00945 lc += 2; 00946 goto L10; 00947 00948 /* gestion des evements asynchrones "interpretes" */ 00949 L115: 00950 C2F(basbrk).interruptible = C2F(getmen)(C2F(cha1).buf, &lb, &nentry) == 0; 00951 C2F(bexec)(C2F(cha1).buf, &lb, &ierr); 00952 if (ierr != 0) { 00953 goto L10; 00954 } 00955 ++Pt; 00956 Ids[1 + Pt * nsiz] = lc; 00957 Ids[2 + Pt * nsiz] = l0; 00958 Ids[3 + Pt * nsiz] = nc; 00959 Ids[4 + Pt * nsiz] = tref; 00960 Rstk[Pt] = 606; 00961 C2F(recu).icall = 5; 00962 /* *call* macro */ 00963 return 0; 00964 L116: 00965 C2F(basbrk).interruptible = TRUE_; 00966 lc = Ids[1 + Pt * nsiz]; 00967 l0 = Ids[2 + Pt * nsiz]; 00968 nc = Ids[3 + Pt * nsiz]; 00969 tref = Ids[4 + Pt * nsiz]; 00970 --Top; 00971 --Pt; 00972 goto L71; 00973 /* r = Rstk[Pt] - 610; 00974 switch ((int)r) { 00975 case 1: goto L74; 00976 case 2: goto L71; 00977 case 3: goto L72; 00978 case 4: goto L73; 00979 case 5: goto L73; 00980 case 6: goto L73; 00981 } 00982 goto L10;*/ 00983 00984 /* quit */ 00985 00986 L120: 00987 C2F(com).fun = 99; 00988 return 0; 00989 00990 /* named variable */ 00991 00992 L130: 00993 Infstk[Top] = 1; 00994 C2F(putid)(&C2F(vstk).idstk[Top * nsiz - nsiz], &Istk[1 + lc]); 00995 lc += 7; 00996 goto L10; 00997 00998 /* form recursive extraction list */ 00999 01000 L140: 01001 m = Istk[2 + lc]; 01002 if (Rstk[Pt] == 617) { 01003 /* runtime arg count (list extraction) */ 01004 m += Pstk[Pt]; 01005 Pstk[Pt] = 0; 01006 } 01007 C2F(mkindx)(&Istk[1 + lc], &m); 01008 lc += 3; 01009 goto L10; 01010 01011 /* exit */ 01012 01013 L150: 01014 ++lc; 01015 if (C2F(recu).niv > 0) { 01016 C2F(sciquit)(); 01017 exit(0); /* stop */ 01018 } 01019 C2F(com).fun = 99; 01020 goto L10; 01021 01022 /* begrhs - for run time rhs value computation */ 01023 /* syntax like: l=list(...); a(l(:)) */ 01024 01025 L160: 01026 ++lc; 01027 ++Pt; 01028 Rstk[Pt] = 617; 01029 Pstk[Pt] = 0; 01030 goto L10; 01031 01032 /* printmode */ 01033 01034 L170: 01035 /* print stored variable */ 01036 if (Lct[4] >= 0 && Istk[1 + lc] != semi && kid != 0) { 01037 C2F(print)(id, &kid, &C2F(iop).wte); 01038 } 01039 lc += 2; 01040 goto L10; 01041 L180: 01042 /* name2var */ 01043 C2F(name2var)(&Istk[1 + lc]); 01044 lc += 7; 01045 goto L10; 01046 01047 L190: 01048 /* deffnull */ 01049 ++lc; 01050 ++Top; 01051 C2F(objvide)(" ", &Top, 1L); 01052 goto L10; 01053 01054 L200: 01055 /* profile */ 01056 ++Istk[1 + lc]; 01057 t = clock(); 01058 Istk[2 + lc] = Istk[2 + lc] + t - tref; 01059 tref = t; 01060 lc += 3; 01061 goto L10; 01062 01063 L210: 01064 /* character string vector */ 01065 if (C2F(errgst).err1 <= 0) { 01066 n = Istk[1 + lc] * Istk[2 + lc]; 01067 nc = Istk[lc + 4 + n] - 1; 01068 ++Top; 01069 il = Lstk[Top] + Lstk[Top] - 1; 01070 i2 = il + 5 + n + nc; 01071 Err = i2 / 2 + 1 - Lstk[Bot]; 01072 if (Err > 0 || C2F(errgst).err1 > 0) { 01073 SciError(17); 01074 lc = lc + 5 + n + nc; 01075 goto L10; 01076 } 01077 i2 = n + 5 + nc; 01078 C2F(icopy)(&i2, &Istk[lc], &c__1, &Istk[il], &c__1); 01079 Istk[il] = 10; 01080 i2 = il + 5 + n + nc; 01081 Lstk[1 + Top] = i2 / 2 + 1; 01082 } 01083 lc = lc + 5 + n + nc; 01084 goto L10; 01085 L220: 01086 /* varfun */ 01087 C2F(varfunptr)(&Istk[3 + lc], &Istk[1 + lc], &Istk[2 + lc]); 01088 lc += 9; 01089 goto L10; 01090 L230: 01091 /* affectation */ 01092 Lhs = Istk[1 + lc]; 01093 ip = Istk[2 + lc]; 01094 li = lc + 3; 01095 lc = li + Lhs * 7; 01096 /* following code is an adaptation of corresponding code in parse.f */ 01097 ndel = 0; 01098 L231: 01099 Rhs = Istk[6 + li]; 01100 lastindpos = Top - Lhs - ndel; 01101 if (C2F(errgst).err1 != 0) { 01102 goto L253; 01103 } 01104 if (Rhs == 0) { 01105 /* goto simple affectation */ 01106 C2F(stackp)(&Istk[li], &c__0); 01107 if (Err > 0 || C2F(errgst).err1 > 0) { 01108 goto L10; 01109 } 01110 if (C2F(errgst).err1 > 0) { 01111 goto L253; 01112 } 01113 /* fin points on the newly saved variable */ 01114 if (!(Lct[4] >= 0 && ip != semi && C2F(com).fin != 0)) goto L253; 01115 ifin=C2F(com).fin; 01116 L232: 01117 C2F(print)(&Istk[li], &ifin, &C2F(iop).wte); 01118 if (Rstk[Pt]!=1101) goto L253; 01119 ++Pt; 01120 Pstk[Pt] = li; 01121 Ids[1 + Pt * nsiz] = ndel; 01122 Ids[2 + Pt * nsiz] = lastindpos; 01123 Ids[3 + Pt * nsiz] = tref; 01124 Ids[4 + Pt * nsiz] = l0; 01125 Ids[5 + Pt * nsiz] = Lhs; 01126 Ids[6 + Pt * nsiz] = nc; 01127 Rstk[Pt]=609; 01128 return 0; 01129 L240: 01130 li = Pstk[Pt]; 01131 ip = Istk[li-1]; 01132 ndel = Ids[1 + Pt * nsiz]; 01133 lastindpos = Ids[2 + Pt * nsiz]; 01134 tref = Ids[3 + Pt * nsiz]; 01135 l0 = Ids[4 + Pt * nsiz]; 01136 Lhs = Ids[5 + Pt * nsiz]; 01137 nc = Ids[6 + Pt * nsiz]; 01138 --Pt; 01139 /*goto L253;*/ 01140 goto L232; 01141 01142 } 01143 01144 /* take rhs (number of indices) computed at runtime into account */ 01145 C2F(adjustrhs)(); 01146 /* partial variable affectation (insertion) */ 01147 if (lastindpos + 1 != Top) { 01148 /* create reference variables to get index1,...,indexn, value at */ 01149 /* the top of the stack in this order */ 01150 /* create reference variables pointing to the indices */ 01151 for (ir = 1; ir <= Rhs; ++ir) { 01152 i2 = lastindpos - Rhs + ir; 01153 C2F(createref1)(&i2); 01154 } 01155 /* create reference variable pointing to the value */ 01156 i2 = Top - Rhs; 01157 C2F(createref1)(&i2); 01158 /* remind to remove the original indices */ 01159 ndel += Rhs; 01160 } 01161 lastindpos -= Rhs; 01162 /* put a reference to the lhs variable */ 01163 C2F(com).fin = -3; 01164 C2F(stackg)(&Istk[li]); 01165 if (Err > 0 || C2F(errgst).err1 > 0) { 01166 goto L10; 01167 } 01168 /* perform insertion operation */ 01169 /* index1,...,indexn, value ==> updated lhs value (or pointer to) */ 01170 if (Eptover(1)) { 01171 return 0; 01172 } 01173 /* pstk(pt) is used by allops to get the name of output variable */ 01174 Pstk[Pt] = li; 01175 Ids[1 + Pt * nsiz] = ndel; 01176 Ids[2 + Pt * nsiz] = lastindpos; 01177 Ids[3 + Pt * nsiz] = tref; 01178 Ids[4 + Pt * nsiz] = l0; 01179 Ids[5 + Pt * nsiz] = Lhs; 01180 Ids[6 + Pt * nsiz] = nc; 01181 Rstk[Pt] = 607; 01182 Rhs += 2; 01183 Lhs = 1; 01184 C2F(recu).icall = 4; 01185 C2F(com).fin = insert; 01186 /* *call* allops(insert) */ 01187 return 0; 01188 L250: 01189 li = Pstk[Pt]; 01190 ip = Istk[li-1]; 01191 ndel = Ids[1 + Pt * nsiz]; 01192 lastindpos = Ids[2 + Pt * nsiz]; 01193 tref = Ids[3 + Pt * nsiz]; 01194 l0 = Ids[4 + Pt * nsiz]; 01195 Lhs = Ids[5 + Pt * nsiz]; 01196 nc = Ids[6 + Pt * nsiz]; 01197 --Pt; 01198 /* store the updated value */ 01199 C2F(stackp)(&Istk[li], &c__0); 01200 01201 if (Err > 0 || C2F(errgst).err1 > 0) { 01202 goto L10; 01203 } 01204 if (C2F(errgst).err1 > 0) { 01205 goto L253; 01206 } 01207 /* fin points on the newly saved variable */ 01208 if (!(Lct[4] >= 0 && ip != semi && C2F(com).fin != 0)) goto L252; 01209 ifin=C2F(com).fin; 01210 L251: 01211 C2F(print)(&Istk[li], &ifin, &C2F(iop).wte); 01212 if (Rstk[Pt]!=1101) goto L252; 01213 ++Pt; 01214 Pstk[Pt] = li; 01215 Ids[1 + Pt * nsiz] = ndel; 01216 Ids[2 + Pt * nsiz] = lastindpos; 01217 Ids[3 + Pt * nsiz] = tref; 01218 Ids[4 + Pt * nsiz] = l0; 01219 Ids[5 + Pt * nsiz] = Lhs; 01220 Ids[6 + Pt * nsiz] = nc; 01221 Rstk[Pt]=608; 01222 return 0; 01223 L254: 01224 li = Pstk[Pt]; 01225 ip = Istk[li-1]; 01226 ndel = Ids[1 + Pt * nsiz]; 01227 lastindpos = Ids[2 + Pt * nsiz]; 01228 tref = Ids[3 + Pt * nsiz]; 01229 l0 = Ids[4 + Pt * nsiz]; 01230 Lhs = Ids[5 + Pt * nsiz]; 01231 nc = Ids[6 + Pt * nsiz]; 01232 --Pt; 01233 goto L251; 01234 01235 L252: 01236 /* remove variable containing the value if required */ 01237 if (lastindpos != Top) --Top; 01238 01239 L253: 01240 li += 7; 01241 --Lhs; 01242 if (Lhs > 0) { 01243 goto L231; 01244 } 01245 Top -= ndel; 01246 lc = li; 01247 goto L10; 01248 01249 /* logical expression shortcircuit */ 01250 L260: 01251 if (Istk[1 + lc] == 1) { 01252 /* | case */ 01253 if (C2F(gettype)(&Top) != 8 && Istrue(0)) { 01254 lc += Istk[2 + lc]; 01255 } 01256 } else { 01257 /* & case */ 01258 if (C2F(gettype)(&Top) != 8 && ! Istrue(0)) { 01259 lc += Istk[2 + lc]; 01260 } 01261 } 01262 lc += 3; 01263 goto L10; 01264 /* comment */ 01265 L261: 01266 01267 lc += 2+Istk[1 + lc]; 01268 goto L10; 01269 01270 /* try catch */ 01271 L270: 01272 nc = Istk[1 + lc]; 01273 lc += 3; 01274 l0 = lc; 01275 if (Ptover(1)) { 01276 lc += nc; 01277 lc += nsiz + Istk[lc]; 01278 goto L10; 01279 } 01280 Rstk[Pt] = 618; 01281 Ids[1 + Pt * nsiz] = l0; 01282 /* preserve current error modes */ 01283 Ids[2 + Pt * nsiz] = C2F(errgst).errct; 01284 Ids[3 + Pt * nsiz] = C2F(errgst).err2; 01285 Ids[4 + Pt * nsiz] = C2F(errgst).err1; 01286 Ids[5 + Pt * nsiz] = C2F(errgst).errpt; 01287 Ids[6 + Pt * nsiz] = (Lct[4]+100)+10000*C2F(com).sym; 01288 /* set error recovery mode without message*/ 01289 C2F(errgst).errct = -(900000+1); 01290 C2F(errgst).errpt = Pt; 01291 Pstk[Pt] = Top; 01292 goto L10; 01293 L271: 01294 /* try op-codes finished*/ 01295 l0 = Ids[1 + Pt * nsiz]; 01296 /*check if an error occured*/ 01297 ok = max(C2F(errgst).err2,C2F(errgst).err1)<=0; 01298 /* restore preserved error modes */ 01299 C2F(errgst).errct = Ids[2 + Pt * nsiz]; 01300 C2F(errgst).err2 = Ids[3 + Pt * nsiz]; 01301 C2F(errgst).err1 = Ids[4 + Pt * nsiz]; 01302 C2F(errgst).errpt = Ids[5 + Pt * nsiz]; 01303 C2F(com).sym = Ids[6 + Pt * nsiz]/10000; 01304 Lct[4] = Ids[6 + Pt * nsiz]-10000*C2F(com).sym-100; 01305 if (ok) { 01306 /* no error occured in the try part*/ 01307 nc = Istk[l0-1]; 01308 lc += nc; /*skip catch instructions*/ 01309 /* finish try catch context and continue*/ 01310 --Pt; 01311 goto L70; 01312 } 01313 /*an error occured in the try part*/ 01314 lc = l0+Istk[l0-2];/*skip remaining try instruction*/ 01315 nc = Istk[l0-1]; 01316 /*execute catch instructions (next op-codes)*/ 01317 l0 = lc; 01318 Rstk[Pt] = 619; 01319 goto L10; 01320 L272: 01321 /* catch op-codes finished*/ 01322 /* close "try catch" context and continue*/ 01323 --Pt; 01324 goto L70; 01325 01326 01327 L998: 01328 Lhs = 0; 01329 L999: 01330 /*remove context down to current running macro */ 01331 if (Rstk[Pt] != 501) { 01332 --Pt; 01333 goto L999; 01334 } 01335 C2F(com).fun = 0; 01336 return 0; 01337 #undef ix 01338 #undef x 01339 }
Here is the call graph for this function:

1.5.1