operation.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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, right, result;
  58. setResultOperation(&result, inter);
  59. getresult(left, left, inter);
  60. getresult(right, right, inter);
  61. if (viewtype(left, right, number)){
  62. valueToResult(result, (operationValue(left, right, num.num, +)), Number, inter);
  63. }
  64. else if(viewtype(left, right, string)){
  65. char *new_string = memStrcat(left.value->value->data.str.str, right.value->value->data.str.str);
  66. valueToResult(result, new_string, String, inter);
  67. memFree(new_string);
  68. }
  69. noneOperation(left, right, result);
  70. return result;
  71. }
  72. Result subOperation(INTER_FUNCTIONSIG) {
  73. Result left, right, result;
  74. setResultOperation(&result, inter);
  75. getresult(left, left, inter);
  76. getresult(right, right, inter);
  77. if (viewtype(left, right, number)){
  78. valueToResult(result, (operationValue(left, right, num.num, -)), Number, inter);
  79. }
  80. noneOperation(left, right, result);
  81. return result;
  82. }
  83. Result mulOperation(INTER_FUNCTIONSIG) {
  84. Result left, right, result;
  85. setResultOperation(&result, inter);
  86. getresult(left, left, inter);
  87. getresult(right, right, inter);
  88. if (viewtype(left, right, number)){
  89. valueToResult(result, (operationValue(left, right, num.num, *)), Number, inter);
  90. }
  91. else if(viewtype_core(left, right, number, string)){
  92. Result tmp = left;
  93. left = right;
  94. right = tmp;
  95. goto mul_str;
  96. }
  97. else if(viewtype_core(left, right, string, number)){
  98. mul_str:
  99. {
  100. char *new_string = memStrcpySelf(left.value->value->data.str.str, right.value->value->data.num.num);
  101. valueToResult(result, new_string, String, inter);
  102. memFree(new_string);
  103. }
  104. }
  105. noneOperation(left, right, result);
  106. return result;
  107. }
  108. Result divOperation(INTER_FUNCTIONSIG) {
  109. Result left, right, result;
  110. setResultOperation(&result, inter);
  111. getresult(left, left, inter);
  112. getresult(right, right, inter);
  113. if (viewtype(left, right, number)){
  114. valueToResult(result, (operationValue(left, right, num.num, /)), Number, inter);
  115. }
  116. noneOperation(left, right, result);
  117. return result;
  118. }
  119. Result assOperation(INTER_FUNCTIONSIG) {
  120. Result result, times;
  121. getresult(right, result, inter);
  122. times = assCore(st->u.operation.left, result.value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  123. checkResult(times);
  124. return result;
  125. }
  126. Result assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_CORE){
  127. Result result, times;
  128. setResult(&result, true, inter);
  129. int int_times;
  130. if (name->type == base_var){
  131. if (name->u.base_var.times == NULL){
  132. int_times = 0;
  133. goto not_times;
  134. }
  135. if (operationSafeInterStatement(&times, CALL_INTER_FUNCTIONSIG(name->u.base_var.times, var_list))){
  136. return times;
  137. }
  138. int_times = (int)times.value->value->data.num.num;
  139. not_times:
  140. addFromVarList(name->u.base_var.name, var_list, int_times, value);
  141. }
  142. return result;
  143. }
  144. Result getBaseVar(INTER_FUNCTIONSIG) {
  145. Result times, result;
  146. int int_times;
  147. setResultOperation(&result, inter);
  148. if (st->u.base_var.times == NULL){
  149. int_times = 0;
  150. goto not_times;
  151. }
  152. if (operationSafeInterStatement(&times, CALL_INTER_FUNCTIONSIG(st->u.base_var.times, var_list))){
  153. return times;
  154. }
  155. int_times = (int)times.value->value->data.num.num;
  156. not_times:
  157. result.value = findFromVarList(st->u.base_var.name, var_list, int_times);
  158. if (result.value == NULL){
  159. writeLog_(inter->debug, WARNING, "var not found[%s]\n", st->u.base_var.name);
  160. setResultError(&result, inter);
  161. }
  162. return result;
  163. }
  164. Result getBaseValue(INTER_FUNCTIONSIG) {
  165. Result result;
  166. setResult(&result, true, inter);
  167. result.value->value = st->u.base_value.value;
  168. result.type = operation_return;
  169. return result;
  170. }
  171. Result getList(INTER_FUNCTIONSIG) {
  172. Result tmp, result;
  173. Parameter *tmp_pt = st->u.base_list.list; // 避免直接传入st->u.base_list.list的指针导致其值发生改变
  174. int type = st->u.base_list.type == tuple_ ? value_tuple : value_list;
  175. Value *value = makeListValue(&tmp_pt, &tmp, CALL_INTER_FUNCTIONSIG_CORE(var_list), type);
  176. if (!run_continue(tmp))
  177. return tmp;
  178. setResultOperation(&result ,inter);
  179. result.value->value = value;
  180. return result;
  181. }