Changeset 4306
- Timestamp:
- Jun 17, 2005, 12:53:55 PM (21 years ago)
- Location:
- trunk/Ohana/src/opihi/lib.shell
- Files:
-
- 2 edited
-
convert_to_RPN.c (modified) (3 diffs)
-
evaluate_stack.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c
r4305 r4306 23 23 type = 0; 24 24 /* unary operations */ 25 if (!strcmp (argv[i], "abs")) { type = 7; goto gotit; }26 if (!strcmp (argv[i], "int")) { type = 7; goto gotit; }27 if (!strcmp (argv[i], "exp")) { type = 7; goto gotit; }28 if (!strcmp (argv[i], "ten")) { type = 7; goto gotit; }29 if (!strcmp (argv[i], "log")) { type = 7; goto gotit; }30 if (!strcmp (argv[i], "ln")) { type = 7; goto gotit; }31 if (!strcmp (argv[i], "sqrt")) { type = 7; goto gotit; }32 if (!strcmp (argv[i], "erf")) { type = 7; goto gotit; }33 34 if (!strcmp (argv[i], "sinh")) { type = 7; goto gotit; }35 if (!strcmp (argv[i], "cosh")) { type = 7; goto gotit; }36 if (!strcmp (argv[i], "asinh")) { type = 7; goto gotit; }37 if (!strcmp (argv[i], "acosh")) { type = 7; goto gotit; }38 39 if (!strcmp (argv[i], "sin")) { type = 7; goto gotit; }40 if (!strcmp (argv[i], "cos")) { type = 7; goto gotit; }41 if (!strcmp (argv[i], "tan")) { type = 7; goto gotit; }42 if (!strcmp (argv[i], "dsin")) { type = 7; goto gotit; }43 if (!strcmp (argv[i], "dcos")) { type = 7; goto gotit; }44 if (!strcmp (argv[i], "dtan")) { type = 7; goto gotit; }45 if (!strcmp (argv[i], "asin")) { type = 7; goto gotit; }46 if (!strcmp (argv[i], "acos")) { type = 7; goto gotit; }47 if (!strcmp (argv[i], "atan")) { type = 7; goto gotit; }48 if (!strcmp (argv[i], "dasin")) { type = 7; goto gotit; }49 if (!strcmp (argv[i], "dacos")) { type = 7; goto gotit; }50 if (!strcmp (argv[i], "datan")) { type = 7; goto gotit; }51 52 if (!strcmp (argv[i], "lgamma")) { type = 7; goto gotit; }53 54 if (!strcmp (argv[i], "rnd")) { type = 7; goto gotit; }55 if (!strcmp (argv[i], "xramp")) { type = 7; goto gotit; }56 if (!strcmp (argv[i], "yramp")) { type = 7; goto gotit; }57 if (!strcmp (argv[i], "ramp")) { type = 7; goto gotit; }58 if (!strcmp (argv[i], "zero")) { type = 7; goto gotit; }59 if (!strcmp (argv[i], "--")) { type = 7; goto gotit; }60 if (!strcmp (argv[i], "not")) { type = 7; goto gotit; }61 if (!strcmp (argv[i], "isinf")) { type = 7; goto gotit; }62 if (!strcmp (argv[i], "isnan")) { type = 7; goto gotit; }25 if (!strcmp (argv[i], "abs")) { type = 9; goto gotit; } 26 if (!strcmp (argv[i], "int")) { type = 9; goto gotit; } 27 if (!strcmp (argv[i], "exp")) { type = 9; goto gotit; } 28 if (!strcmp (argv[i], "ten")) { type = 9; goto gotit; } 29 if (!strcmp (argv[i], "log")) { type = 9; goto gotit; } 30 if (!strcmp (argv[i], "ln")) { type = 9; goto gotit; } 31 if (!strcmp (argv[i], "sqrt")) { type = 9; goto gotit; } 32 if (!strcmp (argv[i], "erf")) { type = 9; goto gotit; } 33 34 if (!strcmp (argv[i], "sinh")) { type = 9; goto gotit; } 35 if (!strcmp (argv[i], "cosh")) { type = 9; goto gotit; } 36 if (!strcmp (argv[i], "asinh")) { type = 9; goto gotit; } 37 if (!strcmp (argv[i], "acosh")) { type = 9; goto gotit; } 38 39 if (!strcmp (argv[i], "sin")) { type = 9; goto gotit; } 40 if (!strcmp (argv[i], "cos")) { type = 9; goto gotit; } 41 if (!strcmp (argv[i], "tan")) { type = 9; goto gotit; } 42 if (!strcmp (argv[i], "dsin")) { type = 9; goto gotit; } 43 if (!strcmp (argv[i], "dcos")) { type = 9; goto gotit; } 44 if (!strcmp (argv[i], "dtan")) { type = 9; goto gotit; } 45 if (!strcmp (argv[i], "asin")) { type = 9; goto gotit; } 46 if (!strcmp (argv[i], "acos")) { type = 9; goto gotit; } 47 if (!strcmp (argv[i], "atan")) { type = 9; goto gotit; } 48 if (!strcmp (argv[i], "dasin")) { type = 9; goto gotit; } 49 if (!strcmp (argv[i], "dacos")) { type = 9; goto gotit; } 50 if (!strcmp (argv[i], "datan")) { type = 9; goto gotit; } 51 52 if (!strcmp (argv[i], "lgamma")) { type = 9; goto gotit; } 53 54 if (!strcmp (argv[i], "rnd")) { type = 9; goto gotit; } 55 if (!strcmp (argv[i], "xramp")) { type = 9; goto gotit; } 56 if (!strcmp (argv[i], "yramp")) { type = 9; goto gotit; } 57 if (!strcmp (argv[i], "ramp")) { type = 9; goto gotit; } 58 if (!strcmp (argv[i], "zero")) { type = 9; goto gotit; } 59 if (!strcmp (argv[i], "--")) { type = 9; goto gotit; } 60 if (!strcmp (argv[i], "not")) { type = 9; goto gotit; } 61 if (!strcmp (argv[i], "isinf")) { type = 9; goto gotit; } 62 if (!strcmp (argv[i], "isnan")) { type = 9; goto gotit; } 63 63 64 64 /* binary operations */ 65 if (!strcmp (argv[i], "^")) { type = 6; goto gotit; }66 67 if (!strcmp (argv[i], "@")) { type = 5; goto gotit; }68 if (!strcmp (argv[i], "/")) { type = 5; goto gotit; }69 if (!strcmp (argv[i], "*")) { type = 5; goto gotit; }70 71 if (!strcmp (argv[i], "+")) { type = 4; goto gotit; }72 if (!strcmp (argv[i], "-")) { type = 4; goto gotit; }65 if (!strcmp (argv[i], "^")) { type = 8; goto gotit; } 66 67 if (!strcmp (argv[i], "@")) { type = 7; goto gotit; } 68 if (!strcmp (argv[i], "/")) { type = 7; goto gotit; } 69 if (!strcmp (argv[i], "*")) { type = 7; goto gotit; } 70 71 if (!strcmp (argv[i], "+")) { type = 6; goto gotit; } 72 if (!strcmp (argv[i], "-")) { type = 6; goto gotit; } 73 73 74 if (!strcmp (argv[i], "<")) { type = 3; goto gotit; } 75 if (!strcmp (argv[i], ">")) { type = 3; goto gotit; } 74 if (!strcmp (argv[i], "&")) { type = 5; goto gotit; } 75 if (!strcmp (argv[i], "|")) { type = 5; goto gotit; } 76 77 if (!strcmp (argv[i], "<")) { type = 4; goto gotit; } 78 if (!strcmp (argv[i], ">")) { type = 4; goto gotit; } 79 if (!strcmp (argv[i], "==")) { type = 4; strcpy (argv[i], "E"); goto gotit; } 80 if (!strcmp (argv[i], "!=")) { type = 4; strcpy (argv[i], "N"); goto gotit; } 81 if (!strcmp (argv[i], "<=")) { type = 4; strcpy (argv[i], "L"); goto gotit; } 82 if (!strcmp (argv[i], ">=")) { type = 4; strcpy (argv[i], "G"); goto gotit; } 83 if (!strcmp (argv[i], ">>")) { type = 4; strcpy (argv[i], "U"); goto gotit; } 84 if (!strcmp (argv[i], "<<")) { type = 4; strcpy (argv[i], "D"); goto gotit; } 85 76 86 if (!strcmp (argv[i], "&&")) { type = 3; strcpy (argv[i], "A"); goto gotit; } 77 87 if (!strcmp (argv[i], "||")) { type = 3; strcpy (argv[i], "O"); goto gotit; } 78 if (!strcmp (argv[i], "==")) { type = 3; strcpy (argv[i], "E"); goto gotit; }79 if (!strcmp (argv[i], "!=")) { type = 3; strcpy (argv[i], "N"); goto gotit; }80 if (!strcmp (argv[i], "<=")) { type = 3; strcpy (argv[i], "L"); goto gotit; }81 if (!strcmp (argv[i], ">=")) { type = 3; strcpy (argv[i], "G"); goto gotit; }82 if (!strcmp (argv[i], ">>")) { type = 3; strcpy (argv[i], "U"); goto gotit; }83 if (!strcmp (argv[i], "<<")) { type = 3; strcpy (argv[i], "D"); goto gotit; }84 if (!strcmp (argv[i], "&")) { type = 3; goto gotit; }85 if (!strcmp (argv[i], "|")) { type = 3; goto gotit; }86 88 87 89 if (!strcmp (argv[i], "(")) { type = 2; goto gotit; } … … 91 93 /* choose how to deal with object */ 92 94 switch (type) { 93 case 6: /* exponentiation */ 94 /* pop previous, higher operators from OP stack to stack */ 95 for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type > type); j--) { 96 strcpy (stack[Nstack].name, op_stack[j].name); 97 stack[Nstack].type = op_stack[j].type; 95 case 8: /* exponentiation: 2^2^3 = 64 != 256 (precedence is right-to-left, not left-to-right!) */ 96 /* pop previous, higher operators from OP stack to stack */ 97 for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type > type); j--) { 98 strcpy (stack[Nstack].name, op_stack[j].name); 99 stack[Nstack].type = op_stack[j].type; 100 Nstack ++; 101 Nop_stack --; 102 } 103 /* push operator on OP stack */ 104 strcpy (op_stack[Nop_stack].name, argv[i]); 105 op_stack[Nop_stack].type = type; 106 Nop_stack ++; 107 break; 108 case 9: /* unary OPs */ 109 case 7: /* binary OPs */ 110 case 6: 111 case 5: 112 case 4: 113 case 3: 114 /* pop previous, higher or equal operators from OP stack to stack */ 115 for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type >= type); j--) { 116 strcpy (stack[Nstack].name, op_stack[j].name); 117 stack[Nstack].type = op_stack[j].type; 118 Nstack ++; 119 Nop_stack --; 120 } 121 /* push operator on OP stack */ 122 strcpy (op_stack[Nop_stack].name, argv[i]); 123 op_stack[Nop_stack].type = type; 124 Nop_stack ++; 125 break; 126 case 2: 127 /* push operator on OP stack */ 128 strcpy (op_stack[Nop_stack].name, argv[i]); 129 op_stack[Nop_stack].type = type; 130 Nop_stack ++; 131 break; 132 case 1: 133 /* pop rest of operators from OP stack to stack, looking for '(' */ 134 for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type != 2); j--) { 135 strcpy (stack[Nstack].name, op_stack[j].name); 136 stack[Nstack].type = op_stack[j].type; 137 Nstack ++; 138 Nop_stack --; 139 } 140 if ((j == -1) || (op_stack[j].type != 2)) { 141 push_error ("syntax error: mismatched parenthesis"); 142 Nstack = 0; 143 goto cleanup; 144 } 145 Nop_stack --; 146 break; 147 case 0: 148 /* place the value (number or vector/matrix name) on stack */ 149 /* value of 'X' is used as sentinel until we sort out values */ 150 strcpy (stack[Nstack].name, argv[i]); 151 stack[Nstack].type = 'X'; 98 152 Nstack ++; 99 Nop_stack --; 100 } 101 /* push operator on OP stack */ 102 strcpy (op_stack[Nop_stack].name, argv[i]); 103 op_stack[Nop_stack].type = type; 104 Nop_stack ++; 105 break; 106 case 7: /* unary OPs */ 107 case 5: /* binary OPs */ 108 case 4: 109 case 3: 110 /* pop previous, higher or equal operators from OP stack to stack */ 111 for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type >= type); j--) { 112 strcpy (stack[Nstack].name, op_stack[j].name); 113 stack[Nstack].type = op_stack[j].type; 114 Nstack ++; 115 Nop_stack --; 116 } 117 /* push operator on OP stack */ 118 strcpy (op_stack[Nop_stack].name, argv[i]); 119 op_stack[Nop_stack].type = type; 120 Nop_stack ++; 121 break; 122 case 2: 123 /* push operator on OP stack */ 124 strcpy (op_stack[Nop_stack].name, argv[i]); 125 op_stack[Nop_stack].type = type; 126 Nop_stack ++; 127 break; 128 case 1: 129 /* pop rest of operators from OP stack to stack, looking for '(' */ 130 for (j = Nop_stack - 1; (j >= 0) && (op_stack[j].type != 2); j--) { 131 strcpy (stack[Nstack].name, op_stack[j].name); 132 stack[Nstack].type = op_stack[j].type; 133 Nstack ++; 134 Nop_stack --; 135 } 136 if ((j == -1) || (op_stack[j].type != 2)) { 137 push_error ("syntax error: mismatched parenthesis"); 138 Nstack = 0; 139 goto cleanup; 140 } 141 Nop_stack --; 142 break; 143 case 0: 144 /* place the value (number or vector/matrix name) on stack */ 145 /* value of 'X' is used as sentinel until we sort out values */ 146 strcpy (stack[Nstack].name, argv[i]); 147 stack[Nstack].type = 'X'; 148 Nstack ++; 149 break; 153 break; 150 154 } 151 155 } … … 193 197 /* here are the rules for parsing a math AOL line to RPN: 194 198 195 1) if object is a number, push on stack196 2) if object is a third order operand (exp, sin, cos), push on op stack197 3) if object is an open paren, push on op stack,198 4) if object is a second order operand, push on stack199 5) if object is a first order operand, pop all second order operands from stack200 until paren, push on stack201 6) if object is an end paren, pop all objects from stack until paren,202 pop next stack, if third order op203 7) if end of line, pop all remaining objects, second order first, etc.199 1) if object is a number, push on stack 200 2) if object is a third order operand (exp, sin, cos), push on op stack 201 3) if object is an open paren, push on op stack, 202 4) if object is a second order operand, push on stack 203 5) if object is a first order operand, pop all second order operands from stack 204 until paren, push on stack 205 6) if object is an end paren, pop all objects from stack until paren, 206 pop next stack, if third order op 207 7) if end of line, pop all remaining objects, second order first, etc. 204 208 205 209 */ -
trunk/Ohana/src/opihi/lib.shell/evaluate_stack.c
r4305 r4306 1 1 # include "opihi.h" 2 2 # define VERBOSE 0 3 4 # define TWO_OP(A,B,FUNC) \ 5 if (!strncasecmp (&stack[i - 2].type, A, 1) && !strncasecmp (&stack[i - 1].type, B, 1)) \ 6 status = FUNC (&tmp_stack, &stack[i - 2], &stack[i - 1], stack[i].name); 7 8 # define ONE_OP(A,FUNC) \ 9 if (!strncasecmp (&stack[i - 1].type, A, 1)) \ 10 status = FUNC (&tmp_stack, &stack[i - 1], stack[i].name); 3 11 4 12 int evaluate_stack (StackVar *stack, int *Nstack) { … … 48 56 49 57 /***** binary operators *****/ 50 if ((stack[i].type == 3) || (stack[i].type == 4) || (stack[i].type == 5) || (stack[i].type == 6)) {58 if ((stack[i].type >= 3) && (stack[i].type <= 8)) { 51 59 52 60 if (i < 2) { /* need two variables to operate on */ … … 56 64 return (FALSE); 57 65 } 58 59 /* this could be macro generated... */60 # define TWO_OP(A,B,FUNC) \61 if (!strncasecmp (&stack[i - 2].type, A, 1) && !strncasecmp (&stack[i - 1].type, B, 1)) \62 status = FUNC (&tmp_stack, &stack[i - 2], &stack[i - 1], stack[i].name);63 66 64 67 TWO_OP ("M","M",MM_binary); … … 91 94 92 95 /***** unary operators **/ 93 if (stack[i].type == 7) {96 if (stack[i].type == 9) { 94 97 95 98 if (i < 1) { /* need one variable to operate on */ … … 99 102 } 100 103 101 if (!strncasecmp (&stack[i - 1].type, "M", 1)) 102 M_unary (&tmp_stack, &stack[i - 1], stack[i].name); 103 if (!strncasecmp (&stack[i - 1].type, "V", 1)) 104 V_unary (&tmp_stack, &stack[i - 1], stack[i].name); 105 if (!strncasecmp (&stack[i - 1].type, "S", 1)) 106 S_unary (&tmp_stack, &stack[i - 1], stack[i].name); 104 ONE_OP ("M", M_unary); 105 ONE_OP ("V", V_unary); 106 ONE_OP ("S", S_unary); 107 107 108 108 /* there are no valid unary string operators */
Note:
See TracChangeset
for help on using the changeset viewer.
