/*     ==================================================================== */
/*     Scilab parsing function */
/*     ==================================================================== */
/*     Copyright INRIA, S. Steer */
/* *------------------------------------------------------------------ */
#include <string.h>
#include <stdio.h>
#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 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)();

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 *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 otimer = 0;
  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 ntimer;
  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) {
    ntimer = C2F(stimer)() / itime;
    if (ntimer != otimer) {
      C2F(sxevents)();
      otimer = ntimer;
      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;
  }
  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 (Ids[1 + (Pt - 1) * nsiz] != 0) {
      /* execution is explicitly required to be stopped */
      if (Rstk[Pt] == 502 && Rstk[Pt - 1] == 903) {
	/* in an execstr(...,'errcatch') instruction */
	goto L88;
      } else if (Rstk[Pt] == 502 && Rstk[Pt - 1] == 909) {
	/* in an exec(function,'errcatch') instruction */
	goto L88;
      } else if (Rstk[Pt] == 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<C2F(errgst).errpt) C2F(errgst).errcatch = 0;
    }

    imode = (i__2 = C2F(errgst).errct / 100000, abs(i__2));
    if (imode - (imode / 8 << 3) == 2) {
      C2F(basbrk).iflag = TRUE_;
    }
  }
  C2F(errgst).toperr = Top;
  /*     fin instruction */
  if (C2F(com).sym != eol) {
    if (C2F(com).sym == cmt){
      C2F(parsecomment)();}
    else
      goto L15;
  }
  /*     gestion des points d'arrets dynamiques */
  if (C2F(dbg).wmac != 0) {
    i__2 = Lpt[2] - 1;
    C2F(whatln)(&Lpt[1], &i__2, &Lpt[6], &nlc, &l1, &ifin);
    i__2 = C2F(dbg).lgptrs[C2F(dbg).wmac] - 1;
    for (ibpt = C2F(dbg).lgptrs[C2F(dbg).wmac - 1]; ibpt <= i__2; ++ibpt) {
      if (Lct[8] - nlc == C2F(dbg).bptlg[ibpt - 1]) {
	C2F(cvname)(&C2F(dbg).macnms[C2F(dbg).wmac * nsiz - 6], tmp, &c__1, 24L);
	sprintf(C2F(cha1).buf,"%s %5d",tmp, Lct[8] - nlc);
	Msgs(32,0);
	i__3 = ifin - l1 + 1;
	C2F(cvstr)(&i__3, &Lin[l1], C2F(cha1).buf, &c__1, bsiz);
	C2F(basout)(&io, &C2F(iop).wte, C2F(cha1).buf, ifin - l1 + 1);
	C2F(basbrk).iflag = TRUE_;
	goto L79;
      }
    }
  }
 L79:

  if (C2F(com).comp[0] != 0) {
    C2F(seteol)();
  }
  /*     EOL */
  if (r / 100 != 8) {
    goto L10;
  }
  /*     end of an instruction or a clause */
  if (C2F(com).comp[0] != 0) {
    k = Lpt[6];
    if (Lin[k - 1] == eol && Lin[k] == eol) {
      SciError(47);
      goto L98;
    }
  }
  if (Lpt[4] == Lpt[6]) {
    /*         call getlin(1,0) */
    goto L13;
  } else {
    ++Lpt[4];
    C2F(getsym)();
  }
  goto L15;

  /*     simulate recursion */
  /* ----------------------- */
 L80:
  C2F(recu).icall = 0;
  C2F(clause)();
  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;
  }
  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;
    }
    /*     added 16/04/97 */
    if (C2F(errgst).err1 != 0 && Rstk[Pt] == 502) {
      /*     catched error while compiling */
      goto L88;
    }
  }
  /*     error in an external */
  if (C2F(recu).niv > 0) {
    C2F(com).fun = 99;
    return 0;
  } else {
    /*     error in a  pause */
    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 */
  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;

   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(com).fun == 99) {
    C2F(com).fun = 0;
    goto L200;
  }
  if (C2F(iop).err > 0) {
    goto L9999;
  }

  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;
  return 0;
 L9998:
  *ierr = 1;
  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;
  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 */


