677f9a4e0a3ea1deee747888ebc74dfffc60db4e
11 int codecmp (char *ref
, char *str
)
15 while (*ref
!= '\0') {
16 sig
= *str
++ - *ref
++;
18 return (sig
> 0) ? 1 : -1;
25 /* allocate new element */
27 element_t
*newelement (func_t function
, int nbops
)
29 element_t
*new = (element_t
*) calloc (1, sizeof (element_t
));
31 VERBOSE (ERROR
, fdprintf (stdfderr
, "can't allocate memory\n"));
42 #define NB_OPERATORS 7
44 keyword_t operators
[NB_OPERATORS
] = {
54 #define NB_FUNCTIONS 7
55 keyword_t functions
[NB_FUNCTIONS
] = {
56 { "sqrt", Sqr
, 1, 4 },
60 { "atan", Atn
, 1, 4 },
67 element_t
*parser (char *str
) {
68 element_t
*root
= NULL
;
72 while (*str
!= '\0') {
74 element_t
*new = NULL
;
75 VERBOSE (DEBUG
, PRINTOUT ("Processing: %s\n", str
));
77 /* skip spaces and tabs */
79 if ((*str
== ' ') || (*str
== '\t')) {
84 /* look for operators */
86 for (i
= 0; i
< NB_OPERATORS
; i
++) {
87 keyword_t
*operator = operators
+ i
;
88 if (codecmp (operator->keyword
, str
) == 0) {
89 if ((root
) && (root
->func
== Val
)) {
90 VERBOSE (DEBUG
, PRINTOUT ("Oper: %d\n", operator->func
));
91 new = newelement (operator->func
, operator->nbops
);
93 return (element_t
*)-1;
98 return (element_t
*)(-1);
100 str
+= operator->offset
;
106 VERBOSE (DEBUG
, PRINTOUT ("stop processing operator\n"));
110 /* look for functions */
112 for (i
= 0; i
< NB_FUNCTIONS
; i
++) {
113 keyword_t
*function
= functions
+ i
;
114 if (codecmp (function
->keyword
, str
) == 0) {
116 VERBOSE (DEBUG
, PRINTOUT ("Func: %d\n", function
->func
));
117 new = newelement (function
->func
, function
->nbops
);
119 return (element_t
*)-1;
123 return (element_t
*)(-1);
125 str
+= function
->offset
;
131 VERBOSE (DEBUG
, PRINTOUT ("stop processing function\n"));
135 /* last attend to detect addition and substraction */
137 if (((*str
== '-') || (*str
== '+')) &&
138 ((*(str
+ 1) >= '0') && (*(str
+ 1) <= '9')) &&
139 ((root
) && (root
->func
== Val
))) {
140 VERBOSE (DEBUG
, PRINTOUT ("Oper: %d\n", Add
));
141 new = newelement (Add
, 2);
143 return (element_t
*)-1;
149 /* look for number */
151 if (((*str
>= '0') && (*str
<= '9')) ||
152 (*str
== '.') || (*str
== '-') ||(*str
== '+')) {
154 float value
= strtof (str
, &pt
);
155 VERBOSE (DEBUG
, PRINTOUT ("Value: %f\n", value
));
157 new = newelement (Val
, 1);
160 return (element_t
*)-1;
165 for (i
= 0; i
< root
->nbops
; i
++) {
166 if (root
->ops
[i
] == NULL
) {
173 return (element_t
*)-1;
184 return (element_t
*)-1;
192 /* print element tree */
194 void print_element (element_t
*root
, int level
)
202 for (i
= 0; i
< level
; i
++) {
206 switch (root
->func
) {
207 case Val
: func
= "Value"; break;
208 case Add
: func
= "Addition"; break;
209 case Sub
: func
= "Subtraction"; break;
210 case Mul
: func
= "Multiplication"; break;
211 case Div
: func
= "Division"; break;
212 case Pow
: func
= "Power"; break;
213 case Sqr
: func
= "Square Root"; break;
214 case Cos
: func
= "Cosine"; break;
215 case Sin
: func
= "Sine"; break;
216 case Atn
: func
= "Arc Tangent"; break;
217 case Log
: func
= "Logarithm"; break;
218 case Exp
: func
= "Exponantial"; break;
221 PRINTOUT ("Function: %s\n", func
);
223 if (root
->func
== Val
) {
224 for (i
= 0; i
< level
; i
++) {
227 PRINTOUT ("value: %f\n", root
->value
);
229 for (i
= 0; i
< root
->nbops
; i
++) {
230 print_element (root
->ops
[i
], level
+ 1);
235 /* vim: set ts=4 sw=4 et: */