1
0

operation.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #include "__run.h"
  2. /**
  3. * operation.c中是用于数学计算的函数
  4. */
  5. #define getresult(base, var, inter) do{ \
  6. if (operationSafeInterStatement(&var, CALL_INTER_FUNCTIONSIG(st->u.operation. base, var_list))){ return var; } \
  7. }while(0)
  8. #define viewtype_core(a, b, valuetype_a, valuetype_a_b) a .value->value->type == valuetype_a && b.value->value->type == valuetype_a_b
  9. #define viewtype(a, b, valuetype) viewtype_core(a, b, valuetype, valuetype)
  10. #define operationValue(a, b, type, symbol) a.value->value->data.type symbol b.value->value->data.type
  11. #define valueToResult(result, result_value, type, inter) result.value->value = make##type##Value(result_value, inter)
  12. #define noneOperation(left, right, result) do{ \
  13. if (left.value->value->type == none){ \
  14. result = right; \
  15. } \
  16. else if (right.value->value->type == none){ \
  17. result = left; \
  18. } \
  19. } while(0)
  20. Result addOperation(INTER_FUNCTIONSIG);
  21. Result subOperation(INTER_FUNCTIONSIG);
  22. Result mulOperation(INTER_FUNCTIONSIG);
  23. Result divOperation(INTER_FUNCTIONSIG);
  24. Result assOperation(INTER_FUNCTIONSIG);
  25. /**
  26. * operation的整体操作
  27. * @param st
  28. * @param inter
  29. * @param var_list
  30. * @return
  31. */
  32. Result operationStatement(INTER_FUNCTIONSIG) {
  33. Result result;
  34. switch (st->u.operation.OperationType) {
  35. case ADD:
  36. result = addOperation(CALL_INTER_FUNCTIONSIG(st, var_list));
  37. break;
  38. case SUB:
  39. result = subOperation(CALL_INTER_FUNCTIONSIG(st, var_list));
  40. break;
  41. case MUL:
  42. result = mulOperation(CALL_INTER_FUNCTIONSIG(st, var_list));
  43. break;
  44. case DIV:
  45. result = divOperation(CALL_INTER_FUNCTIONSIG(st, var_list));
  46. break;
  47. case ASS:
  48. result = assOperation(CALL_INTER_FUNCTIONSIG(st, var_list));
  49. break;
  50. default:
  51. setResult(&result, true, inter);
  52. break;
  53. }
  54. return result;
  55. }
  56. Result addOperation(INTER_FUNCTIONSIG) {
  57. Result left;
  58. Result right;
  59. Result result;
  60. setResultOperation(&result, inter);
  61. getresult(left, left, inter);
  62. getresult(right, right, inter);
  63. if (viewtype(left, right, number)){
  64. valueToResult(result, (operationValue(left, right, num.num, +)), Number, inter);
  65. }
  66. else if(viewtype(left, right, string)){
  67. char *new_string = memStrcat(left.value->value->data.str.str, right.value->value->data.str.str);
  68. valueToResult(result, new_string, String, inter);
  69. memFree(new_string);
  70. }
  71. noneOperation(left, right, result);
  72. return result;
  73. }
  74. Result subOperation(INTER_FUNCTIONSIG) {
  75. Result left;
  76. Result right;
  77. Result result;
  78. setResultOperation(&result, inter);
  79. getresult(left, left, inter);
  80. getresult(right, right, inter);
  81. if (viewtype(left, right, number)){
  82. valueToResult(result, (operationValue(left, right, num.num, -)), Number, inter);
  83. }
  84. noneOperation(left, right, result);
  85. return result;
  86. }
  87. Result mulOperation(INTER_FUNCTIONSIG) {
  88. Result left;
  89. Result right;
  90. Result result;
  91. setResultOperation(&result, inter);
  92. getresult(left, left, inter);
  93. getresult(right, right, inter);
  94. if (viewtype(left, right, number)){
  95. valueToResult(result, (operationValue(left, right, num.num, *)), Number, inter);
  96. }
  97. else if(viewtype_core(left, right, number, string)){
  98. Result tmp = left;
  99. left = right;
  100. right = tmp;
  101. goto mul_str;
  102. }
  103. else if(viewtype_core(left, right, string, number)){
  104. mul_str:
  105. {
  106. char *new_string = memStrcpySelf(left.value->value->data.str.str, right.value->value->data.num.num);
  107. valueToResult(result, new_string, String, inter);
  108. memFree(new_string);
  109. }
  110. }
  111. noneOperation(left, right, result);
  112. return result;
  113. }
  114. Result divOperation(INTER_FUNCTIONSIG) {
  115. Result left;
  116. Result right;
  117. Result result;
  118. setResultOperation(&result, inter);
  119. getresult(left, left, inter);
  120. getresult(right, right, inter);
  121. if (viewtype(left, right, number)){
  122. valueToResult(result, (operationValue(left, right, num.num, /)), Number, inter);
  123. }
  124. noneOperation(left, right, result);
  125. return result;
  126. }
  127. Result assOperation(INTER_FUNCTIONSIG) {
  128. Result result;
  129. Result times;
  130. getresult(right, result, inter);
  131. times = assCore(st->u.operation.left, result.value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  132. checkResult(times);
  133. return result;
  134. }
  135. Result assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_CORE){
  136. Result result;
  137. Result times;
  138. setResult(&result, true, inter);
  139. int int_times;
  140. if (name->type == base_var){
  141. if (name->u.base_var.times == NULL){
  142. int_times = 0;
  143. goto not_times;
  144. }
  145. if (operationSafeInterStatement(&times, CALL_INTER_FUNCTIONSIG(name->u.base_var.times, var_list))){
  146. return times;
  147. }
  148. int_times = (int)times.value->value->data.num.num;
  149. not_times:
  150. addFromVarList(name->u.base_var.name, var_list, int_times, value);
  151. }
  152. else if (name->type == base_list){
  153. Result tmp_result;
  154. Statement *tmp_st = makeStatement();
  155. tmp_st->type = base_value;
  156. tmp_st->u.base_value.value = value;
  157. Parameter *pt = makeOnlyArgsParameter(tmp_st);
  158. Argument *call = getArgument(pt, &tmp_result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  159. if (!run_continue(tmp_result)) {
  160. freeArgument(call, false);
  161. freeParameter(pt, true);
  162. return tmp_result;
  163. }
  164. tmp_result = setParameterCore(call, name->u.base_list.list, var_list, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  165. if (run_continue(tmp_result)) {
  166. Argument *tmp = call;
  167. result.value->value = makeListValue(&tmp, inter, value_tuple);
  168. }
  169. else
  170. result = tmp_result;
  171. freeArgument(call, false);
  172. freeParameter(pt, true);
  173. }
  174. return result;
  175. }
  176. Result getBaseVar(INTER_FUNCTIONSIG) {
  177. Result result;
  178. Result times;
  179. int int_times;
  180. setResultOperation(&result, inter);
  181. if (st->u.base_var.times == NULL){
  182. int_times = 0;
  183. goto not_times;
  184. }
  185. if (operationSafeInterStatement(&times, CALL_INTER_FUNCTIONSIG(st->u.base_var.times, var_list))){
  186. return times;
  187. }
  188. int_times = (int)times.value->value->data.num.num;
  189. not_times:
  190. result.value = findFromVarList(st->u.base_var.name, var_list, int_times);
  191. if (result.value == NULL){
  192. writeLog_(inter->debug, WARNING, "var not found[%s]\n", st->u.base_var.name);
  193. setResultError(&result, inter);
  194. }
  195. return result;
  196. }
  197. Result getBaseValue(INTER_FUNCTIONSIG) {
  198. Result result;
  199. setResult(&result, true, inter);
  200. result.value = st->u.base_value.value;
  201. result.type = operation_return;
  202. return result;
  203. }
  204. Result getList(INTER_FUNCTIONSIG) {
  205. Result result;
  206. Argument *at = getArgument(st->u.base_list.list, &result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  207. Argument *at_tmp = at;
  208. if (!run_continue(result)){
  209. freeArgument(at_tmp, true);
  210. return result;
  211. }
  212. int type = st->u.base_list.type == tuple_ ? value_tuple : value_list;
  213. Value *value = makeListValue(&at, inter, type);
  214. setResultOperation(&result ,inter);
  215. result.value->value = value;
  216. freeArgument(at_tmp, true);
  217. return result;
  218. }