shell.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:63k
源码类别:

VxWorks

开发平台:

C/C++

  1. # line 2 "shell.yacc"
  2. /* shell.yacc - grammar for VxWorks shell */
  3. /* Copyright 1984-2001 Wind River Systems, Inc. */
  4. #include "copyright_wrs.h"
  5. /*
  6. modification history
  7. --------------------
  8. 07m,16oct01,jn   use symFindSymbol for symbol lookups
  9. 07l,27nov01,pch  Provide floating-point exclusion based on _WRS_NO_TGT_SHELL_FP
  10.  definition instead of testing a specific CPU type.
  11. 07k,23oct01,fmk  Do not call symFindByValue and print symbol name if symbol
  12.                  value = -1 SPR 22254
  13. 07j,04sep98,cdp  apply 07i for all ARM CPUs with ARM_THUMB==TRUE.
  14. 07i,30jul97,cdp  for ARM7TDMI_T, force calls to be in Thumb state.
  15. 07h,31may96,ms   added in patch for SPR 4439.
  16. 07g,19mar95,dvs  removed tron references.
  17. 07f,02mar95,yao  removed floating point temporarily for PPC403.
  18. 07e,19mar95,dvs  removed tron references.
  19. 07d,13feb93,kdl  changed cplusLib.h to private/cplusLibP.h (SPR #1917).
  20. 07c,03sep92,wmd  modified addArg() to pass floats correcty for the i960.
  21. 07b,03sep92,rrr  reduced max function arguments from 16 to 12 (for i960).
  22. 07a,31aug92,kdl  fixed passing of more than 10 parameters during funcCall();
  23.  changed MAX_ARGS to MAX_SHELL_ARGS.
  24. 06z,19aug92,jmm  fixed problem with not recognizing <= (SPR 1517)
  25. 06y,01aug92,srh  added C++ demangling idiom to printSym.
  26.                  added include of cplusLib.h.
  27. 06x,20jul92,jmm  added group parameter to symAdd call
  28. 06w,23jun92,kdl  increased max function arguments from 10 to 16.
  29. 06v,22jun92,jmm  backed out 6u change, now identical to gae's 21dec revision
  30. 06u,22jun92,jmm  added group parameter to symAdd
  31. 06t,21dec91,gae  more ANSI cleanups.
  32. 06s,19nov91,rrr  shut up some warnings.
  33. 06r,05oct91,rrr  changed strLib.h to string.h
  34. 06q,02jun91,del  added I960 parameter alignment fixes.
  35. 06p,10aug90,kdl  added forward declarations for functions returning VOID.
  36. 06o,10jul90,dnw  spr 738: removed checking of access (checkAccess, chkLvAccess)
  37.    Access checking did vxMemProbe with 4 byte read, which
  38.    caused problems with memory or devices that couldn't do
  39.    4 byte reads but could do other types of access.
  40.    Access checking was actually a throw-back to a time when
  41.    the shell couldn't recover from bus errors, but it can now.
  42.    So I just deleted the access checking.
  43.  lint clean-up, esp to allow VOID to be void one day.
  44. 06n,10dec89,jcf  symbol table type now a SYM_TYPE.
  45. 06m,09aug89,gae  fixed copyright notice.
  46. 06l,30jul89,gae  changed obsolete sysMemProbe to vxMemProbe. 
  47. 06k,07jul88,jcf  changed malloc to match new declaration.
  48. 06j,30may88,dnw  changed to v4 names.
  49. 06i,01apr88,gae  made it work with I/O system changes -- io{G,S}etGlobalStd().
  50. 06h,20feb88,dnw  lint
  51. 06g,14dec87,dnw  removed checking for odd byte address access.
  52.  changed printing format of doubles from "%f" to "%g". 
  53. 06f,18nov87,gae  made assignment to be of type specified by rhs.
  54. 06e,07nov87,gae  fixed undefined symbol bug.
  55.  fixed history bug by redirecting LED I/O.
  56. 06d,03nov87,ecs  documentation.
  57. 06c,28oct87,gae  got rid of string type.
  58. 06b,06oct87,gae  split off "execution" portion to shellExec.c.
  59.  changed to use conventional C type casting.
  60.  provided more info for invalid yacc operations.
  61.  allowed expressions to be function addresses.
  62. 06a,01jun87,gae  added interpretation of bytes, words, floats, doubles;
  63.    expressions can now be "typed" a la assembler, .[bwfdls].
  64.  fixed redirection bug with ">>" and "<<".
  65. 05i,16jul87,ecs  fixed newSym so that new symbols will be global.
  66. 05h,01apr87,gae  made assign() not print "new value" message (duplicated
  67.    normal "value" message for expressions.
  68. 05g,25apr87,gae  fixed bug in assign() that allowed memory corruption.
  69.  checked h() parameter for greater than or equal to zero.
  70.  improved redirection detection.
  71.  now parse assignments correctly as expressions.
  72. 05f,01apr87,ecs  added include of strLib.h.
  73. 05e,20jan87,jlf  documentation.
  74. 05d,14jan87,gae  got rid of unused curLineNum.  h() now has parameter, if
  75.    non-zero then resets history to that size.
  76. 05c,20dec86,dnw  changed to not get include files from default directories.
  77. 05b,18dec86,gae  made history initialization only happen on first start of
  78.    shell.  Added neStmt to fix empty stmt assignment bug.
  79. 05a,17dec86,gae  use new shCmd() in execShell() to do Korn shell-like input.
  80. 04q,08dec86,dnw  changed shell.slex.c to shell_slex.c for VAX/VMS compatiblity.
  81.     jlf  fixed a couple bugs causing problems mainly on Heurikon port.
  82. 04p,24nov86,llk  deleted SYSTEM conditional compiles.
  83. 04o,08oct86,gae  added C assignment operators; allowed multiple assignment.
  84.  STRINGs are no longer temporary.  Added setShellPrompt().
  85. 04n,27jul86,llk  added standard error fd, setOrigErrFd.
  86. 04m,17jun86,rdc  changed memAllocates to mallocs.
  87. 04l,08apr86,dnw  added call to vxSetTaskBreakable to make shell unbreakable.
  88.  changed sstLib calls to symLib.
  89. 04k,02apr86,rdc  added routines setOrigInFd and setOrigOutFd.
  90. 04j,18jan86,dnw  removed resetting (flushing) for standard in/out upon restarts;
  91.    this is now done more appropriately by the shell restart
  92.    routine in dbgLib.
  93. ...deleted pre 86 history - see RCS
  94. */
  95. /*
  96. DESCRIPTION
  97. This is the parser for the VxWorks shell, written in yacc.
  98. It provides the basic programmer's interface to VxWorks.
  99. It is a C expression interpreter, containing no built-in commands.  
  100. SEE ALSO: "Shell"
  101. */
  102. #include "vxWorks.h"
  103. #include "sysSymTbl.h"
  104. #include "errno.h"
  105. #include "errnoLib.h"
  106. #include "ioLib.h"
  107. #include "taskLib.h"
  108. #include "stdio.h"
  109. #include "private/cplusLibP.h"
  110. #define YYSTYPE VALUE /* type of parse stack */
  111. #define MAX_SHELL_LINE 128 /* max chars on line typed to shell */
  112. #define MAX_SHELL_ARGS 30 /* max number of args on stack */
  113. #define MAX_FUNC_ARGS 12 /* max number of args to any one function */
  114. /*  NOTE: The array indices in funcCall()
  115.  *        must agree with MAX_FUNC_ARGS!!
  116.  */
  117. #define BIN_OP(op) rvOp((getRv(&yypvt[-2], &tmpVal1)), op, 
  118.       getRv(&yypvt[-0], &tmpVal2))
  119. #define RV(value) (getRv (&(value), &tmpVal2))
  120. #define NULLVAL (VALUE *) NULL
  121. #define CHECK if (semError) YYERROR
  122. #define SET_ERROR semError = TRUE
  123. typedef enum /* TYPE */
  124.     {
  125.     T_UNKNOWN,
  126.     T_BYTE,
  127.     T_WORD,
  128. #ifndef _WRS_NO_TGT_SHELL_FP
  129.     T_INT,
  130.     T_FLOAT,
  131.     T_DOUBLE
  132. #else /* _WRS_NO_TGT_SHELL_FP */
  133.     T_INT
  134. #endif /* _WRS_NO_TGT_SHELL_FP */
  135.     } TYPE;
  136. typedef enum /* SIDE */
  137.     {
  138.     LHS,
  139.     RHS,
  140.     FHS /* function: rhs -> lhs */
  141.     } SIDE;
  142. typedef struct /* VALUE */
  143.     {
  144.     SIDE side;
  145.     TYPE type;
  146.     union
  147. {
  148. int *lv; /* pointer to any of the below */
  149. char byte;
  150. short word;
  151. int rv;
  152. char *string;
  153. #ifndef _WRS_NO_TGT_SHELL_FP
  154. float fp;
  155. double dp;
  156. #endif /* _WRS_NO_TGT_SHELL_FP */
  157. } value;
  158.     } VALUE;
  159. IMPORT int redirInFd;
  160. IMPORT int redirOutFd;
  161. LOCAL BOOL semError; /* TRUE = semantic error found */
  162. LOCAL VALUE tmpVal1; /* used by BIN_OP above for expression evaluation */
  163. LOCAL VALUE tmpVal2; /* used by BIN_OP above for expression evaluation */
  164. LOCAL int argStack [MAX_SHELL_ARGS]; /* arguments to functions */
  165. LOCAL int nArgs; /* number of args currently on argStack */
  166. LOCAL BOOL usymFlag; /* TRUE = U_SYMBOL has been seen */
  167. LOCAL VALUE usymVal; /* value of U_SYMBOL which has been seen */
  168. LOCAL BOOL spawnFlag; /* TRUE if spawn is first parameter in argStack[] */
  169. # define NL 0
  170. # define T_SYMBOL 258
  171. # define D_SYMBOL 259
  172. # define U_SYMBOL 260
  173. # define NUMBER 261
  174. # define CHAR 262
  175. # define STRING 263
  176. # define FLOAT 264
  177. # define OR 265
  178. # define AND 266
  179. # define EQ 267
  180. # define NE 268
  181. # define GE 269
  182. # define LE 270
  183. # define INCR 271
  184. # define DECR 272
  185. # define ROT_LEFT 273
  186. # define ROT_RIGHT 274
  187. # define UMINUS 275
  188. # define PTR 276
  189. # define TYPECAST 277
  190. # define ENDFILE 278
  191. # define LEX_ERROR 279
  192. # define MULA 280
  193. # define DIVA 281
  194. # define MODA 282
  195. # define ADDA 283
  196. # define SUBA 284
  197. # define SHLA 285
  198. # define SHRA 286
  199. # define ANDA 287
  200. # define ORA 288
  201. # define XORA 289
  202. # define UNARY 290
  203. #ifdef __STDC__
  204. #include <stdlib.h>
  205. #include <string.h>
  206. #else
  207. #include <malloc.h>
  208. #include <memory.h>
  209. #endif
  210. #if defined(__cplusplus) || defined(__STDC__)
  211. #if defined(__cplusplus) && defined(__EXTERN_C__)
  212. extern "C" {
  213. #endif
  214. #ifndef yyerror
  215. #if defined(__cplusplus)
  216. void yyerror(const char *);
  217. #endif
  218. #endif
  219. #ifndef yylex
  220. int yylex(void);
  221. #endif
  222. int yyparse(void);
  223. #if defined(__cplusplus) && defined(__EXTERN_C__)
  224. }
  225. #endif
  226. #endif
  227. #define yyclearin yychar = -1
  228. #define yyerrok yyerrflag = 0
  229. extern int yychar;
  230. extern int yyerrflag;
  231. #ifndef YYSTYPE
  232. #define YYSTYPE int
  233. #endif
  234. YYSTYPE yylval;
  235. YYSTYPE yyval;
  236. typedef int yytabelem;
  237. #ifndef YYMAXDEPTH
  238. #define YYMAXDEPTH 150
  239. #endif
  240. #if YYMAXDEPTH > 0
  241. int yy_yys[YYMAXDEPTH], *yys = yy_yys;
  242. YYSTYPE yy_yyv[YYMAXDEPTH], *yyv = yy_yyv;
  243. #else /* user does initial allocation */
  244. int *yys;
  245. YYSTYPE *yyv;
  246. #endif
  247. static int yymaxdepth = YYMAXDEPTH;
  248. # define YYERRCODE 256
  249. # line 335 "shell.yacc"
  250. #include "a_out.h"
  251. #include "ctype.h"
  252. #include "stdlib.h"
  253. #include "string.h"
  254. #include "symLib.h"
  255. #include "shell_slex_c"
  256. /* forward declarations */
  257. LOCAL int newString ();
  258. LOCAL VALUE *getRv ();
  259. LOCAL int *getLv ();
  260. LOCAL VALUE evalExp ();
  261. #ifndef _WRS_NO_TGT_SHELL_FP
  262. LOCAL void doubleToInts ();
  263. #endif /* _WRS_NO_TGT_SHELL_FP */
  264. LOCAL void setRv ();
  265. LOCAL void typeConvert ();
  266. LOCAL BOOL checkLv ();
  267. LOCAL BOOL checkRv ();
  268. /*******************************************************************************
  269. *
  270. * yystart - initialize local variables
  271. *
  272. * NOMANUAL
  273. */
  274. void yystart (line)
  275.     char *line;
  276.     {
  277.     lexNewLine (line);
  278.     semError = FALSE;
  279.     usymFlag = FALSE;
  280.     nArgs = 0;
  281.     spawnFlag = FALSE;
  282.     }
  283. /*******************************************************************************
  284. *
  285. * yyerror - report error
  286. *
  287. * This routine is called by yacc when an error is detected.
  288. */
  289. LOCAL void yyerror (string)
  290.     char *string;
  291.     {
  292.     if (semError) /* semantic errors have already been reported */
  293. return;
  294.     /* print error depending on what look-ahead token is */
  295.     switch (yychar)
  296. {
  297. case U_SYMBOL: /* U_SYM not at beginning of line */
  298.     printf ("undefined symbol: %sn", (char *) yylval.value.rv);
  299.     break;
  300. case LEX_ERROR:      /* lex should have already reported the problem */
  301.     break;
  302. default:
  303.     if (usymFlag)    /* leading U_SYM was followed by invalid assign */
  304. printf ("undefined symbol: %sn", (char *)usymVal.value.rv);
  305.     else
  306. printf ("%sn", string);
  307.     break;
  308. }
  309.     }
  310. /*******************************************************************************
  311. *
  312. * rvOp - sets rhs of yyval to evaluated expression
  313. */
  314. LOCAL void rvOp (pY1, op, pY2)
  315.     VALUE *pY1;
  316.     int op;
  317.     VALUE *pY2;
  318.     {
  319.     VALUE yy;
  320.     yy = evalExp (pY1, op, pY2);
  321.     setRv (&yyval, &yy);
  322.     }
  323. /*******************************************************************************
  324. *
  325. * assign - make assignment of new value to a cell
  326. */
  327. LOCAL void assign (pLv, pRv)
  328.     FAST VALUE *pLv; /* lhs to be assigned into */
  329.     FAST VALUE *pRv; /* rhs value */
  330.     {
  331.     VALUE val;
  332.     /* verify that lv can be assigned to, then make the assignment */
  333.     if (checkLv (pLv) && checkRv (pRv))
  334. {
  335. (void)getRv (pRv, &val);
  336. /* make value agree in type */
  337. pLv->type = pRv->type;
  338. typeConvert (&val, pLv->type, RHS);
  339. switch (pLv->type)
  340.     {
  341.     case T_BYTE:
  342. * (char *)getLv (pLv) = val.value.byte;
  343. break;
  344.     case T_WORD:
  345. * (short *)getLv (pLv) = val.value.word;
  346. break;
  347.     case T_INT:
  348. *getLv (pLv) = val.value.rv;
  349. break;
  350. #ifndef _WRS_NO_TGT_SHELL_FP
  351.     case T_FLOAT:
  352. * (float *)getLv (pLv) = val.value.fp;
  353. break;
  354.     case T_DOUBLE:
  355. * (double *)getLv (pLv) = val.value.dp;
  356. break;
  357. #endif /* _WRS_NO_TGT_SHELL_FP */
  358.     default:
  359. printf ("bad assignment.n");
  360. SET_ERROR;
  361.     }
  362. }
  363.     else
  364. {
  365. printf ("bad assignment.n");
  366. SET_ERROR;
  367. }
  368.     }
  369. /*******************************************************************************
  370. *
  371. * newString - allocate and copy a string
  372. */
  373. LOCAL int newString (string)
  374.     char *string;
  375.     {
  376.     int length    = strlen (string) + 1;
  377.     char *address = (char *) malloc ((unsigned) length);
  378.     if (address == NULL)
  379. {
  380. printf ("not enough memory for new string.n");
  381. SET_ERROR;
  382. }
  383.     else
  384. bcopy (string, address, length);
  385.     return ((int)address);
  386.     }
  387. /*******************************************************************************
  388. *
  389. * newSym - allocate a new symbol and add to symbol table
  390. */
  391. LOCAL VALUE newSym (name, type)
  392.     char *name;
  393.     TYPE type;
  394.     {
  395.     VALUE value;
  396.     void *address = (void *) malloc (sizeof (double));
  397.     if (address == NULL)
  398. {
  399. printf ("not enough memory for new variable.n");
  400. SET_ERROR;
  401. }
  402.     else if (symAdd (sysSymTbl, name, (char *) address, (N_BSS | N_EXT),
  403.                      symGroupDefault) != OK)
  404. {
  405. free ((char *) address);
  406. printf ("can't add '%s' to system symbol table - error = 0x%x.n",
  407. name, errnoGet());
  408. SET_ERROR;
  409. }
  410.     else
  411. {
  412. printf ("new symbol "%s" added to symbol table.n", name);
  413. value.side = LHS;
  414. value.type = type;
  415. value.value.lv = (int *) address;
  416. }
  417.     return (value);
  418.     }
  419. /*******************************************************************************
  420. *
  421. * printSym - print symbolic value
  422. */
  423. LOCAL void printSym (val, prefix, suffix)
  424.     FAST int val;
  425.     char *prefix;
  426.     char *suffix;
  427.     {
  428.     void *    symVal;  /* symbol value      */
  429.     SYMBOL_ID symId;   /* symbol identifier */
  430.     char *    name;    /* symbol name       */
  431.     char      demangled [MAX_SYS_SYM_LEN + 1];
  432.     char *    nameToPrint;
  433.     /* Only search for symbol value and print symbol name if value is not -1 */
  434.     
  435.         if ((val != -1) && 
  436.     (symFindSymbol (sysSymTbl, NULL, (void *)val, 
  437.         SYM_MASK_NONE, SYM_MASK_NONE, &symId) == OK) &&
  438.     (symNameGet (symId, &name) == OK) &&
  439.     (symValueGet (symId, &symVal) == OK) &&
  440.     (symVal != 0) && ((val - (int)symVal) < 0x1000))
  441.     {
  442.     printf (prefix);
  443.     nameToPrint = cplusDemangle(name, demangled, sizeof (demangled));
  444.     if (val == (int) symVal)
  445.         printf ("%s", nameToPrint);
  446.     else
  447.         printf ("%s + 0x%x", nameToPrint, val - (int) symVal);
  448.     printf (suffix);
  449.     }
  450.     
  451.     }
  452. /*******************************************************************************
  453. *
  454. * newArgList - start a new argument list
  455. */
  456. LOCAL VALUE newArgList ()
  457.     {
  458.     VALUE value;
  459.     value.side    = RHS;
  460.     value.type    = T_INT;
  461.     value.value.rv = nArgs;
  462.     return (value);
  463.     }
  464. /*******************************************************************************
  465. *
  466. * addArg - add an argument to an argument list
  467. */
  468. LOCAL void addArg (pArgList, pNewArg)
  469.     VALUE *pArgList;
  470.     FAST VALUE *pNewArg;
  471.     {
  472.     VALUE val;
  473.     int partA;
  474.     int partB;
  475. #if CPU_FAMILY==I960
  476.     int nArgsSave;
  477. #endif
  478. #ifndef _WRS_NO_TGT_SHELL_FP
  479.     BOOL isfloat = pNewArg->type == T_FLOAT || pNewArg->type == T_DOUBLE;
  480. #endif /* _WRS_NO_TGT_SHELL_FP */
  481.     SYMBOL_ID   symId;  /* symbol identifier           */
  482.     SYM_TYPE    sType;  /* place to return symbol type */
  483. #ifndef _WRS_NO_TGT_SHELL_FP
  484.     if (isfloat)
  485. #if CPU_FAMILY!=I960
  486. nArgs++; /* will need an extra arg slot */
  487. #else /* CPU_FAMILY!=I960 */
  488. {
  489. nArgsSave = nArgs;
  490. if (spawnFlag)
  491.     {
  492.     if ((nArgs %2) == 0)
  493.    nArgs++;
  494.     }
  495. else
  496.     {
  497.     nArgs += nArgs % 2; /* conditionally borrow slot to double align */
  498.     nArgs++; /* borrow second slot for double-word value  */
  499.     }
  500. }
  501. #endif /* CPU_FAMILY!=I960 */
  502. #endif /* _WRS_NO_TGT_SHELL_FP */
  503.     if (nArgs == MAX_SHELL_ARGS || 
  504.         (nArgs - pArgList->value.rv) == MAX_FUNC_ARGS)
  505. {
  506. #ifndef _WRS_NO_TGT_SHELL_FP
  507. if (isfloat)
  508. #if CPU_FAMILY!=I960
  509.     nArgs--; /* return borrowed slot */
  510. #else  /* CPU_FAMILY!=I960 */
  511.     nArgs = nArgsSave; /* return borrowed slot(s) */
  512. #endif /* CPU_FAMILY!=I960 */
  513. #endif /* _WRS_NO_TGT_SHELL_FP */
  514. printf ("too many arguments to functions.n");
  515. SET_ERROR;
  516. }
  517.     else
  518. {
  519. /* push arg value on top of arg stack */
  520. (void)getRv (pNewArg, &val);
  521. #ifndef _WRS_NO_TGT_SHELL_FP
  522. if (isfloat)
  523.     {
  524. #if CPU_FAMILY==I960
  525.     if (spawnFlag == FALSE)
  526. #endif /* CPU_FAMILY==I960 */
  527. nArgs--; /* return borrowed slot */
  528.     
  529.     /* put float as integers on argStack */
  530.     doubleToInts (pNewArg->type == T_FLOAT ?
  531.   val.value.fp : val.value.dp,
  532.   &partA, &partB);
  533.     argStack[nArgs++] = partA;
  534.     argStack[nArgs++] = partB;
  535.     }
  536. else if (checkRv (&val))
  537. #else
  538. if (checkRv (&val))
  539. #endif /* _WRS_NO_TGT_SHELL_FP */
  540.     {
  541.     int rv;
  542.     switch (val.type)
  543. {
  544. case T_BYTE:
  545.     rv = val.value.byte;
  546.     break;
  547. case T_WORD:
  548.     rv = val.value.word;
  549.     break;
  550. case T_INT:
  551.     rv = val.value.rv;
  552.     /* 
  553.      * new symLib api - symbol name lengths are no
  554.      * longer limited 
  555.      */
  556.     if (symFindSymbol (sysSymTbl, NULL, (void *)rv, 
  557.            SYM_MASK_NONE, SYM_MASK_NONE, 
  558.        &symId) == OK)
  559.   symTypeGet (symId, &sType);
  560.     if ((nArgs == 0) && (sType == (N_TEXT + N_EXT)))
  561. spawnFlag = TRUE;
  562.     break;
  563. default:
  564.     rv = 0;
  565.     printf ("addArg: bad type.n");
  566.     SET_ERROR;
  567. }
  568.     argStack[nArgs++] = rv;
  569.     }
  570. }
  571.     }
  572. #ifndef _WRS_NO_TGT_SHELL_FP
  573. /*******************************************************************************
  574. *
  575. * doubleToInts - separate double into two integer parts
  576. */
  577. LOCAL void doubleToInts (d, partA, partB)
  578.     double d;
  579.     int *partA;
  580.     int *partB;
  581.     {
  582.     union 
  583. {
  584. struct
  585.     {
  586.     int a;
  587.     int b;
  588.     } part;
  589. double d;
  590. } val;
  591.     val.d = d;
  592.     *partA = val.part.a;
  593.     *partB = val.part.b;
  594.     }
  595. #endif /* _WRS_NO_TGT_SHELL_FP */
  596. /*******************************************************************************
  597. *
  598. * funcCall - call a function
  599. */
  600. LOCAL VALUE funcCall (pV, pArgList)
  601.     VALUE *pV;
  602.     VALUE *pArgList;
  603.     {
  604.     static int funcStatus; /* status from function calls */
  605.     int a [MAX_FUNC_ARGS];
  606.     VALUE value;
  607.     FAST int i;
  608.     FAST int argNum;
  609.     int oldInFd  = ioGlobalStdGet (STD_IN);
  610.     int oldOutFd = ioGlobalStdGet (STD_OUT);
  611.     FUNCPTR pFunc = (pV->side == LHS) ? (FUNCPTR) (int)getLv (pV)
  612.       : (FUNCPTR) pV->value.rv;
  613. #if ((CPU_FAMILY == ARM) && ARM_THUMB)
  614.     pFunc = (FUNCPTR)((UINT32)pFunc | 1); /* make it a Thumb call */
  615. #endif
  616.     /* get any specified args off stack, or pre-set all args to 0 */
  617.     for (argNum = pArgList->value.rv, i = 0; i < MAX_FUNC_ARGS; argNum++, i++)
  618. {
  619. a [i] = (argNum < nArgs) ? argStack[argNum] : 0;
  620. }
  621.     /* set standard in/out to redirection fds */
  622.     if (redirInFd >= 0)
  623. ioGlobalStdSet (STD_IN, redirInFd);
  624.     if (redirOutFd >= 0)
  625. ioGlobalStdSet (STD_OUT, redirOutFd);
  626.     /* call function and save resulting status */
  627.     errnoSet (funcStatus);
  628.     value.side = RHS;
  629.     value.type = pV->type;
  630.     switch (pV->type)
  631. {
  632. case T_BYTE:
  633. case T_WORD:
  634. case T_INT:
  635.     {
  636.     /* NOTE: THE FOLLOWING ARRAY REFERENCES MUST AGREE WITH THE
  637.      *       MAX_FUNC_ARGS COUNT DEFINED ABOVE IN THIS FILE!
  638.      */
  639.     int rv = (* pFunc) (a[0], a[1], a[2], a[3], a[4], a[5], a[6],
  640. a[7], a[8], a[9], a[10], a[11]);
  641.     switch (pV->type)
  642. {
  643. case T_BYTE:
  644.     value.value.byte = (char) rv;
  645.     break;
  646. case T_WORD:
  647.     value.value.word = (short) rv;
  648.     break;
  649. case T_INT:
  650.     value.value.rv = rv;
  651.     break;
  652. default:
  653.     break;
  654. }
  655.     break;
  656.     }
  657. #ifndef _WRS_NO_TGT_SHELL_FP
  658. case T_FLOAT:
  659.     value.value.fp = (* (float (*)())pFunc) (a[0], a[1], a[2], a[3],
  660. a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]);
  661.     break;
  662. case T_DOUBLE:
  663.     value.value.dp = (* (double (*)())pFunc) (a[0], a[1], a[2], a[3],
  664. a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]);
  665.     break;
  666. #endif /* _WRS_NO_TGT_SHELL_FP */
  667. default:
  668.     printf ("funcCall: bad function type.n");
  669.     SET_ERROR;
  670. }
  671.     funcStatus = errnoGet ();
  672.     /* restore original in/out fds */
  673.     if (redirInFd >= 0)
  674. ioGlobalStdSet (STD_IN, oldInFd);
  675.     if (redirOutFd >= 0)
  676. ioGlobalStdSet (STD_OUT, oldOutFd);
  677.     /* arg stack back to previous level */
  678.     nArgs = pArgList->value.rv;
  679.     return (value);
  680.     }
  681. /*******************************************************************************
  682. *
  683. * checkLv - check that a value can be used as left value
  684. */
  685. LOCAL BOOL checkLv (pValue)
  686.     VALUE *pValue;
  687.     {
  688.     if (pValue->side != LHS)
  689. {
  690. printf ("invalid application of 'address of' operator.n");
  691. SET_ERROR;
  692. return (FALSE);
  693. }
  694.     return (TRUE);
  695.     }
  696. /*******************************************************************************
  697. *
  698. * checkRv - check that a value can be used as right value
  699. */
  700. LOCAL BOOL checkRv (pValue)
  701.     VALUE *pValue;
  702.     {
  703.     if (pValue->side == LHS)
  704. return (checkLv (pValue));
  705.     return (TRUE);
  706.     }
  707. /*******************************************************************************
  708. *
  709. * getRv - get a value's right value 
  710. */
  711. LOCAL VALUE *getRv (pValue, pRv)
  712.     FAST VALUE *pValue;
  713.     FAST VALUE *pRv; /* where to put value */
  714.     {
  715.     if (pValue->side == RHS)
  716. *pRv = *pValue;
  717.     else
  718. {
  719. pRv->side = RHS;
  720. pRv->type = pValue->type;
  721. switch (pValue->type)
  722.     {
  723.     case T_BYTE:
  724. pRv->value.byte = *(char *)pValue->value.lv;
  725. break;
  726.     case T_WORD:
  727. pRv->value.word = *(short *)pValue->value.lv;
  728. break;
  729.     case T_INT:
  730. pRv->value.rv = *pValue->value.lv;
  731. break;
  732. #ifndef _WRS_NO_TGT_SHELL_FP
  733.     case T_FLOAT:
  734. pRv->value.fp = *(float *)pValue->value.lv;
  735. break;
  736.     case T_DOUBLE:
  737. pRv->value.dp = *(double *)pValue->value.lv;
  738. break;
  739. #endif /* _WRS_NO_TGT_SHELL_FP */
  740.     default:
  741. printf ("getRv: invalid rhs.");
  742. SET_ERROR;
  743.     }
  744. }
  745.     return (pRv);
  746.     }
  747. /*******************************************************************************
  748. *
  749. * getLv - get a value's left value (address)
  750. */
  751. LOCAL int *getLv (pValue)
  752.     VALUE *pValue;
  753.     {
  754.     return (checkLv (pValue) ? pValue->value.lv : 0);
  755.     }
  756. /*******************************************************************************
  757. *
  758. * setLv - set a lv
  759. */
  760. LOCAL void setLv (pVal1, pVal2)
  761.     FAST VALUE *pVal1;
  762.     FAST VALUE *pVal2;
  763.     {
  764.     if (pVal2->side == LHS)
  765. {
  766. printf ("setLv: invalid lhs.n");
  767. SET_ERROR;
  768. }
  769.     if ((int)pVal2->type != (int)T_INT)
  770. {
  771. printf ("setLv: type conflict.n");
  772. SET_ERROR;
  773. }
  774.     pVal1->side     = LHS;
  775.     pVal1->type     = pVal2->type;
  776.     pVal1->value.lv = (int *)pVal2->value.rv;
  777.     }
  778. /*******************************************************************************
  779. *
  780. * setRv - set the rv
  781. */
  782. LOCAL void setRv (pVal1, pVal2)
  783.     FAST VALUE *pVal1;
  784.     FAST VALUE *pVal2;
  785.     {
  786.     pVal1->side = RHS;
  787.     pVal1->type = pVal2->type;
  788.     switch (pVal2->type)
  789. {
  790. case T_BYTE:
  791.     pVal1->value.byte = (pVal2->side == LHS) ?
  792.     *(char *)pVal2->value.lv : pVal2->value.byte;
  793. case T_WORD:
  794.     pVal1->value.word = (pVal2->side == LHS) ?
  795.     *(short *)pVal2->value.lv : pVal2->value.word;
  796. case T_INT:
  797.     pVal1->value.rv = (pVal2->side == LHS) ?
  798.     *pVal2->value.lv : pVal2->value.rv;
  799.     break;
  800. #ifndef _WRS_NO_TGT_SHELL_FP
  801. case T_FLOAT:
  802.     pVal1->value.fp = (pVal2->side == LHS) ?
  803.     *(float *)pVal2->value.lv : pVal2->value.fp;
  804.     break;
  805. case T_DOUBLE:
  806.     pVal1->value.dp = (pVal2->side == LHS) ?
  807.     *(double *)pVal2->value.lv : pVal2->value.dp;
  808.     break;
  809. #endif /* _WRS_NO_TGT_SHELL_FP */
  810. default:
  811.     printf ("setRv: bad type.n");
  812.     SET_ERROR;
  813. }
  814.     }
  815. /*******************************************************************************
  816. *
  817. * printLv - print left-hand side value
  818. *
  819. * "ssss + xxx = xxxx"
  820. */
  821. LOCAL void printLv (pValue)
  822.     VALUE *pValue;
  823.     {
  824.     FAST int *lv = getLv (pValue);
  825.     printSym ((int) lv, "", " = ");
  826.     printf ("0x%x", (UINT) lv);
  827.     }
  828. /*******************************************************************************
  829. *
  830. * printRv - print right-hand side value
  831. *
  832. * The format for integers is:
  833. *
  834. * "nnnn = xxxx = 'c' = ssss + nnn"
  835. *                           ^ only if nn < LIMIT for some ssss
  836. *                 ^ only if value is printable
  837. */
  838. LOCAL void printRv (pValue)
  839.     VALUE *pValue;
  840.     {
  841.     VALUE val;
  842.     int rv;
  843.     (void)getRv (pValue, &val);
  844.     switch (pValue->type)
  845. {
  846. case T_BYTE:
  847.     rv = val.value.byte;
  848.     goto caseT_INT;
  849. case T_WORD:
  850.     rv = val.value.word;
  851.     goto caseT_INT;
  852. case T_INT:
  853.     rv = val.value.rv;
  854.     /* drop through */
  855. caseT_INT:
  856.     printf ("%d = 0x%x", rv, rv);
  857.     if (isascii (rv) && isprint (rv))
  858. printf (" = '%c'", rv);
  859.     printSym (rv, " = ", "");
  860.     break;
  861. #ifndef _WRS_NO_TGT_SHELL_FP
  862. case T_FLOAT:
  863.     printf ("%g", val.value.fp);
  864.     break;
  865. case T_DOUBLE:
  866.     printf ("%g", val.value.dp);
  867.     break;
  868. #endif /* _WRS_NO_TGT_SHELL_FP */
  869. default:
  870.     printf ("printRv: bad type.n");
  871.     SET_ERROR;
  872. }
  873.     }
  874. /*******************************************************************************
  875. *
  876. * printValue - print out value
  877. */
  878. LOCAL void printValue (pValue)
  879.     FAST VALUE *pValue;
  880.     {
  881.     if (pValue->side == LHS)
  882. {
  883. if (checkLv (pValue) && checkRv (pValue))
  884.     {
  885.     printLv (pValue);
  886.     printf (": value = ");
  887.     printRv (pValue);
  888.     printf ("n");
  889.     }
  890. else
  891.     {
  892.     printf ("invalid lhs.n");
  893.     SET_ERROR;
  894.     }
  895. }
  896.     else if (checkRv (pValue))
  897. {
  898. printf ("value = ");
  899. printRv (pValue);
  900. printf ("n");
  901. }
  902.     else
  903. {
  904. printf ("invalid rhs.n");
  905. SET_ERROR;
  906. }
  907.     }
  908. /* TYPE SUPPORT */
  909. LOCAL VALUE evalUnknown ();
  910. LOCAL VALUE evalByte ();
  911. LOCAL VALUE evalWord ();
  912. LOCAL VALUE evalInt ();
  913. LOCAL VALUE evalFloat ();
  914. LOCAL VALUE evalDouble ();
  915. typedef struct /* EVAL_TYPE */
  916.     {
  917.     VALUE (*eval) ();
  918.     } EVAL_TYPE;
  919. LOCAL EVAL_TYPE evalType [] =
  920.     {
  921.     /* eval type */
  922.     /* --------------- -------------- */
  923.       { evalUnknown, /* T_UNKNOWN*/ },
  924.       { evalByte, /* T_BYTE   */ },
  925.       { evalWord, /* T_WORD   */ },
  926.       { evalInt, /* T_INT    */ },
  927. #ifndef _WRS_NO_TGT_SHELL_FP
  928.       { evalFloat, /* T_FLOAT  */ },
  929.       { evalDouble, /* T_DOUBLE */ },
  930. #endif /* _WRS_NO_TGT_SHELL_FP */
  931.     };
  932. /*******************************************************************************
  933. *
  934. * evalExp - evaluate expression
  935. */
  936. LOCAL VALUE evalExp (pValue1, op, pValue2)
  937.     VALUE *pValue1;
  938.     int op;
  939.     VALUE *pValue2;
  940.     {
  941.     VALUE *p1 = pValue1;
  942.     VALUE *p2 = pValue2;
  943.     if (pValue2 == NULLVAL) /* unary expresions must set pValue2 to something */
  944. p2 = pValue2 = pValue1;
  945.     /* make sure values have the same type */
  946.     if ((int)p1->type > (int)p2->type)
  947. typeConvert (p2, p1->type, p1->side);
  948.     else
  949. typeConvert (p1, p2->type, p2->side);
  950.     return ((evalType[(int)pValue1->type].eval) (pValue1, op, pValue2));
  951.     }
  952. /*******************************************************************************
  953. *
  954. * evalUnknown - evaluate for unknown result
  955. *
  956. * ARGSUSED
  957. */
  958. LOCAL VALUE evalUnknown (pValue1, op, pValue2)
  959.     VALUE *pValue1;
  960.     int op;
  961.     VALUE *pValue2;
  962.     {
  963.     printf ("evalUnknown: bad evaluation.n");
  964.     SET_ERROR;
  965.     return (*pValue1); /* have to return something */
  966.     }
  967. /*******************************************************************************
  968. *
  969. * evalByte - evaluate for byte result
  970. */
  971. LOCAL VALUE evalByte (pValue1, op, pValue2)
  972.     VALUE *pValue1;
  973.     int op;
  974.     VALUE *pValue2;
  975.     {
  976.     VALUE *p1 = pValue1;
  977.     VALUE *p2 = pValue2;
  978.     VALUE result;
  979.     /* evaluate as integers and then convert back */
  980.     typeConvert (p1, T_INT, RHS);
  981.     typeConvert (p2, T_INT, RHS);
  982.     result = evalInt (p1, op, p2);
  983.     typeConvert (&result, T_BYTE, RHS);
  984.     return (result);
  985.     }
  986. /*******************************************************************************
  987. *
  988. * evalWord - evaluate for word result
  989. */
  990. LOCAL VALUE evalWord (pValue1, op, pValue2)
  991.     VALUE *pValue1;
  992.     int op;
  993.     VALUE *pValue2;
  994.     {
  995.     VALUE *p1 = pValue1;
  996.     VALUE *p2 = pValue2;
  997.     VALUE result;
  998.     /* evaluate as integers and then convert back */
  999.     typeConvert (p1, T_INT, RHS);
  1000.     typeConvert (p2, T_INT, RHS);
  1001.     result = evalInt (p1, op, p2);
  1002.     typeConvert (&result, T_WORD, RHS);
  1003.     return (result);
  1004.     }
  1005. /*******************************************************************************
  1006. *
  1007. * evalInt - evaluate for integer result
  1008. */
  1009. LOCAL VALUE evalInt (pValue1, op, pValue2)
  1010.     VALUE *pValue1;
  1011.     int op;
  1012.     VALUE *pValue2;
  1013.     {
  1014. #define OP_INT(op) rv = e1 op e2; break
  1015. #define OP_INT_U(op) rv = op e1; break
  1016.     FAST int e1 = pValue1->value.rv;
  1017.     FAST int e2 = pValue2->value.rv;
  1018.     FAST int rv;
  1019.     VALUE result;
  1020.     switch (op)
  1021. {
  1022. case ADDA:
  1023. case '+':
  1024.     OP_INT(+);
  1025. case SUBA:
  1026. case '-':
  1027.     OP_INT(-);
  1028. case MULA:
  1029. case '*':
  1030.     OP_INT(*);
  1031. case DIVA:
  1032. case '/':
  1033.     OP_INT(/);
  1034. case '!':
  1035.     OP_INT_U(!);
  1036. case '~':
  1037.     OP_INT_U(~);
  1038. case MODA:
  1039. case '%':
  1040.     OP_INT(%);
  1041. case ANDA:
  1042. case '&':
  1043.     OP_INT(&);
  1044. case XORA:
  1045. case '^':
  1046.     OP_INT(^);
  1047. case ORA:
  1048. case '|':
  1049.     OP_INT(|);
  1050. case '<':
  1051.     OP_INT(<);
  1052. case '>':
  1053.     OP_INT(>);
  1054. case OR:
  1055.     OP_INT(||);
  1056. case AND:
  1057.     OP_INT(&&);
  1058. case EQ:
  1059.     OP_INT(==);
  1060. case NE:
  1061.     OP_INT(!=);
  1062. case GE:
  1063.     OP_INT(>=);
  1064. case LE:
  1065.     OP_INT(<=);
  1066. case INCR:
  1067.     OP_INT_U(++);
  1068. case DECR:
  1069.     OP_INT_U(--);
  1070. case SHLA:
  1071. case ROT_LEFT:
  1072.     OP_INT(<<);
  1073. case SHRA:
  1074. case ROT_RIGHT:
  1075.     OP_INT(>>);
  1076. case UMINUS:
  1077.     OP_INT_U(-);
  1078. default:
  1079.     rv = 0;
  1080.     printf ("operands have incompatible types.n");
  1081.     SET_ERROR;
  1082. }
  1083.     result.side     = RHS;
  1084.     result.type     = pValue1->type;
  1085.     result.value.rv = rv;
  1086.     return (result);
  1087.     }
  1088. #ifndef _WRS_NO_TGT_SHELL_FP
  1089. /*******************************************************************************
  1090. *
  1091. * evalFloat - evaluate for float result
  1092. */
  1093. LOCAL VALUE evalFloat (pValue1, op, pValue2)
  1094.     VALUE *pValue1;
  1095.     int op;
  1096.     VALUE *pValue2;
  1097.     {
  1098.     VALUE *p1 = pValue1;
  1099.     VALUE *p2 = pValue2;
  1100.     VALUE result;
  1101.     /* evaluate as doubles and then convert back */
  1102.     typeConvert (p1, T_DOUBLE, RHS);
  1103.     typeConvert (p2, T_DOUBLE, RHS);
  1104.     result = evalDouble (p1, op, p2);
  1105.     typeConvert (&result, T_FLOAT, RHS);
  1106.     return (result);
  1107.     }
  1108. /*******************************************************************************
  1109. *
  1110. * evalDouble - evaluate for double result
  1111. */
  1112. LOCAL VALUE evalDouble (pValue1, op, pValue2)
  1113.     VALUE *pValue1;
  1114.     int op;
  1115.     VALUE *pValue2;
  1116.     {
  1117. #define OP_DOUBLE(op) dp = e1 op e2; break
  1118. #define OP_DOUBLE_U(op) dp = op e1; break
  1119.     FAST double e1 = pValue1->value.dp;
  1120.     FAST double e2 = pValue2->value.dp;
  1121.     FAST double dp;
  1122.     VALUE result;
  1123.     switch (op)
  1124. {
  1125. case ADDA:
  1126. case '+':
  1127.     OP_DOUBLE(+);
  1128. case SUBA:
  1129. case '-':
  1130.     OP_DOUBLE(-);
  1131. case MULA:
  1132. case '*':
  1133.     OP_DOUBLE(*);
  1134. case DIVA:
  1135. case '/':
  1136.     OP_DOUBLE(/);
  1137. case '!':
  1138.     OP_DOUBLE_U(!);
  1139. case '<':
  1140.     OP_DOUBLE(<);
  1141. case '>':
  1142.     OP_DOUBLE(>);
  1143. case OR:
  1144.     OP_DOUBLE(||);
  1145. case AND:
  1146.     OP_DOUBLE(&&);
  1147. case EQ:
  1148.     OP_DOUBLE(==);
  1149. case NE:
  1150.     OP_DOUBLE(!=);
  1151. case GE:
  1152.     OP_DOUBLE(>=);
  1153. case LE:
  1154.     OP_DOUBLE(<=);
  1155. case INCR:
  1156.     OP_DOUBLE_U(++);
  1157. case DECR:
  1158.     OP_DOUBLE_U(--);
  1159. case UMINUS:
  1160.     OP_DOUBLE_U(-);
  1161. default:
  1162.     dp = 0;
  1163.     printf ("operands have incompatible types.n");
  1164.     SET_ERROR;
  1165. }
  1166.     result.side     = RHS;
  1167.     result.type     = T_DOUBLE;
  1168.     result.value.dp = dp;
  1169.     return (result);
  1170.     }
  1171. #endif /* _WRS_NO_TGT_SHELL_FP */
  1172. /* TYPE CONVERSION */
  1173. LOCAL void convUnknown ();
  1174. LOCAL void convByte ();
  1175. LOCAL void convWord ();
  1176. LOCAL void convInt ();
  1177. #ifndef _WRS_NO_TGT_SHELL_FP
  1178. LOCAL void convFloat ();
  1179. LOCAL void convDouble ();
  1180. #endif /* _WRS_NO_TGT_SHELL_FP */
  1181. typedef void (*VOID_FUNCPTR) (); /* ptr to a function returning void */
  1182. LOCAL VOID_FUNCPTR convType [] =
  1183.     {
  1184.     /*  conversion type     */
  1185.     /*  ---------- ----------- */
  1186. convUnknown, /* T_UNKNOWN*/
  1187. convByte, /* T_BYTE   */
  1188. convWord, /* T_WORD   */
  1189. convInt, /* T_INT    */
  1190. #ifndef _WRS_NO_TGT_SHELL_FP
  1191. convFloat, /* T_FLOAT  */
  1192. convDouble, /* T_DOUBLE */
  1193. #endif /* _WRS_NO_TGT_SHELL_FP */
  1194.     };
  1195. /*******************************************************************************
  1196. *
  1197. * typeConvert - change value to specified type
  1198. */
  1199. LOCAL void typeConvert (pValue, type, side)
  1200.     FAST VALUE *pValue;
  1201.     TYPE type;
  1202.     SIDE side;
  1203.     {
  1204.     if (side == FHS)
  1205. {
  1206. pValue->side = RHS;
  1207. pValue->type = type;
  1208. }
  1209.     else if (side == RHS)
  1210. {
  1211. if (pValue->side == LHS)
  1212.     pValue->type = type;
  1213. else
  1214.     (convType [(int) type]) (pValue);
  1215. }
  1216.     else if (pValue->side == LHS)
  1217. pValue->type = type;
  1218.     else
  1219. {
  1220. printf ("typeConvert: bad type.n");
  1221. SET_ERROR;
  1222. }
  1223.     }
  1224. /*******************************************************************************
  1225. *
  1226. * convUnknown - convert value to unknown
  1227. *
  1228. * ARGSUSED
  1229. */
  1230. LOCAL void convUnknown (pValue)
  1231.     VALUE *pValue;
  1232.     {
  1233.     printf ("convUnknown: bad type.n");
  1234.     SET_ERROR;
  1235.     }
  1236. /*******************************************************************************
  1237. *
  1238. * convByte - convert value to byte
  1239. */
  1240. LOCAL void convByte (pValue)
  1241.     FAST VALUE *pValue;
  1242.     {
  1243.     char value;
  1244.     if ((int)pValue->type > (int)T_BYTE)
  1245. {
  1246. convWord (pValue);
  1247. value = pValue->value.word;
  1248. pValue->value.byte = value;
  1249. pValue->type = T_BYTE;
  1250. }
  1251.     }
  1252. /*******************************************************************************
  1253. *
  1254. * convWord - convert value to word
  1255. */
  1256. LOCAL void convWord (pValue)
  1257.     FAST VALUE *pValue;
  1258.     {
  1259.     short value;
  1260.     if ((int)pValue->type < (int)T_WORD)
  1261. {
  1262. value = pValue->value.byte;
  1263. pValue->value.word = value;
  1264. pValue->type = T_WORD;
  1265. }
  1266.     else if ((int)pValue->type > (int)T_WORD)
  1267. {
  1268. convInt (pValue);
  1269. value = pValue->value.rv;
  1270. pValue->value.word = value;
  1271. pValue->type = T_WORD;
  1272. }
  1273.     }
  1274. /*******************************************************************************
  1275. *
  1276. * convInt - convert value to integer
  1277. */
  1278. LOCAL void convInt (pValue)
  1279.     FAST VALUE *pValue;
  1280.     {
  1281.     int value;
  1282.     if ((int)pValue->type < (int)T_INT)
  1283. {
  1284. convWord (pValue);
  1285. value = pValue->value.word;
  1286. pValue->value.rv = value;
  1287. pValue->type = T_INT;
  1288. }
  1289.     else if ((int)pValue->type > (int)T_INT)
  1290. {
  1291. #ifndef _WRS_NO_TGT_SHELL_FP
  1292. convFloat (pValue);
  1293. value = pValue->value.fp;
  1294. pValue->value.rv = value;
  1295. pValue->type = T_INT;
  1296. #endif /* _WRS_NO_TGT_SHELL_FP */
  1297. }
  1298.     }
  1299. #ifndef _WRS_NO_TGT_SHELL_FP
  1300. /*******************************************************************************
  1301. *
  1302. * convFloat - convert value to float
  1303. */
  1304. LOCAL void convFloat (pValue)
  1305.     FAST VALUE *pValue;
  1306.     {
  1307.     float value;
  1308.     if ((int)pValue->type < (int)T_FLOAT)
  1309. {
  1310. convInt (pValue);
  1311. value = pValue->value.rv;
  1312. pValue->value.fp = value;
  1313. pValue->type = T_FLOAT;
  1314. }
  1315.     else if ((int)pValue->type > (int)T_FLOAT)
  1316. {
  1317. convDouble (pValue);
  1318. value = pValue->value.dp;
  1319. pValue->value.fp = value;
  1320. pValue->type = T_FLOAT;
  1321. }
  1322.     }
  1323. /*******************************************************************************
  1324. *
  1325. * convDouble - convert value to double
  1326. */
  1327. LOCAL void convDouble (pValue)
  1328.     FAST VALUE *pValue;
  1329.     {
  1330.     double value;
  1331.     if ((int)pValue->type < (int)T_DOUBLE)
  1332. {
  1333. convFloat (pValue);
  1334. value = pValue->value.fp;
  1335. pValue->value.dp = value;
  1336. pValue->type = T_DOUBLE;
  1337. }
  1338.     }
  1339. #endif /* _WRS_NO_TGT_SHELL_FP */
  1340. static const yytabelem yyexca[] ={
  1341. -1, 1,
  1342. 0, -1,
  1343. -2, 0,
  1344. };
  1345. # define YYNPROD 63
  1346. # define YYLAST 810
  1347. static const yytabelem yyact[]={
  1348.     29,    32,   106,    21,    21,    27,    25,    20,    26,   108,
  1349.     28,   105,   104,   115,   111,   107,    69,     1,    66,    11,
  1350.     68,     2,     0,    42,    55,    41,    22,    29,    32,     0,
  1351.     21,     0,    27,    25,     0,    26,     0,    28,    67,     0,
  1352.      0,     0,     0,     0,     0,     0,     0,     0,   109,     0,
  1353.     42,    55,    41,    22,    23,    23,   110,    33,     0,     0,
  1354.      0,     0,     0,     0,     0,    29,    32,     0,    21,   103,
  1355.     27,    25,     0,    26,     0,    28,     0,     0,     0,     0,
  1356.      0,    23,     0,     0,    33,     0,     0,    34,    42,    55,
  1357.     41,    22,    29,    32,     0,    21,     0,    27,    25,     0,
  1358.     26,     0,    28,     0,     0,     0,     0,     0,     0,     0,
  1359.      0,     0,     0,     0,    34,    42,    55,    41,    22,    23,
  1360.      0,     0,    33,     0,     0,     0,     0,     0,    29,    32,
  1361.      0,    21,     0,    27,    25,     0,    26,     0,    28,     0,
  1362.      0,     0,     0,     0,     0,     0,    23,     0,     0,    33,
  1363.      0,    42,    34,    41,    22,    29,    32,     0,    21,     0,
  1364.     27,    25,     0,    26,     0,    28,    29,    32,     0,    21,
  1365.      0,    27,    25,     0,    26,     0,    28,     0,    42,    34,
  1366.     41,     0,    23,     0,     0,    33,     0,    29,     0,    42,
  1367.     21,    41,    27,    25,     0,    26,     0,    28,     0,     0,
  1368.      0,     0,     0,     0,     0,     0,     0,     0,     0,    23,
  1369.      0,     0,    33,     0,     0,    34,     0,     0,     0,     0,
  1370.     23,     0,     0,    33,     0,     0,     0,     0,    36,    35,
  1371.     37,    38,    39,    40,    43,    44,    31,    30,     0,    24,
  1372.     24,    23,    34,    51,    52,    49,    45,    46,    53,    54,
  1373.     47,    48,    50,    34,     0,    36,    35,    37,    38,    39,
  1374.     40,    43,    44,    31,    30,     0,    24,    21,     0,     0,
  1375.     51,    52,    49,    45,    46,    53,    54,    47,    48,    50,
  1376.     29,    32,     0,    21,     0,    27,    25,     0,    26,     0,
  1377.     28,     0,     0,    36,    35,    37,    38,    39,    40,    43,
  1378.     44,    31,    30,    42,    24,    41,     0,     0,    51,    52,
  1379.     49,    45,    46,    53,    54,    47,    48,    50,    23,     0,
  1380.     36,    35,    37,    38,    39,    40,    43,    44,    31,    30,
  1381.      0,    24,     0,     0,    23,    51,    52,    49,    45,    46,
  1382.     53,    54,    47,    48,    50,     0,     0,     0,     0,     0,
  1383.      0,     0,     0,     0,     0,     0,    36,    35,    37,    38,
  1384.     39,    40,    43,    44,    31,    30,     0,    24,     0,     0,
  1385.     29,    32,     0,    21,     0,    27,    25,     0,    26,     0,
  1386.     28,     0,     0,     0,    35,    37,    38,    39,    40,    43,
  1387.     44,    31,    30,    42,    24,    41,    37,    38,    39,    40,
  1388.     43,    44,    31,    30,     0,    24,    29,     0,     0,    21,
  1389.      0,    27,    25,     0,    26,     0,    28,     0,     0,     0,
  1390.      0,    43,    44,     0,    23,    15,    24,    33,     0,    42,
  1391.     13,    41,    10,     0,    12,     0,     0,    14,    29,     0,
  1392.      0,    21,     0,    27,    25,     0,    26,    29,    28,     0,
  1393.     21,     0,    27,    25,     0,    26,     0,    28,     0,     0,
  1394.     23,    42,    15,    41,     0,     0,     0,    13,     0,    10,
  1395.     29,    12,     0,    21,    14,    27,     0,     0,     0,     0,
  1396.     28,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1397.      0,     0,    23,     0,     0,     0,     0,     0,    43,    44,
  1398.      0,    23,     0,    24,     0,     0,     0,     0,     0,     0,
  1399.     37,    38,    39,    40,    43,    44,    31,    30,    16,    24,
  1400.      0,     0,     0,     0,    23,     0,     0,     0,     0,     0,
  1401.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1402.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1403.      0,     0,     0,     0,     0,    16,     0,     0,     0,     0,
  1404.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1405.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1406.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1407.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1408.     37,    38,    39,    40,    43,    44,    31,    30,     0,    24,
  1409.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1410.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1411.      0,     0,     0,     0,     0,     0,    37,    38,    39,    40,
  1412.     43,    44,    31,    30,     0,    24,     0,     0,     0,     0,
  1413.      5,     4,    19,     8,     7,     6,     9,     0,     0,     0,
  1414.      0,     0,     0,    17,    18,     0,     0,     0,     0,    57,
  1415.     39,    40,    43,    44,    31,    30,     0,    24,     0,     0,
  1416.      0,    43,    44,    31,    30,     0,    24,     5,     4,    19,
  1417.      8,     7,     6,     9,     0,     0,     0,     0,     0,     3,
  1418.     17,    18,     0,     0,    43,    44,     0,     0,     0,    24,
  1419.     56,    58,    59,    60,    61,    62,    63,    64,    65,     0,
  1420.      0,    70,    71,    72,    73,    74,    75,    76,    77,    78,
  1421.     79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
  1422.     89,    90,    91,     0,     0,    92,    93,    94,    95,    96,
  1423.     97,    98,    99,   100,   101,   102,     0,     0,     0,     0,
  1424.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1425.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1426.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1427.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1428.      0,     0,     0,     0,     0,     0,   112,     0,   113,   114 };
  1429. static const yytabelem yypact[]={
  1430.    429,-10000000,   -52,    55,-10000000,-10000000,-10000000,-10000000,-10000000,-10000000,
  1431.    392,   429,   429,   429,   429,   429,   429,   429,   429,-10000000,
  1432.    429,   429,   429,   429,   429,   429,   429,   429,   429,   429,
  1433.    429,   429,   429,   429,   429,   429,   429,   429,   429,   429,
  1434.    429,   429,   429,-10000000,-10000000,   429,   429,   429,   429,   429,
  1435.    429,   429,   429,   429,   429,   429,    28,   -29,-10000000,   -36,
  1436.    -36,   -36,   -36,   -36,   -36,   -36,   -59,-10000000,   -26,   -35,
  1437.     55,   -10,   -37,-10000000,   433,   433,   227,   227,   227,   150,
  1438.    150,   369,   243,   333,   129,   118,   401,   401,   410,   410,
  1439.    410,   410,    91,    91,    91,    91,    91,    91,    91,    91,
  1440.     91,    91,    91,-10000000,-10000000,   -27,   429,-10000000,   429,   429,
  1441. -10000000,   -28,    91,    55,    91,-10000000 };
  1442. static const yytabelem yypgo[]={
  1443.      0,    17,    21,   699,    20,    19,    18,    16 };
  1444. static const yytabelem yyr1[]={
  1445.      0,     1,     1,     2,     2,     3,     3,     3,     3,     3,
  1446.      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
  1447.      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
  1448.      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
  1449.      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
  1450.      3,     3,     3,     3,     3,     6,     3,     4,     4,     7,
  1451.      7,     5,     5 };
  1452. static const yytabelem yyr2[]={
  1453.      0,     2,     6,     0,     3,     2,     3,     3,     2,     2,
  1454.      2,     7,     9,     5,     5,     5,     5,     5,     5,    11,
  1455.      9,     7,     7,     7,     7,     7,     7,     7,     7,     7,
  1456.      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
  1457.      5,     5,     5,     5,     7,     7,     7,     7,     7,     7,
  1458.      7,     7,     7,     7,     7,     1,     9,     1,     2,     3,
  1459.      7,     7,    11 };
  1460. static const yytabelem yychk[]={
  1461. -10000000,    -1,    -2,    -3,   259,   258,   263,   262,   261,   264,
  1462.     40,    -5,    42,    38,    45,    33,   126,   271,   272,   260,
  1463.     59,    40,    63,    91,   276,    43,    45,    42,    47,    37,
  1464.    274,   273,    38,    94,   124,   266,   265,   267,   268,   269,
  1465.    270,    62,    60,   271,   272,   283,   284,   287,   288,   282,
  1466.    289,   280,   281,   285,   286,    61,    -3,   277,    -3,    -3,
  1467.     -3,    -3,    -3,    -3,    -3,    -3,    -6,    -1,    -4,    -7,
  1468.     -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,
  1469.     -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,
  1470.     -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,    -3,
  1471.     -3,    -3,    -3,    41,    41,    40,    61,    41,    44,    58,
  1472.     93,    41,    -3,    -3,    -3,    41 };
  1473. static const yytabelem yydef[]={
  1474.      3,    -2,     1,     4,     5,     6,     7,     8,     9,    10,
  1475.      0,     0,     0,     0,     0,     0,     0,     0,     0,    55,
  1476.      3,    57,     0,     0,     0,     0,     0,     0,     0,     0,
  1477.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  1478.      0,     0,     0,    42,    43,     0,     0,     0,     0,     0,
  1479.      0,     0,     0,     0,     0,     0,     0,     0,    13,    14,
  1480.     15,    16,    17,    18,    40,    41,     0,     2,     0,    58,
  1481.     59,     0,     0,    21,    22,    23,    24,    25,    26,    27,
  1482.     28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
  1483.     38,    39,    44,    45,    46,    47,    48,    49,    50,    51,
  1484.     52,    53,    54,    11,    61,     0,     0,    12,     0,     0,
  1485.     20,     0,    56,    60,    19,    62 };
  1486. typedef struct
  1487. #ifdef __cplusplus
  1488. yytoktype
  1489. #endif
  1490. { char *t_name; int t_val; } yytoktype;
  1491. #ifndef YYDEBUG
  1492. # define YYDEBUG 0 /* don't allow debugging */
  1493. #endif
  1494. #if YYDEBUG
  1495. yytoktype yytoks[] =
  1496. {
  1497. "NL", 0,
  1498. "T_SYMBOL", 258,
  1499. "D_SYMBOL", 259,
  1500. "U_SYMBOL", 260,
  1501. "NUMBER", 261,
  1502. "CHAR", 262,
  1503. "STRING", 263,
  1504. "FLOAT", 264,
  1505. "OR", 265,
  1506. "AND", 266,
  1507. "EQ", 267,
  1508. "NE", 268,
  1509. "GE", 269,
  1510. "LE", 270,
  1511. "INCR", 271,
  1512. "DECR", 272,
  1513. "ROT_LEFT", 273,
  1514. "ROT_RIGHT", 274,
  1515. "UMINUS", 275,
  1516. "PTR", 276,
  1517. "TYPECAST", 277,
  1518. "ENDFILE", 278,
  1519. "LEX_ERROR", 279,
  1520. "=", 61,
  1521. "MULA", 280,
  1522. "DIVA", 281,
  1523. "MODA", 282,
  1524. "ADDA", 283,
  1525. "SUBA", 284,
  1526. "SHLA", 285,
  1527. "SHRA", 286,
  1528. "ANDA", 287,
  1529. "ORA", 288,
  1530. "XORA", 289,
  1531. "?", 63,
  1532. ":", 58,
  1533. "|", 124,
  1534. "^", 94,
  1535. "&", 38,
  1536. ">", 62,
  1537. "<", 60,
  1538. "+", 43,
  1539. "-", 45,
  1540. "*", 42,
  1541. "/", 47,
  1542. "%", 37,
  1543. "UNARY", 290,
  1544. "[", 91,
  1545. "(", 40,
  1546. "-unknown-", -1 /* ends search */
  1547. };
  1548. char * yyreds[] =
  1549. {
  1550. "-no such reduction-",
  1551. "line : stmt",
  1552. "line : stmt ';' line",
  1553. "stmt : /* empty */",
  1554. "stmt : expr",
  1555. "expr : D_SYMBOL",
  1556. "expr : T_SYMBOL",
  1557. "expr : STRING",
  1558. "expr : CHAR",
  1559. "expr : NUMBER",
  1560. "expr : FLOAT",
  1561. "expr : '(' expr ')'",
  1562. "expr : expr '(' arglist ')'",
  1563. "expr : typecast expr",
  1564. "expr : '*' expr",
  1565. "expr : '&' expr",
  1566. "expr : '-' expr",
  1567. "expr : '!' expr",
  1568. "expr : '~' expr",
  1569. "expr : expr '?' expr ':' expr",
  1570. "expr : expr '[' expr ']'",
  1571. "expr : expr PTR expr",
  1572. "expr : expr '+' expr",
  1573. "expr : expr '-' expr",
  1574. "expr : expr '*' expr",
  1575. "expr : expr '/' expr",
  1576. "expr : expr '%' expr",
  1577. "expr : expr ROT_RIGHT expr",
  1578. "expr : expr ROT_LEFT expr",
  1579. "expr : expr '&' expr",
  1580. "expr : expr '^' expr",
  1581. "expr : expr '|' expr",
  1582. "expr : expr AND expr",
  1583. "expr : expr OR expr",
  1584. "expr : expr EQ expr",
  1585. "expr : expr NE expr",
  1586. "expr : expr GE expr",
  1587. "expr : expr LE expr",
  1588. "expr : expr '>' expr",
  1589. "expr : expr '<' expr",
  1590. "expr : INCR expr",
  1591. "expr : DECR expr",
  1592. "expr : expr INCR",
  1593. "expr : expr DECR",
  1594. "expr : expr ADDA expr",
  1595. "expr : expr SUBA expr",
  1596. "expr : expr ANDA expr",
  1597. "expr : expr ORA expr",
  1598. "expr : expr MODA expr",
  1599. "expr : expr XORA expr",
  1600. "expr : expr MULA expr",
  1601. "expr : expr DIVA expr",
  1602. "expr : expr SHLA expr",
  1603. "expr : expr SHRA expr",
  1604. "expr : expr '=' expr",
  1605. "expr : U_SYMBOL",
  1606. "expr : U_SYMBOL '=' expr",
  1607. "arglist : /* empty */",
  1608. "arglist : neArglist",
  1609. "neArglist : expr",
  1610. "neArglist : neArglist ',' expr",
  1611. "typecast : '(' TYPECAST ')'",
  1612. "typecast : '(' TYPECAST '(' ')' ')'",
  1613. };
  1614. #endif /* YYDEBUG */
  1615. # line 1 "/usr/ccs/bin/yaccpar"
  1616. /*
  1617.  * Copyright (c) 1993 by Sun Microsystems, Inc.
  1618.  */
  1619. #pragma ident "@(#)yaccpar 6.15 97/12/08 SMI"
  1620. /*
  1621. ** Skeleton parser driver for yacc output
  1622. */
  1623. /*
  1624. ** yacc user known macros and defines
  1625. */
  1626. #define YYERROR goto yyerrlab
  1627. #define YYACCEPT return(0)
  1628. #define YYABORT return(1)
  1629. #define YYBACKUP( newtoken, newvalue )
  1630. {
  1631. if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )
  1632. {
  1633. yyerror( "syntax error - cannot backup" );
  1634. goto yyerrlab;
  1635. }
  1636. yychar = newtoken;
  1637. yystate = *yyps;
  1638. yylval = newvalue;
  1639. goto yynewstate;
  1640. }
  1641. #define YYRECOVERING() (!!yyerrflag)
  1642. #define YYNEW(type) malloc(sizeof(type) * yynewmax)
  1643. #define YYCOPY(to, from, type) 
  1644. (type *) memcpy(to, (char *) from, yymaxdepth * sizeof (type))
  1645. #define YYENLARGE( from, type) 
  1646. (type *) realloc((char *) from, yynewmax * sizeof(type))
  1647. #ifndef YYDEBUG
  1648. # define YYDEBUG 1 /* make debugging available */
  1649. #endif
  1650. /*
  1651. ** user known globals
  1652. */
  1653. int yydebug; /* set to 1 to get debugging */
  1654. /*
  1655. ** driver internal defines
  1656. */
  1657. #define YYFLAG (-10000000)
  1658. /*
  1659. ** global variables used by the parser
  1660. */
  1661. YYSTYPE *yypv; /* top of value stack */
  1662. int *yyps; /* top of state stack */
  1663. int yystate; /* current state */
  1664. int yytmp; /* extra var (lasts between blocks) */
  1665. int yynerrs; /* number of errors */
  1666. int yyerrflag; /* error recovery flag */
  1667. int yychar; /* current input token number */
  1668. #ifdef YYNMBCHARS
  1669. #define YYLEX() yycvtok(yylex())
  1670. /*
  1671. ** yycvtok - return a token if i is a wchar_t value that exceeds 255.
  1672. ** If i<255, i itself is the token.  If i>255 but the neither 
  1673. ** of the 30th or 31st bit is on, i is already a token.
  1674. */
  1675. #if defined(__STDC__) || defined(__cplusplus)
  1676. int yycvtok(int i)
  1677. #else
  1678. int yycvtok(i) int i;
  1679. #endif
  1680. {
  1681. int first = 0;
  1682. int last = YYNMBCHARS - 1;
  1683. int mid;
  1684. wchar_t j;
  1685. if(i&0x60000000){/*Must convert to a token. */
  1686. if( yymbchars[last].character < i ){
  1687. return i;/*Giving up*/
  1688. }
  1689. while ((last>=first)&&(first>=0)) {/*Binary search loop*/
  1690. mid = (first+last)/2;
  1691. j = yymbchars[mid].character;
  1692. if( j==i ){/*Found*/ 
  1693. return yymbchars[mid].tvalue;
  1694. }else if( j<i ){
  1695. first = mid + 1;
  1696. }else{
  1697. last = mid -1;
  1698. }
  1699. }
  1700. /*No entry in the table.*/
  1701. return i;/* Giving up.*/
  1702. }else{/* i is already a token. */
  1703. return i;
  1704. }
  1705. }
  1706. #else/*!YYNMBCHARS*/
  1707. #define YYLEX() yylex()
  1708. #endif/*!YYNMBCHARS*/
  1709. /*
  1710. ** yyparse - return 0 if worked, 1 if syntax error not recovered from
  1711. */
  1712. #if defined(__STDC__) || defined(__cplusplus)
  1713. int yyparse(void)
  1714. #else
  1715. int yyparse()
  1716. #endif
  1717. {
  1718. register YYSTYPE *yypvt = 0; /* top of value stack for $vars */
  1719. #if defined(__cplusplus) || defined(lint)
  1720. /*
  1721. hacks to please C++ and lint - goto's inside switch should never be
  1722. executed; yypvt is set to 0 to avoid "used before set" warning.
  1723. */
  1724. static int __yaccpar_lint_hack__ = 0;
  1725. switch (__yaccpar_lint_hack__)
  1726. {
  1727. case 1: goto yyerrlab;
  1728. case 2: goto yynewstate;
  1729. }
  1730. #endif
  1731. /*
  1732. ** Initialize externals - yyparse may be called more than once
  1733. */
  1734. yypv = &yyv[-1];
  1735. yyps = &yys[-1];
  1736. yystate = 0;
  1737. yytmp = 0;
  1738. yynerrs = 0;
  1739. yyerrflag = 0;
  1740. yychar = -1;
  1741. #if YYMAXDEPTH <= 0
  1742. if (yymaxdepth <= 0)
  1743. {
  1744. if ((yymaxdepth = YYEXPAND(0)) <= 0)
  1745. {
  1746. yyerror("yacc initialization error");
  1747. YYABORT;
  1748. }
  1749. }
  1750. #endif
  1751. {
  1752. register YYSTYPE *yy_pv; /* top of value stack */
  1753. register int *yy_ps; /* top of state stack */
  1754. register int yy_state; /* current state */
  1755. register int  yy_n; /* internal state number info */
  1756. goto yystack; /* moved from 6 lines above to here to please C++ */
  1757. /*
  1758. ** get globals into registers.
  1759. ** branch to here only if YYBACKUP was called.
  1760. */
  1761. yynewstate:
  1762. yy_pv = yypv;
  1763. yy_ps = yyps;
  1764. yy_state = yystate;
  1765. goto yy_newstate;
  1766. /*
  1767. ** get globals into registers.
  1768. ** either we just started, or we just finished a reduction
  1769. */
  1770. yystack:
  1771. yy_pv = yypv;
  1772. yy_ps = yyps;
  1773. yy_state = yystate;
  1774. /*
  1775. ** top of for (;;) loop while no reductions done
  1776. */
  1777. yy_stack:
  1778. /*
  1779. ** put a state and value onto the stacks
  1780. */
  1781. #if YYDEBUG
  1782. /*
  1783. ** if debugging, look up token value in list of value vs.
  1784. ** name pairs.  0 and negative (-1) are special values.
  1785. ** Note: linear search is used since time is not a real
  1786. ** consideration while debugging.
  1787. */
  1788. if ( yydebug )
  1789. {
  1790. register int yy_i;
  1791. printf( "State %d, token ", yy_state );
  1792. if ( yychar == 0 )
  1793. printf( "end-of-filen" );
  1794. else if ( yychar < 0 )
  1795. printf( "-none-n" );
  1796. else
  1797. {
  1798. for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
  1799. yy_i++ )
  1800. {
  1801. if ( yytoks[yy_i].t_val == yychar )
  1802. break;
  1803. }
  1804. printf( "%sn", yytoks[yy_i].t_name );
  1805. }
  1806. }
  1807. #endif /* YYDEBUG */
  1808. if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */
  1809. {
  1810. /*
  1811. ** reallocate and recover.  Note that pointers
  1812. ** have to be reset, or bad things will happen
  1813. */
  1814. long yyps_index = (yy_ps - yys);
  1815. long yypv_index = (yy_pv - yyv);
  1816. long yypvt_index = (yypvt - yyv);
  1817. int yynewmax;
  1818. #ifdef YYEXPAND
  1819. yynewmax = YYEXPAND(yymaxdepth);
  1820. #else
  1821. yynewmax = 2 * yymaxdepth; /* double table size */
  1822. if (yymaxdepth == YYMAXDEPTH) /* first time growth */
  1823. {
  1824. char *newyys = (char *)YYNEW(int);
  1825. char *newyyv = (char *)YYNEW(YYSTYPE);
  1826. if (newyys != 0 && newyyv != 0)
  1827. {
  1828. yys = YYCOPY(newyys, yys, int);
  1829. yyv = YYCOPY(newyyv, yyv, YYSTYPE);
  1830. }
  1831. else
  1832. yynewmax = 0; /* failed */
  1833. }
  1834. else /* not first time */
  1835. {
  1836. yys = YYENLARGE(yys, int);
  1837. yyv = YYENLARGE(yyv, YYSTYPE);
  1838. if (yys == 0 || yyv == 0)
  1839. yynewmax = 0; /* failed */
  1840. }
  1841. #endif
  1842. if (yynewmax <= yymaxdepth) /* tables not expanded */
  1843. {
  1844. yyerror( "yacc stack overflow" );
  1845. YYABORT;
  1846. }
  1847. yymaxdepth = yynewmax;
  1848. yy_ps = yys + yyps_index;
  1849. yy_pv = yyv + yypv_index;
  1850. yypvt = yyv + yypvt_index;
  1851. }
  1852. *yy_ps = yy_state;
  1853. *++yy_pv = yyval;
  1854. /*
  1855. ** we have a new state - find out what to do
  1856. */
  1857. yy_newstate:
  1858. if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
  1859. goto yydefault; /* simple state */
  1860. #if YYDEBUG
  1861. /*
  1862. ** if debugging, need to mark whether new token grabbed
  1863. */
  1864. yytmp = yychar < 0;
  1865. #endif
  1866. if ( ( yychar < 0 ) && ( ( yychar = YYLEX() ) < 0 ) )
  1867. yychar = 0; /* reached EOF */
  1868. #if YYDEBUG
  1869. if ( yydebug && yytmp )
  1870. {
  1871. register int yy_i;
  1872. printf( "Received token " );
  1873. if ( yychar == 0 )
  1874. printf( "end-of-filen" );
  1875. else if ( yychar < 0 )
  1876. printf( "-none-n" );
  1877. else
  1878. {
  1879. for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
  1880. yy_i++ )
  1881. {
  1882. if ( yytoks[yy_i].t_val == yychar )
  1883. break;
  1884. }
  1885. printf( "%sn", yytoks[yy_i].t_name );
  1886. }
  1887. }
  1888. #endif /* YYDEBUG */
  1889. if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
  1890. goto yydefault;
  1891. if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/
  1892. {
  1893. yychar = -1;
  1894. yyval = yylval;
  1895. yy_state = yy_n;
  1896. if ( yyerrflag > 0 )
  1897. yyerrflag--;
  1898. goto yy_stack;
  1899. }
  1900. yydefault:
  1901. if ( ( yy_n = yydef[ yy_state ] ) == -2 )
  1902. {
  1903. #if YYDEBUG
  1904. yytmp = yychar < 0;
  1905. #endif
  1906. if ( ( yychar < 0 ) && ( ( yychar = YYLEX() ) < 0 ) )
  1907. yychar = 0; /* reached EOF */
  1908. #if YYDEBUG
  1909. if ( yydebug && yytmp )
  1910. {
  1911. register int yy_i;
  1912. printf( "Received token " );
  1913. if ( yychar == 0 )
  1914. printf( "end-of-filen" );
  1915. else if ( yychar < 0 )
  1916. printf( "-none-n" );
  1917. else
  1918. {
  1919. for ( yy_i = 0;
  1920. yytoks[yy_i].t_val >= 0;
  1921. yy_i++ )
  1922. {
  1923. if ( yytoks[yy_i].t_val
  1924. == yychar )
  1925. {
  1926. break;
  1927. }
  1928. }
  1929. printf( "%sn", yytoks[yy_i].t_name );
  1930. }
  1931. }
  1932. #endif /* YYDEBUG */
  1933. /*
  1934. ** look through exception table
  1935. */
  1936. {
  1937. register const int *yyxi = yyexca;
  1938. while ( ( *yyxi != -1 ) ||
  1939. ( yyxi[1] != yy_state ) )
  1940. {
  1941. yyxi += 2;
  1942. }
  1943. while ( ( *(yyxi += 2) >= 0 ) &&
  1944. ( *yyxi != yychar ) )
  1945. ;
  1946. if ( ( yy_n = yyxi[1] ) < 0 )
  1947. YYACCEPT;
  1948. }
  1949. }
  1950. /*
  1951. ** check for syntax error
  1952. */
  1953. if ( yy_n == 0 ) /* have an error */
  1954. {
  1955. /* no worry about speed here! */
  1956. switch ( yyerrflag )
  1957. {
  1958. case 0: /* new error */
  1959. yyerror( "syntax error" );
  1960. goto skip_init;
  1961. yyerrlab:
  1962. /*
  1963. ** get globals into registers.
  1964. ** we have a user generated syntax type error
  1965. */
  1966. yy_pv = yypv;
  1967. yy_ps = yyps;
  1968. yy_state = yystate;
  1969. skip_init:
  1970. yynerrs++;
  1971. /* FALLTHRU */
  1972. case 1:
  1973. case 2: /* incompletely recovered error */
  1974. /* try again... */
  1975. yyerrflag = 3;
  1976. /*
  1977. ** find state where "error" is a legal
  1978. ** shift action
  1979. */
  1980. while ( yy_ps >= yys )
  1981. {
  1982. yy_n = yypact[ *yy_ps ] + YYERRCODE;
  1983. if ( yy_n >= 0 && yy_n < YYLAST &&
  1984. yychk[yyact[yy_n]] == YYERRCODE) {
  1985. /*
  1986. ** simulate shift of "error"
  1987. */
  1988. yy_state = yyact[ yy_n ];
  1989. goto yy_stack;
  1990. }
  1991. /*
  1992. ** current state has no shift on
  1993. ** "error", pop stack
  1994. */
  1995. #if YYDEBUG
  1996. # define _POP_ "Error recovery pops state %d, uncovers state %dn"
  1997. if ( yydebug )
  1998. printf( _POP_, *yy_ps,
  1999. yy_ps[-1] );
  2000. # undef _POP_
  2001. #endif
  2002. yy_ps--;
  2003. yy_pv--;
  2004. }
  2005. /*
  2006. ** there is no state on stack with "error" as
  2007. ** a valid shift.  give up.
  2008. */
  2009. YYABORT;
  2010. case 3: /* no shift yet; eat a token */
  2011. #if YYDEBUG
  2012. /*
  2013. ** if debugging, look up token in list of
  2014. ** pairs.  0 and negative shouldn't occur,
  2015. ** but since timing doesn't matter when
  2016. ** debugging, it doesn't hurt to leave the
  2017. ** tests here.
  2018. */
  2019. if ( yydebug )
  2020. {
  2021. register int yy_i;
  2022. printf( "Error recovery discards " );
  2023. if ( yychar == 0 )
  2024. printf( "token end-of-filen" );
  2025. else if ( yychar < 0 )
  2026. printf( "token -none-n" );
  2027. else
  2028. {
  2029. for ( yy_i = 0;
  2030. yytoks[yy_i].t_val >= 0;
  2031. yy_i++ )
  2032. {
  2033. if ( yytoks[yy_i].t_val
  2034. == yychar )
  2035. {
  2036. break;
  2037. }
  2038. }
  2039. printf( "token %sn",
  2040. yytoks[yy_i].t_name );
  2041. }
  2042. }
  2043. #endif /* YYDEBUG */
  2044. if ( yychar == 0 ) /* reached EOF. quit */
  2045. YYABORT;
  2046. yychar = -1;
  2047. goto yy_newstate;
  2048. }
  2049. }/* end if ( yy_n == 0 ) */
  2050. /*
  2051. ** reduction by production yy_n
  2052. ** put stack tops, etc. so things right after switch
  2053. */
  2054. #if YYDEBUG
  2055. /*
  2056. ** if debugging, print the string that is the user's
  2057. ** specification of the reduction which is just about
  2058. ** to be done.
  2059. */
  2060. if ( yydebug )
  2061. printf( "Reduce by (%d) "%s"n",
  2062. yy_n, yyreds[ yy_n ] );
  2063. #endif
  2064. yytmp = yy_n; /* value to switch over */
  2065. yypvt = yy_pv; /* $vars top of value stack */
  2066. /*
  2067. ** Look in goto table for next state
  2068. ** Sorry about using yy_state here as temporary
  2069. ** register variable, but why not, if it works...
  2070. ** If yyr2[ yy_n ] doesn't have the low order bit
  2071. ** set, then there is no action to be done for
  2072. ** this reduction.  So, no saving & unsaving of
  2073. ** registers done.  The only difference between the
  2074. ** code just after the if and the body of the if is
  2075. ** the goto yy_stack in the body.  This way the test
  2076. ** can be made before the choice of what to do is needed.
  2077. */
  2078. {
  2079. /* length of production doubled with extra bit */
  2080. register int yy_len = yyr2[ yy_n ];
  2081. if ( !( yy_len & 01 ) )
  2082. {
  2083. yy_len >>= 1;
  2084. yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
  2085. yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  2086. *( yy_ps -= yy_len ) + 1;
  2087. if ( yy_state >= YYLAST ||
  2088. yychk[ yy_state =
  2089. yyact[ yy_state ] ] != -yy_n )
  2090. {
  2091. yy_state = yyact[ yypgo[ yy_n ] ];
  2092. }
  2093. goto yy_stack;
  2094. }
  2095. yy_len >>= 1;
  2096. yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
  2097. yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  2098. *( yy_ps -= yy_len ) + 1;
  2099. if ( yy_state >= YYLAST ||
  2100. yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
  2101. {
  2102. yy_state = yyact[ yypgo[ yy_n ] ];
  2103. }
  2104. }
  2105. /* save until reenter driver code */
  2106. yystate = yy_state;
  2107. yyps = yy_ps;
  2108. yypv = yy_pv;
  2109. }
  2110. /*
  2111. ** code supplied by user is placed in this switch
  2112. */
  2113. switch( yytmp )
  2114. {
  2115. case 4:
  2116. # line 220 "shell.yacc"
  2117. { printValue (&yypvt[-0]); CHECK; } break;
  2118. case 6:
  2119. # line 224 "shell.yacc"
  2120. { yypvt[-0].side = RHS; setRv (&yyval, &yypvt[-0]); } break;
  2121. case 7:
  2122. # line 225 "shell.yacc"
  2123. { yyval = yypvt[-0]; yyval.value.rv = newString((char*)yypvt[-0].value.rv);
  2124.    CHECK; } break;
  2125. case 11:
  2126. # line 230 "shell.yacc"
  2127. { yyval = yypvt[-1]; } break;
  2128. case 12:
  2129. # line 232 "shell.yacc"
  2130. { yyval = funcCall (&yypvt[-3], &yypvt[-1]); CHECK; } break;
  2131. case 13:
  2132. # line 234 "shell.yacc"
  2133. typeConvert (&yypvt[-0], yypvt[-1].type, yypvt[-1].side); yyval = yypvt[-0];
  2134. CHECK;
  2135. } break;
  2136. case 14:
  2137. # line 238 "shell.yacc"
  2138. { VALUE tmp;
  2139.   (void)getRv (&yypvt[-0], &tmp);
  2140.   setLv (&yyval, &tmp);
  2141.   CHECK;
  2142. } break;
  2143. case 15:
  2144. # line 243 "shell.yacc"
  2145. { yyval.value.rv = (int)getLv (&yypvt[-0]);
  2146.   yyval.type = T_INT; yyval.side = RHS; } break;
  2147. case 16:
  2148. # line 245 "shell.yacc"
  2149. { rvOp (RV(yypvt[-0]), UMINUS, NULLVAL); } break;
  2150. case 17:
  2151. # line 246 "shell.yacc"
  2152. { rvOp (RV(yypvt[-0]), '!', NULLVAL); } break;
  2153. case 18:
  2154. # line 247 "shell.yacc"
  2155. { rvOp (RV(yypvt[-0]), '~', NULLVAL); } break;
  2156. case 19:
  2157. # line 248 "shell.yacc"
  2158. { setRv (&yyval, RV(yypvt[-4])->value.rv ? &yypvt[-2]
  2159.        : &yypvt[-0]); } break;
  2160. case 20:
  2161. # line 250 "shell.yacc"
  2162. { BIN_OP ('+');
  2163.   typeConvert (&yyval, T_INT, RHS);
  2164.   setLv (&yyval, &yyval); } break;
  2165. case 21:
  2166. # line 253 "shell.yacc"
  2167. { BIN_OP ('+');
  2168.   typeConvert (&yyval, T_INT, RHS);
  2169.   setLv (&yyval, &yyval); } break;
  2170. case 22:
  2171. # line 256 "shell.yacc"
  2172. { BIN_OP ('+'); } break;
  2173. case 23:
  2174. # line 257 "shell.yacc"
  2175. { BIN_OP ('-'); } break;
  2176. case 24:
  2177. # line 258 "shell.yacc"
  2178. { BIN_OP ('*'); } break;
  2179. case 25:
  2180. # line 259 "shell.yacc"
  2181. { BIN_OP ('/'); } break;
  2182. case 26:
  2183. # line 260 "shell.yacc"
  2184. { BIN_OP ('%'); } break;
  2185. case 27:
  2186. # line 261 "shell.yacc"
  2187. { BIN_OP (ROT_RIGHT); } break;
  2188. case 28:
  2189. # line 262 "shell.yacc"
  2190. { BIN_OP (ROT_LEFT); } break;
  2191. case 29:
  2192. # line 263 "shell.yacc"
  2193. { BIN_OP ('&'); } break;
  2194. case 30:
  2195. # line 264 "shell.yacc"
  2196. { BIN_OP ('^'); } break;
  2197. case 31:
  2198. # line 265 "shell.yacc"
  2199. { BIN_OP ('|'); } break;
  2200. case 32:
  2201. # line 266 "shell.yacc"
  2202. { BIN_OP (AND); } break;
  2203. case 33:
  2204. # line 267 "shell.yacc"
  2205. { BIN_OP (OR); } break;
  2206. case 34:
  2207. # line 268 "shell.yacc"
  2208. { BIN_OP (EQ); } break;
  2209. case 35:
  2210. # line 269 "shell.yacc"
  2211. { BIN_OP (NE); } break;
  2212. case 36:
  2213. # line 270 "shell.yacc"
  2214. { BIN_OP (GE); } break;
  2215. case 37:
  2216. # line 271 "shell.yacc"
  2217. { BIN_OP (LE); } break;
  2218. case 38:
  2219. # line 272 "shell.yacc"
  2220. { BIN_OP ('>'); } break;
  2221. case 39:
  2222. # line 273 "shell.yacc"
  2223. { BIN_OP ('<'); } break;
  2224. case 40:
  2225. # line 274 "shell.yacc"
  2226. { rvOp (RV(yypvt[-0]), INCR, NULLVAL);
  2227.   assign (&yypvt[-0], &yyval); CHECK; } break;
  2228. case 41:
  2229. # line 276 "shell.yacc"
  2230. { rvOp (RV(yypvt[-0]), DECR, NULLVAL);
  2231.   assign (&yypvt[-0], &yyval); CHECK; } break;
  2232. case 42:
  2233. # line 278 "shell.yacc"
  2234. { VALUE tmp;
  2235.   tmp = yypvt[-1];
  2236.   rvOp (RV(yypvt[-1]), INCR, NULLVAL);
  2237.   assign (&yypvt[-1], &yyval); CHECK;
  2238.   yyval = tmp; } break;
  2239. case 43:
  2240. # line 283 "shell.yacc"
  2241. { VALUE tmp;
  2242.   tmp = yypvt[-1];
  2243.   rvOp (RV(yypvt[-1]), DECR, NULLVAL);
  2244.   assign (&yypvt[-1], &yyval); CHECK;
  2245.   yyval = tmp; } break;
  2246. case 44:
  2247. # line 288 "shell.yacc"
  2248. { BIN_OP (ADDA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2249. case 45:
  2250. # line 289 "shell.yacc"
  2251. { BIN_OP (SUBA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2252. case 46:
  2253. # line 290 "shell.yacc"
  2254. { BIN_OP (ANDA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2255. case 47:
  2256. # line 291 "shell.yacc"
  2257. { BIN_OP (ORA);  assign (&yypvt[-2], &yyval); CHECK;} break;
  2258. case 48:
  2259. # line 292 "shell.yacc"
  2260. { BIN_OP (MODA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2261. case 49:
  2262. # line 293 "shell.yacc"
  2263. { BIN_OP (XORA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2264. case 50:
  2265. # line 294 "shell.yacc"
  2266. { BIN_OP (MULA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2267. case 51:
  2268. # line 295 "shell.yacc"
  2269. { BIN_OP (DIVA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2270. case 52:
  2271. # line 296 "shell.yacc"
  2272. { BIN_OP (SHLA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2273. case 53:
  2274. # line 297 "shell.yacc"
  2275. { BIN_OP (SHRA); assign (&yypvt[-2], &yyval); CHECK;} break;
  2276. case 54:
  2277. # line 298 "shell.yacc"
  2278. { assign (&yypvt[-2], &yypvt[-0]); yyval = yypvt[-2]; } break;
  2279. case 55:
  2280. # line 303 "shell.yacc"
  2281. { usymFlag = TRUE; usymVal = yypvt[-0]; } break;
  2282. case 56:
  2283. # line 305 "shell.yacc"
  2284. {
  2285. if (yypvt[-3].type != T_UNKNOWN)
  2286.     {
  2287.     printf ("typecast of lhs not allowed.n");
  2288.     YYERROR;
  2289.     }
  2290. else
  2291.     {
  2292.     yyval = newSym ((char *)yypvt[-3].value.rv, yypvt[-0].type); CHECK;
  2293.     assign (&yyval, &yypvt[-0]); CHECK;
  2294.     }
  2295. usymFlag = FALSE;
  2296. } break;
  2297. case 57:
  2298. # line 321 "shell.yacc"
  2299. { yyval = newArgList (); } break;
  2300. case 59:
  2301. # line 326 "shell.yacc"
  2302. { yyval = newArgList (); addArg (&yyval, &yypvt[-0]); CHECK; } break;
  2303. case 60:
  2304. # line 328 "shell.yacc"
  2305. { addArg (&yypvt[-2], &yypvt[-0]); CHECK; } break;
  2306. case 61:
  2307. # line 331 "shell.yacc"
  2308. { yypvt[-1].side = RHS; yyval = yypvt[-1]; } break;
  2309. case 62:
  2310. # line 332 "shell.yacc"
  2311. { yypvt[-3].side = FHS; yyval = yypvt[-3]; } break;
  2312. # line 531 "/usr/ccs/bin/yaccpar"
  2313. }
  2314. goto yystack; /* reset registers in driver code */
  2315. }