/* ==================================================================== */ /* Scilab parsing function */ /* ==================================================================== */ /* Copyright INRIA, S. Steer */ /* *------------------------------------------------------------------ */ #include #include #include "../stack-c.h" #undef Lstk #undef Infstk typedef int logical; #ifdef WIN32 #define abs(x) ((x) >= 0 ? (x) : -(x)) /* pour abs C2F(parse)() line 1393 */ #endif IMPORT struct { logical iflag, interruptible; } C2F(basbrk); /* Table of constant values */ static int c__1 = 1; static int c__0 = 0; static int c_n1 = -1; #define comma 52 #define lparen 41 #define rparen 42 #define left 54 #define right 55 #define less 59 #define great 60 #define dot 51 #define name 1 #define num 0 #define cmt 2 #define insert 2 #define extrac 3 #define blank 40 #define semi 43 #define slash 48 #define equal 50 #define eol 99 #ifndef max #define max(x,y) (((x)>(y))?(x):(y)) #endif #define Pt (C2F(recu).pt) extern int C2F(clause)(); extern int C2F(fact)(); extern int C2F(expr)(); extern int C2F(terme)(); extern int C2F(stackp)(); extern int C2F(stackg)(); extern int C2F(macro)(); extern int C2F(getsym)(); extern int C2F(putid)(); extern logical C2F(eqid)(); extern logical C2F(ptover)(); extern int C2F(funs)(); extern int C2F(sxevents)(); extern int C2F(bexec)(); extern int C2F(ismenu)(); extern int C2F(getmen)(); extern int C2F(tksynchro)(); extern int C2F(checkevts)(); extern int C2F(findequal)(); extern int C2F(print)(); extern int C2F(cvstr)(); extern int C2F(createref1)(); extern int C2F(comand)(); extern int C2F(cvname)(); extern int C2F(getlin)(); extern int C2F(mrknmd)(); extern int C2F(stimer)(); extern int C2F(basout)(); extern int C2F(mkindx)(); extern int C2F(whatln)(); extern int C2F(prompt)(); extern int C2F(seteol)(); extern int C2F(allops)(); extern int C2F(run)(); extern int C2F(name2var)(); extern void C2F(parsecomment)(); extern int scilab_timer_check(); void handle_onprompt(int *n); void Msgs(int n,int ierr) { extern int C2F(msgs)(); C2F(msgs)(&n,&ierr); } void SciError(int n) { extern int C2F(error)(); C2F(error)(&n); } logical Compil(int code,int * val1,int val2,int val3,int val4) { extern logical C2F(compil)(); return C2F(compil)(&code, val1, &val2, &val3, &val4); } logical Eptover(int n) { extern logical C2F(eptover)(); int c; return C2F(eptover)(&n,(c=psiz,&c)); } logical Ptover(int n) { extern logical C2F(Ptover)(); int c; return C2F(ptover)(&n,(c=psiz,&c)); } int C2F(parse)() { /* Initialized data */ static int ans[6] = { 672929546,673720360,673720360,673720360, 673720360,673720360 }; static int varargout[6] = { 169544223,504893467,673720349,673720360, 673720360,673720360 }; /* static int catch[6] = {203229708,673720337,673720360,673720360, 673720360,673720360 };*/ static int *Ids = C2F(recu).ids-nsiz-1; static int *Rstk = C2F(recu).rstk-1; static int *Pstk = C2F(recu).pstk-1; static int *Lstk = C2F(vstk).lstk-1; static int *Lin = C2F(iop).lin-1; static int *Lpt = C2F(iop).lpt-1; static int *Lct = C2F(iop).lct-1; /*static double *Stk = C2F(stack).Stk-1;*/ /*static int *Istk = (int *)( C2F(stack).Stk)-1;*/ /* System generated locals */ int i__2, i__3; /* Local variables */ static int iesc, ndel, ifin, ibpt; static int iret; static int topk; static int lpts, next; static int ierr; static int k, p, r; static int imode, schar; static int itime, where; static logical found; static int excnt; static int l1; static int id[6], lb, io, ir; static int inxsci; static logical dotsep; static int icount; static int nentry, lastindpos; static int job, nlc, pts; static char tmp[80]; itime = 10000; C2F(checkevts)(&inxsci); L1: r = 0; if (Pt > 0) { r = Rstk[Pt]; } if (C2F(iop).ddt == 4) { sprintf(tmp," TOP pt:%d rstk(pt):%d icall: %d niv: %d err:%d", Pt,Rstk[Pt], C2F(recu).icall, C2F(recu).niv,C2F(iop).err); C2F(basout)(&io, &C2F(iop).wte,tmp, strlen(tmp)); } if (C2F(recu).icall == 5) { goto L88; } if (Pt > 0) { goto L86; } if (C2F(iop).err > 0) { goto L98; } /* initialization */ /* ------------------- */ L5: C2F(com).sym = eol; job = 0; if (C2F(iop).rio == -1) { job = -1; } Top = 0; C2F(com).fin = 0; C2F(recu).macr = 0; C2F(recu).paus = 0; C2F(recu).icall = 0; C2F(iop).rio = C2F(iop).rte; Lct[3] = 0; Lct[4] = 2; Lpt[1] = 1; if (job == -1) { goto L13; } L10: if (C2F(com).sym != eol) { goto L15; } if (C2F(com).comp[0] == 0) { goto L12; } if (Lin[Lpt[4]+1] == eol) { goto L88; } /* get a new line */ /* ------------------- */ L12: if (Lct[4] <= -10) { Lct[4] = -Lct[4] - 11; } else { if (Lct[4] / 2 % 2 == 1) { i__2 = Lct[4] / 4; C2F(prompt)(&i__2, &iesc); if (iesc == 1) { /* interrupted line acquisition (mode=7) */ iret = 3; goto L96; } Lct[1] = 0; if (C2F(recu).paus == 0 && C2F(iop).rio == C2F(iop).rte && C2F(recu).macr == 0) { if (Pt != 0) { Msgs(30,0); Pt = 0; } if (Top != 0) { Msgs(31,0); Top = 0; } } } } L13: C2F(tksynchro)(&C2F(recu).paus); C2F(getlin)(&job, &c__1); C2F(tksynchro)(&c_n1); if (C2F(com).fin == -3) { /* interrupted line acquisition */ iret = 2; goto L96; } else if (C2F(com).fin == -1) { /* Continuation line handling when scilab is called as a routine */ C2F(com).fun = 99; return 0; } job = 0; C2F(iop).err = 0; if (Pt != 0) { goto L15; } L14: handle_onprompt(&where); if (C2F(iop).err > 0) { goto L98; } switch ((int)where) { case 1: goto L85; case 2: goto L88; } /* Beginning of a new statement, clause expression or command */ /* ------------------------------------------------------------ */ L15: if (inxsci == 1 && scilab_timer_check() ) C2F(sxevents)(); if (C2F(ismenu)() == 1 && C2F(basbrk).interruptible) { iret = 1; goto L96; } r = 0; if (Pt > 0) { r = Rstk[Pt]; } if (C2F(iop).ddt == 4) { sprintf(tmp," parse pt:%d rstk(pt):%d top: %d niv: %d err:%d", Pt,r,Top, C2F(recu).niv,C2F(iop).err); C2F(basout)(&io, &C2F(iop).wte,tmp, strlen(tmp)); } excnt = 0; if (! C2F(basbrk).iflag || C2F(com).comp[0] != 0 ) { goto L18; } /* Handling of pauses */ L16: if (Eptover(1)) { goto L98; } Pstk[Pt] = C2F(iop).rio; Ids[2 + Pt * nsiz] = Top; C2F(iop).rio = C2F(iop).rte; Rstk[Pt] = 701; C2F(basbrk).iflag = FALSE_; C2F(com).fin = 2; if (Lct[4] <= -10) { C2F(com).fin = -1; Lct[4] = -Lct[4] - 11; } /* *call* macro */ goto L88; /* pauses termination */ L17: C2F(iop).rio = Pstk[Pt]; Top = Ids[2 + Pt * nsiz]; --Pt; goto L15; L18: Lhs = 1; excnt = 0; C2F(putid)(id, ans); /* preserve current character position */ lpts = Lpt[4] - 1; pts = Pt; C2F(getsym)(); if (C2F(com).sym == right || C2F(com).sym == rparen || C2F(com).sym == less || C2F(com).sym == great) { SciError(1); goto L98; } else if (C2F(com).sym == semi || C2F(com).sym == comma || C2F(com).sym == eol) { goto L77; } else if (C2F(com).sym == cmt) { C2F(parsecomment)(); goto L77; } else if (C2F(com).sym == name) { lpts = Lpt[3] - 1; /* try to avoid the comand call whenever it is possible */ if (C2F(com).char1 == equal) { goto L25; } /* if (char1 .eq. lparen) then */ /* one can get this case with "if ( ) then" */ /* endif */ if (Lpt[4] >= 2) { if (Lin[Lpt[4] - 2] == blank) { goto L20; } } if (C2F(com).char1 == dot) { /* name.x */ schar = C2F(com).char1; goto L30; } goto L20; } else if (C2F(com).sym == left) { /* is there an explicit affectation */ lpts = Lpt[3] - 1; Lpt[4] = lpts; Lpt[3] = lpts; C2F(com).char1 = blank; C2F(findequal)(&found); if (C2F(iop).err > 0) { goto L98; } if (found) { /* multiple lhs */ goto L40; } else { /* no ==> implicit lhs */ goto L50; } } else { /* not lhs defined */ /* set ans for lhs */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], ans); Lhs = 1; Pstk[Pt] = 0; /* go to rhs analysis */ goto L60; } /* lhs begins with name */ /* ------------------------- */ /* check if it is a simple command like clear,... */ L20: C2F(comand)(C2F(com).syn, &c__0); if (C2F(iop).err > 0) { goto L98; } if (C2F(com).fin == 0) { goto L21; } if (C2F(com).fun == 99) { return 0; } if (C2F(com).fun != 0) { goto L93; } if (C2F(com).fin < 0) { goto L80; } if (C2F(com).fin == 2) { goto L88; } if (C2F(com).fin == 3) { goto L16; } if (C2F(com).fin == 4) { goto L5; } if (C2F(com).fin > 0) { goto L77; } /* name is not a command */ L21: Rhs = 0; C2F(com).fin = -5; /* IL y a p avec fin=-5 (on ne trouve pas les macros parce que l'on ne */ /* veut pas que les macros sans arg soient vues comme des commandes */ /* mais pourquoi pas il suffirait de dire que pour visualiser une macro */ /* il faut faire disp() */ C2F(com).fun = 0; C2F(funs)(C2F(com).syn); if (C2F(com).fin > 0) { /* name is a builtin name */ if (C2F(com).char1 == equal) { /* fun=expr is not allowed */ C2F(putid)(&Ids[1 + (Pt + 1) * nsiz], C2F(com).syn); SciError(25); goto L98; } /* skip lhs analysis */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], id); Lhs = 1; Pstk[Pt] = 0; /* go to rhs analysis */ goto L60; } /* peek one character ahead */ if (C2F(com).char1 == semi || C2F(com).char1 == comma || C2F(com).char1 == eol) { C2F(putid)(id, C2F(com).syn); } if (C2F(com).char1 == lparen) { schar = C2F(com).char1; goto L30; } /* instruction is just "name", skip lhs analysis */ /* record name as lhs */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], id); Lhs = 1; Pstk[Pt] = 0; /* go to rhs analysis */ goto L60; /* name = expr or name == expr syntax */ /* ---------------------------------------- */ L25: C2F(putid)(id, C2F(com).syn); lpts = Lpt[2]; C2F(getsym)(); if (C2F(com).char1 == equal) { /* name == expr syntax ==> implicit lhs */ goto L50; } else { /* lhs found */ /* record it */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], id); Lhs = 1; Pstk[Pt] = 0; C2F(getsym)(); /* go to rhs analysis */ goto L60; } /* lhs is name(...) or name.x... */ /* ----------------------------------- */ L30: Lpt[5] = Lpt[4]; C2F(putid)(id, C2F(com).syn); /* looking for equal to check if it is really an lhs */ C2F(findequal)(&found); if (C2F(iop).err > 0) { goto L98; } if (! found) { goto L50; } /* It is really a lhs (insertion syntax) */ L32: Lpt[4] = Lpt[5]; C2F(com).char1 = schar; /* 35 call parseindexlist(excnt) */ /* if(err.gt.0) goto 98 */ if (Compil(21, &c__0, 0, 0, 0)) { if (C2F(iop).err > 0) { return 0; } } /* begin the index lists */ icount = 0; C2F(getsym)(); L33: /* begin a new index list (.,..) or .name */ ++icount; dotsep = C2F(com).sym == dot; C2F(getsym)(); if (dotsep) { /* --> new index list is .name */ if (C2F(com).sym != name) { SciError(21); if (C2F(iop).err > 0) { return 0; } } if (C2F(com).comp[0] != 0) { if (Compil(23, C2F(com).syn, 0, 0, 0)) { if (C2F(iop).err > 0) { return 0; } } } else { C2F(name2var)(C2F(com).syn); } C2F(getsym)(); /* icount=icount+1 */ if (C2F(com).sym == dot) { goto L33; } dotsep = FALSE_; excnt = 1; goto L36; } /* --> new index list is (.,..) */ L34: /* add a new index in index list (i,...) */ ++excnt; if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], id); Pstk[Pt] = excnt + icount * 1000; Rstk[Pt] = 702; /* *call* expr */ goto L81; L35: C2F(putid)(id, &Ids[1 + Pt * nsiz]); icount = Pstk[Pt] / 1000; excnt = Pstk[Pt] - icount * 1000; --Pt; if (C2F(com).sym == comma) { /* current syntax is (i,j,..) */ C2F(getsym)(); goto L34; } if (C2F(com).sym == rparen) { /* end of the current index list */ C2F(getsym)(); } else { SciError(3); if (C2F(iop).err > 0) { goto L98; } } L36: if (C2F(com).sym == lparen || C2F(com).sym == dot) { /* begining of a a new index list */ /* first memorize the previous one */ if (excnt > 1) { /* previously analysed syntax is (i,j,..)( */ if (C2F(com).comp[0] == 0) { /* form list with individual indexes i,j,.. */ C2F(mkindx)(&c__0, &excnt); if (C2F(iop).err > 0) { return 0; } } else { if (Compil(19, &c__0, excnt, 0, 0)) { if (C2F(iop).err > 0) { return 0; } } } excnt = 1; } /* open a new index list */ excnt = 0; /* icount=icount+1 */ goto L33; } /* end of all the index lists */ if (icount > 1) { /* form list with individual indexes */ if (C2F(com).comp[0] == 0) { C2F(mkindx)(&icount, &excnt); if (C2F(iop).err > 0) { return 0; } } else { if (Compil(19, &icount, excnt, 0, 0)) { if (C2F(iop).err > 0) { return 0; } } } excnt = 1; } /* end of code for recursive index */ if (Rstk[Pt] == 711) { goto L42; } if (C2F(com).sym == equal) { /* name(...) = expr syntax */ /* record name as lhs */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], id); Pstk[Pt] = excnt; Lhs = 1; C2F(getsym)(); /* go to rhs analysis */ goto L60; } else { /* this should never happen. this case has been detected above */ /* when lookin for equal sign */ /* name(...) syntax ==> really an rhs */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], ans); Lhs = 1; Pstk[Pt] = 0; goto L60; } /* multiple lhs [a,...]= or [a(..),..] */ /* ---------------------------------------- */ L40: Lpt[4] = lpts; Lpt[3] = lpts; C2F(com).char1 = blank; Lhs = 0; C2F(getsym)(); /* start lhs arguments list */ C2F(getsym)(); L41: /* begin analysis of a new lhs argument */ if (C2F(com).sym != name) { SciError(274); goto L98; } if (C2F(eqid)(C2F(com).syn, varargout)) { SciError(275); goto L98; } C2F(putid)(id, C2F(com).syn); excnt = 0; next = Lin[Lpt[4] - 2]; if (next == blank || C2F(com).char1 == comma || C2F(com).char1 == right) { /* argument followed by a blank, a comma or a ] ==> it is a simple name */ C2F(getsym)(); goto L44; } else if (C2F(com).char1 != lparen && C2F(com).char1 != dot) { /* invalid lhs */ SciError(273); goto L98; } /* lhs argument is name(..) or name.xx */ if (Eptover(1)) { goto L98; } Rstk[Pt] = 711; Lpt[5] = Lpt[4]; schar = C2F(com).char1; goto L32; /* *parse* index */ L42: --Pt; goto L44; L44: /* record current lhs arg */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], id); ++Lhs; Pstk[Pt] = excnt; Rstk[Pt] = 0; /* end analysis of a current lhs arg */ if (C2F(com).sym == right) { goto L46; } if (C2F(com).sym == comma) { C2F(getsym)(); } /* loop on lhs args */ goto L41; L46: C2F(getsym)(); if (C2F(com).sym == equal && C2F(com).char1 != equal) { /* really found a lhs go to the rhs analysis part */ C2F(getsym)(); goto L60; } /* lhs revealed to be an rhs */ /* ------------------------------------- */ L50: /* no equal symbol */ goto L51; L51: /* lhs is in fact an rhs */ /* 1 - reinititialise the parser at the instruction beginning */ Pt = pts; Lpt[4] = lpts; Lpt[3] = lpts; C2F(com).char1 = blank; /* L52: */ C2F(getsym)(); /* if(sym.eq.comma.or.sym.eq.semi) goto 52 */ /* 2 - make "ans" the lhs */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], ans); Pstk[Pt] = 0; Lhs = 1; /* 3 - go to the rhs analysis part */ goto L60; /* lhs finished, start rhs */ /* ---------------------------- */ L60: Rstk[Pt] = 703; /* *call* expr */ goto L81; L65: if (Rstk[Pt - Lhs] == 313) { /* store new variable as "named" at the top of the stack */ if (C2F(com).sym == rparen || C2F(com).sym == comma) { C2F(mrknmd)(); if (C2F(iop).err > 0) { goto L98; } goto L83; } else { SciError(40); goto L98; } } if (C2F(com).sym == semi || C2F(com).sym == comma || C2F(com).sym == eol|| C2F(com).sym == cmt) { goto L70; } if (Rstk[Pt - Lhs] == 808) {/* syntax error while in try */ /* set back the standard error handling ++++*/ Pt=Pt-Lhs; C2F(errgst).errct = Ids[2 + Pt * nsiz]; C2F(errgst).errpt = Ids[5 + Pt * nsiz]; /* forgot the catch error */ C2F(errgst).err1 = Ids[3 + Pt * nsiz]; C2F(errgst).err2 = Ids[4 + Pt * nsiz]; C2F(com).comp[0] = 0; Lpt[2] = Lpt[3]+1; SciError(276); Pt = Pt - 1; goto L98; } else { Lpt[2] = Lpt[3]+1; SciError(276); goto L98; } /* store results */ /* ------------------- */ L70: Lhs = max(Lhs,1); if (Compil(29, &(Lhs), C2F(com).sym, 0, 0)) { if (C2F(iop).err > 0) { return 0; } Pt -= Lhs; Lhs = 0; goto L77; } ndel = 0; L71: Rhs = Pstk[Pt]; lastindpos = Top - Lhs - ndel; if (C2F(errgst).err1 != 0) { goto L76; } if (Rhs == 0) { /* goto simple affectation */ C2F(stackp)(&Ids[1 + Pt * nsiz], &c__0); if (C2F(iop).err > 0) { goto L98; } if (C2F(errgst).err1 > 0) { --Pt; --Lhs; goto L98; } /* topk points on the newly saved variable */ topk = C2F(com).fin; /* go to print */ goto L73; } /* partial variable affectation (insertion) */ if (lastindpos + 1 != Top) { /* create reference variables to get index1,...,indexn, value at */ /* the top of the stack in this order */ /* create reference variables pointing to the indices */ i__2 = Rhs; for (ir = 1; ir <= i__2; ++ir) { i__3 = lastindpos - Rhs + ir; C2F(createref1)(&i__3); } /* create reference variable pointing to the value */ i__2 = Top - Rhs; C2F(createref1)(&i__2); /* remind to remove the original indices */ ndel += Rhs; } lastindpos -= Rhs; /* put a reference to the lhs variable */ C2F(com).fin = -3; C2F(stackg)(&Ids[1 + Pt * nsiz]); if (C2F(iop).err > 0) { goto L98; } /* perform insertion operation */ /* index1,...,indexn, value ==> updated lhs value (or pointer to) */ if (Eptover(1)) { goto L98; } Pstk[Pt] = Lhs; C2F(putid)(&Ids[1 + Pt * nsiz], &Ids[1 + (Pt - 1) * nsiz]); Ids[1 + (Pt - 1) * nsiz] = ndel; Ids[2 + (Pt - 1) * nsiz] = lastindpos; Rstk[Pt] = 704; Rhs += 2; Lhs = 1; C2F(com).fin = insert; /* *call* allops(insert) */ goto L91; L72: Lhs = Pstk[Pt]; ndel = Ids[1 + (Pt - 1) * nsiz]; lastindpos = Ids[2 + (Pt - 1) * nsiz]; C2F(putid)(&Ids[1 + (Pt - 1) * nsiz], &Ids[1 + Pt * nsiz]); --Pt; /* store the updated value */ C2F(stackp)(&Ids[1 + Pt * nsiz], &c__0); if (C2F(iop).err > 0) { goto L98; } if (C2F(errgst).err1 > 0) { --Pt; --Lhs; goto L98; } /* topk points on the newly saved variable */ topk = C2F(com).fin; /* remove variable containing the value if required */ if (lastindpos != Top) { --Top; } L73: /* print if required */ /* ---------------------- */ if (Lct[4] < 0 || C2F(com).fin == 0) { goto L76; } if (! ((C2F(com).sym != semi && Lct[3] == 0) || (C2F(com).sym == semi && Lct[3] == 1))) { goto L76; } L74: C2F(print)(&Ids[1 + Pt * nsiz], &topk, &C2F(iop).wte); if (C2F(iop).err > 0) { goto L98; } if (topk == 0) { goto L76; } /* overloaded display, call a macro */ if (Eptover(1)) { goto L98; } Rstk[Pt] = 708; Pstk[Pt] = C2F(com).sym; Ids[1 + Pt * nsiz] = C2F(com).sym; Ids[2 + Pt * nsiz] = ndel; Ids[3 + Pt * nsiz] = Lhs; if (C2F(com).fun == 0) { goto L88; } goto L85; L75: C2F(com).sym = Pstk[Pt]; ndel = Ids[2 + Pt * nsiz]; Lhs = Ids[3 + Pt * nsiz]; --Pt; goto L74; L76: --Pt; --Lhs; if (Lhs > 0) { goto L71; } Top -= ndel; /* finish statement */ /* --------------------- */ L77: C2F(com).fin = 0; p = 0; r = 0; if (Pt > 0) p = Pstk[Pt]; if (Pt > 0) r = Rstk[Pt]; if (C2F(iop).ddt == 4) { sprintf(tmp," finish pt:%d rstk(pt):%d pstk(pt):%d lpt(1): %d niv: %d macr:%d, paus:%d", Pt,r,p, Lpt[1],C2F(recu).niv,C2F(recu).macr,C2F(recu).paus); C2F(basout)(&io, &C2F(iop).wte,tmp, strlen(tmp)); } if (C2F(errgst).err1 != 0) { /* a catched error has occured */ if (r == 808) { /* in try instructions */ goto L80; } else if (Ids[1 + (Pt - 1) * nsiz] != 0) { /* execution is explicitly required to be stopped */ if (r == 502 && Rstk[Pt - 1] == 903) { /* in an execstr(...,'errcatch') instruction */ goto L88; } else if (r == 502 && Rstk[Pt - 1] == 909) { /* in an exec(function,'errcatch') instruction */ goto L88; } else if (r == 503 && Rstk[Pt - 1] == 902) { /* in an exec(file,'errcatch') instruction */ goto L88; } } if (C2F(errgst).err2 == 0) { C2F(errgst).err2 = C2F(errgst).err1; } if (C2F(errgst).errcatch == 1) { /* running under errcatch(num,....) */ C2F(errgst).err1 = 0; if (Pt 0) { goto L98; } switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L15; case 8: goto L80; case 9: goto L85; } if (Pt <= 0) { goto L15; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; } goto L99; L81: C2F(recu).icall = 0; C2F(expr)(); if (C2F(iop).err > 0) { goto L98; } switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L15; case 8: goto L80; case 9: goto L85; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; } goto L99; L82: C2F(recu).icall = 0; C2F(terme)(); if (C2F(iop).err > 0) { goto L98; } switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L15; case 8: goto L80; case 9: goto L85; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; } goto L99; L83: C2F(recu).icall = 0; C2F(fact)(); if (C2F(iop).err > 0) { goto L98; } switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L15; case 8: goto L80; case 9: goto L85; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; } goto L99; L85: C2F(recu).icall = 0; if (C2F(com).fun == C2F(recu).krec) { if (C2F(com).fun > 0) { SciError(22); goto L98; } } if (C2F(errgst).err1 != 0) { if (Rstk[Pt] / 100 == 9) { if (Rstk[Pt] >= 901 && Rstk[Pt] <= 909) { /* *call* matfns */ return 0; } else { --Pt; goto L86; } } else { goto L86; } } /* compilation matfns: <100*fun rhs lhs fin> */ if (Compil( C2F(com).fun * 100, &(Rhs), Lhs, C2F(com).fin, 0)) { if (C2F(iop).err > 0) { goto L98; } goto L86; } else { /* *call* matfns */ return 0; } L86: if (C2F(iop).err > 0) { goto L98; } switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L15; case 8: goto L80; case 9: goto L85; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; } goto L98; L88: C2F(recu).icall = 0; C2F(macro)(); if (C2F(iop).err > 0) { goto L98; } switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L10; case 8: goto L80; case 9: goto L85; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; case 10: goto L89; } goto L99; L89: C2F(com).fun = 99; return 0; L90: C2F(recu).icall = 0; C2F(run)(); if (C2F(iop).err > 0) { goto L98; } if (C2F(com).fun == 99) { return 0; } /* last label is used to handle return from abort */ switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L15; case 8: goto L80; case 9: goto L85; case 10: goto L5; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; case 10: goto L89; } goto L99; L91: C2F(recu).icall = 0; C2F(allops)(); if (C2F(iop).err > 0) { goto L98; } switch ((int)C2F(recu).icall) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L15; case 8: goto L80; case 9: goto L85; } r = Rstk[Pt] / 100; switch ((int)r) { case 1: goto L81; case 2: goto L82; case 3: goto L83; case 4: goto L91; case 5: goto L88; case 6: goto L90; case 7: goto L92; case 8: goto L80; case 9: goto L85; } goto L98; L92: switch ((int)(Rstk[Pt] - 700)) { case 1: goto L17; case 2: goto L35; case 3: goto L65; case 4: goto L72; case 5: goto L65; case 6: goto L97; case 7: goto L94; case 8: goto L75; case 9: goto L99; case 10: goto L14; } goto L99; L93: /* command like function and macro call */ /* store ans as lhs */ if (Eptover(1)) { goto L98; } C2F(putid)(&Ids[1 + Pt * nsiz], ans); Pstk[Pt] = 0; Rstk[Pt] = 707; if (C2F(com).fun > 0) { /* *call* matfns */ goto L85; } else { if (C2F(com).comp[0] != 0) { ++Rhs; C2F(com).fin = extrac; /* *call* allops(extrac) */ goto L91; } else { C2F(com).fin = Lstk[C2F(com).fin]; /* *call* macro */ goto L88; } } L94: /* go to store code */ goto L70; L96: /* asynchronous events handling */ C2F(basbrk).interruptible = C2F(getmen)(C2F(cha1).buf, &lb, &nentry) == 0; C2F(bexec)(C2F(cha1).buf, &lb, &ierr); if (ierr != 0) { goto L15; } if (Eptover(1)) { goto L98; } Pstk[Pt] = Top; Rstk[Pt] = 706; Ids[1 + Pt * nsiz] = iret; /* *call* macro */ goto L88; L97: Top = Pstk[Pt] - 1; C2F(basbrk).interruptible = TRUE_; iret = Ids[1 + Pt * nsiz]; --Pt; if (iret == 1) { goto L15; } else if (iret == 2) { if (Lpt[6] == Lpt[1]) { job = 0; } else { /* go ahead with interrupted continuation line */ job = 3; } C2F(com).sym = eol; goto L13; } else if (iret == 3) { job = 0; goto L12; } else if (iret == 4) { return 0; } L98: C2F(basbrk).interruptible = TRUE_; /* error recovery */ /* ------------------- */ imode = abs(C2F(errgst).errct) / 100000; imode -= imode / 8 << 3; if (imode == 3) { C2F(com).fun = 99; return 0; } /* error in an external (niv), during compilation (comp) or in a pause */ if (Pt != 0) { if (Rstk[Pt] == 503 && C2F(iop).rio == C2F(iop).rte) { C2F(com).comp[0] = 0; goto L12; } if (C2F(errgst).err1 != 0 && Rstk[Pt] == 502) { /* catched error while compiling */ goto L88; } } if (C2F(recu).niv > 0) { /* error in an external */ C2F(com).fun = 99; return 0; } else if (C2F(recu).paus>0) {/* error in a pause */ C2F(com).comp[0] = 0; goto L5; } else if (Err>0) { Pt=0; C2F(errgst).errct=-1; C2F(errgst).errpt=0; C2F(com).comp[0] = 0; goto L5; } else { C2F(com).comp[0] = 0; goto L5; } L99: SciError(22); goto L1; } /* C2F(parse) */ void handle_onprompt(int *where) { /* Initialized data */ static int onprompt[6] = { 420943928,420878363,673720349,673720360, 673720360,673720360 }; static int *Rstk = C2F(recu).rstk-1; static int *Pstk = C2F(recu).pstk-1; static int *Lstk = C2F(vstk).lstk-1; *where = 0; if (Pt > 0) { /* back from %onprompt */ C2F(errgst).errct = Pstk[Pt]; --Pt; C2F(errgst).err2 = 0; Top = 0; C2F(com).fin = 0; C2F(com).fun = 0; } else { /* on prompt implicit execution */ C2F(com).fun = 0; C2F(funs)(onprompt); if (C2F(iop).err > 0) return; if (C2F(com).fun <= 0 && C2F(com).fin == 0) return; /* %onprompt function exists */ Rhs = 0; Lhs = 1; ++Pt; Pstk[Pt] = C2F(errgst).errct; Rstk[Pt] = 710; /* set error catch with mode continue */ C2F(errgst).errct = -100001; C2F(errgst).errpt = 1; if (C2F(com).fun > 0) { /* %onprompt is a primitive *call* matfns */ *where = 1; } else { /* %onprompt is a Scilab function *call* macro */ C2F(com).fin = Lstk[C2F(com).fin]; *where = 2; } } } /* handleonprompt */ int C2F(syncexec)(str, ns, ierr, seq, str_len) char *str; int *ns, *ierr, *seq; long int str_len; { /* Local variables */ int Pts, Tops; extern int C2F(iset)(); extern int C2F(callinterf)(), C2F(ref2val)(); static int iflagint; static int k; static int ir; static int *Ids = C2F(recu).ids-nsiz-1; static int *Rstk = C2F(recu).rstk-1; static int *Lstk = C2F(vstk).lstk-1; static int *Infstk = C2F(vstk).infstk-1; Pt = max(Pt,0);Pts=Pt; Top = max(Top,0);Tops=Top; C2F(basbrk).interruptible = *seq != 0; C2F(bexec)(str, ns, ierr, (*ns)); if (*ierr != 0) { goto L9998; } /* + */ if (Eptover(1)) { goto L9998; } Ids[1 + Pt * nsiz] = Lhs; Ids[2 + Pt * nsiz] = Rhs; Ids[3 + Pt * nsiz] = C2F(com).sym; Rstk[Pt] = 1002; ++C2F(recu).niv; C2F(com).fun = 0; C2F(recu).icall = 5; /* code translated from callinterf.h */ L60: C2F(parse)(); if (C2F(iop).err > 0) { goto L9999; } if (C2F(com).fun == 99) { C2F(com).fun = 0; goto L200; } if (Rstk[Pt] / 100 == 9) { ir = Rstk[Pt] - 900; if (ir == 1) { /* back to matsys */ k = 13; } else if (ir >= 2 && ir <= 9) { /* back to matio */ k = 5; } else if (ir == 10) { /* end of overloaded function */ goto L96; } else if (ir > 40) { /* back to matus2 */ k = 24; } else if (ir > 20) { /* back to matusr */ k = 14; } else { goto L89; } iflagint = 0; goto L95; } L89: if (Top < Rhs) { SciError(22); goto L9999; } if (Top - Rhs + Lhs + 1 >= C2F(vstk).bot) { SciError(18); goto L9999; } goto L91; L90: if (C2F(iop).err > 0) { goto L9999; } L91: k = C2F(com).fun; C2F(com).fun = 0; if (k == C2F(recu).krec) { C2F(recu).krec = -1; SciError(22); goto L9999; } C2F(recu).krec = -1; if (k == 0) { goto L60; } L95: if (! C2F(allowptr)(&k)) { C2F(ref2val)(); } C2F(recu).krec = k; C2F(callinterf)(&k, &iflagint); /* if (k.eq.krec) krec=99999 */ C2F(recu).krec = -1; if (C2F(com).fun >= 0) { if (Top - Lhs + 1 > 0) { C2F(iset)(&Rhs, &c__0, &Infstk[Top - Lhs+1], &c__1); } goto L90; } /* called interface ask for a scilab function to perform the function (fun=-1) */ /* the function name is given in ids(1,pt+1) */ C2F(ref2val)(); C2F(com).fun = 0; C2F(funs)(&Ids[1 + (Pt + 1) * nsiz]); if (C2F(iop).err > 0) { goto L9999; } if (C2F(com).fun > 0) { goto L91; } if (C2F(com).fin == 0) { SciError(246); if (C2F(iop).err > 0) { goto L9999; } goto L90; } ++Pt; C2F(com).fin = Lstk[C2F(com).fin]; Rstk[Pt] = 910; C2F(recu).icall = 5; C2F(com).fun = 0; /* *call* macro */ goto L60; L96: --Pt; goto L90; /* End of callinterf.h code */ L200: Lhs = Ids[1 + Pt * nsiz]; Rhs = Ids[2 + Pt * nsiz]; C2F(com).sym = Ids[3 + Pt * nsiz]; --Pt; --Top; /* + */ --C2F(recu).niv; *ierr = 0; C2F(recu).icall = 0; C2F(com).fin = 3; C2F(basbrk).interruptible = TRUE_; return 0; L9998: *ierr = 1; Pt=Pts;Top=Tops; C2F(basbrk).interruptible = TRUE_; return 0; L9999: /* Err == 9999999 arises if abort has been used to terminate the callback execution */ if (Err != 9999999) *ierr = 1; --Top; --C2F(recu).niv; Pt=Pts;Top=Tops; C2F(basbrk).interruptible = TRUE_; return 0; } /* syncexec */ void C2F(parsecomment)() /* Copyright INRIA */ { static int *Lstk = C2F(vstk).lstk-1; static int *Lin = C2F(iop).lin-1; static int *Lpt = C2F(iop).lpt-1; static int *Comp = C2F(com).comp-1; static int *Istk = (int *)( C2F(stack).Stk)-1; static integer l, ll, lkp, l0,c1=1; /* look for eol */ l0=Lpt[4]-1; if( (Lin[l0]==slash) &&(Lin[l0-1]==slash)&(Lin[l0+1]==eol)) /* Correction Warning */ l0=l0+1; l=l0; while (Lin[l]!=eol) l++; ll = l - l0; if (Comp[1] == 0) { /* ignore all characters up to the end */ } else { /* compilation [30 number-of-char chars-vector] */ lkp = C2F(com).comp[0]; C2F(iop).err = (lkp + 2 + ll) / 2 + 1 - Lstk[C2F(vstk).bot]; if (C2F(iop).err > 0) { SciError(17); return ; } Istk[lkp] = 31; Istk[lkp+1] = ll; C2F(icopy)(&ll, &(Lin[l0]), &c1, &(Istk[lkp+2]), &c1); Comp[1] = lkp + 2 + ll; } Lpt[4] = l; C2F(com).char1 = eol; C2F(com).sym = eol; return ; } /* parsecomment */