Added some missing headers reported by /usr/lib/build/checks-data/check_gcc_output
[scilab.git] / scilab / modules / core / src / c / terme.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Allan CORNET
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 #include <string.h>
13 #include <stdio.h>
14 #include "terme.h"
15 #include "stack-def.h"
16 #include "stack-c.h"
17 #include "basout.h"
18 #include "do_error_number.h"
19 /*--------------------------------------------------------------------------*/ 
20 extern int C2F(getsym)();
21 /*--------------------------------------------------------------------------*/ 
22 int C2F(terme)(void)
23 {
24 #define char_plus 45
25 #define char_minus 46
26 #define char_bchar_slash 49
27 #define char_star 47
28 #define char_slash 48
29 #define char_dot 51
30 #define char_not 61
31 #define constnumber 114688
32
33   /* Local variables */
34   int op = 0;
35
36   int r = 0;
37
38   /* int equal,less,great,char_not */
39   r = C2F(recu).rstk[(constnumber + (0 + ( (C2F(recu).pt - 1) << 2)) - constnumber) / 4];
40
41   if (C2F(iop).ddt == 4) {
42     static char tmp[100];
43     static int io;
44     sprintf(tmp," terme pt:%d rstk(pt):%d sym:%d",C2F(recu).pt, C2F(recu).rstk[C2F(recu).pt - 1], C2F(com).sym);
45     C2F(basout)(&io, &C2F(iop).wte,tmp, (long)strlen(tmp));
46
47   }
48
49   if ( (r / 100) != 2) 
50     { /* first factor */
51       ++C2F(recu).pt;
52
53       /* escape to call fact */
54       C2F(recu).rstk[C2F(recu).pt - 1] = 201;
55       C2F(recu).icall = 3;
56       return 0;
57     }
58
59   switch (r - 200) 
60     {
61     case 1: 
62       { /* return point after  first factor evaluation*/
63         --C2F(recu).pt;
64         op = 0;
65         if (C2F(com).sym == char_dot) 
66           {
67             op = char_dot;
68             C2F(getsym)();
69           }
70
71         if (C2F(com).sym == char_star || C2F(com).sym == char_slash || C2F(com).sym == char_bchar_slash) 
72           {
73             op += C2F(com).sym;
74             C2F(getsym)();
75             if (C2F(com).sym == char_dot) op += C2F(com).sym << 1;
76
77             if (C2F(com).sym == char_dot) C2F(getsym)();
78
79             ++C2F(recu).pt;
80             C2F(recu).pstk[C2F(recu).pt - 1] = op;
81             if (C2F(com).sym != char_not) 
82               {
83                 /* escape to call fact */
84                 C2F(recu).rstk[C2F(recu).pt - 1] = 202;
85                 C2F(recu).icall = 3;
86                 return 0;
87               }
88            
89             /* escape to call expr */
90             C2F(recu).rstk[C2F(recu).pt - 1] = 204;
91             C2F(recu).icall = 1;
92             return 0;
93           }
94
95         if (op != 0) 
96           {
97             SciError(7);
98           }
99         return 0;
100       }
101     case 2:
102       { /* return point after n th factor evaluation*/
103         Fin = C2F(recu).pstk[C2F(recu).pt - 1];
104         /* evaluation */
105         Rhs = 2;
106
107         /* escape to call allops(op) */
108         C2F(recu).rstk[C2F(recu).pt - 1] = 203;
109         C2F(recu).icall = 4;
110         return 0;
111       }
112     case 3: 
113       {  /* return point after operation evaluation (allops(op))*/
114         --C2F(recu).pt;
115         op = 0;
116         if (C2F(com).sym == char_dot) 
117           {
118             op = char_dot;
119             C2F(getsym)();
120           }
121         if (C2F(com).sym == char_star || C2F(com).sym == char_slash || C2F(com).sym == char_bchar_slash) 
122           {
123             op += C2F(com).sym;
124             C2F(getsym)();
125             if (C2F(com).sym == char_dot) op += C2F(com).sym << 1;
126
127             if (C2F(com).sym == char_dot) C2F(getsym)();
128
129             ++C2F(recu).pt;
130             C2F(recu).pstk[C2F(recu).pt - 1] = op;
131             if (C2F(com).sym != char_not) 
132               {
133                 C2F(recu).rstk[C2F(recu).pt - 1] = 202;
134                 /*next line added to handle syntax like a*-b for Matlab compatiblity */
135                 if (C2F(com).sym == char_plus || C2F(com).sym == char_minus) 
136                   C2F(recu).icall = 1; /* escape to call expr */
137                 else
138                   C2F(recu).icall = 3; /* escape to call fact */
139                 return 0;
140               }
141
142             /* escape to evaluate a logical factor (in expr) */
143             C2F(recu).rstk[C2F(recu).pt - 1] = 204;
144             C2F(recu).icall = 1;
145             return 0;
146           }
147
148         if (op != 0) 
149           {
150             SciError(7);
151           }
152         return 0;
153       }
154     case 4: 
155       { /* return point after logical factor evaluation (in expr)*/ 
156         Fin = C2F(recu).pstk[C2F(recu).pt - 1];
157         Rhs = 2;
158
159         /* escape to call allops(op) */
160         C2F(recu).rstk[C2F(recu).pt - 1] = 203;
161         C2F(recu).icall = 4;
162         return 0;
163       }
164       break;
165     }
166
167   SciError(22);
168   return 0;
169 }
170 /*--------------------------------------------------------------------------*/