parameter.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. #include "__virtualmath.h"
  2. #define returnResult(result) do{ \
  3. if (!run_continue(result)) { \
  4. goto return_; \
  5. } \
  6. }while(0)
  7. Argument *makeArgument(){
  8. Argument *tmp = memCalloc(1, sizeof(Argument));
  9. tmp->type = value_arg;
  10. tmp->data.value = NULL;
  11. tmp->data.name = NULL;
  12. tmp->next = NULL;
  13. return tmp;
  14. }
  15. Argument *makeOnlyValueArgument(LinkValue *value){
  16. Argument *tmp = makeArgument();
  17. tmp->data.value = value;
  18. return tmp;
  19. }
  20. Argument *makeNameValueArgument(LinkValue *value, Statement *name){
  21. Argument *tmp = makeArgument();
  22. tmp->type = name_arg;
  23. tmp->data.value = value;
  24. tmp->data.name = name;
  25. return tmp;
  26. }
  27. Argument *connectArgument(Argument *new, Argument *base){
  28. if (base == NULL)
  29. return new;
  30. Argument *tmp = base;
  31. while (base->next != NULL)
  32. base = base->next;
  33. base->next = new;
  34. return tmp;
  35. }
  36. Argument *connectOnlyValueArgument(LinkValue *value, Argument *base){
  37. Argument *new = makeOnlyValueArgument(value);
  38. return connectArgument(new, base);
  39. }
  40. Argument *connectNameValueArgument(LinkValue *value, Statement *name, Argument *base){
  41. Argument *new = makeNameValueArgument(value, name);
  42. return connectArgument(new, base);
  43. }
  44. void freeArgument(Argument *pt, bool free_st) {
  45. while (pt != NULL){
  46. if (free_st)
  47. freeStatement(pt->data.name);
  48. Argument *tmp = pt->next;
  49. memFree(pt);
  50. pt = tmp;
  51. }
  52. }
  53. Parameter *makeParameter(){
  54. Parameter *tmp = memCalloc(1, sizeof(Parameter));
  55. tmp->type = value_par;
  56. tmp->data.value = NULL;
  57. tmp->data.name = NULL;
  58. tmp->next = NULL;
  59. return tmp;
  60. }
  61. Parameter *copyParameter(Parameter *base){
  62. if (base == NULL)
  63. return NULL;
  64. Parameter *tmp = makeParameter(), *base_tmp = tmp;
  65. tmp->data = base->data;
  66. tmp->type = base->type;
  67. while (base->next != NULL){
  68. tmp->next = makeParameter();
  69. tmp = tmp->next;
  70. base = base->next;
  71. tmp->data = base->data;
  72. tmp->type = base->type;
  73. }
  74. return base_tmp;
  75. }
  76. Parameter *makeOnlyValueParameter(Statement *st){
  77. Parameter *tmp = makeParameter();
  78. tmp->data.value = st;
  79. return tmp;
  80. }
  81. Parameter *makeNameValueParameter(Statement *value, Statement *name){
  82. Parameter *tmp = makeParameter();
  83. tmp->type = name_par;
  84. tmp->data.value = value;
  85. tmp->data.name = name;
  86. return tmp;
  87. }
  88. Parameter *makeOnlyArgsParameter(Statement *st){
  89. Parameter *tmp = makeParameter();
  90. tmp->type = args_par;
  91. tmp->data.value = st;
  92. return tmp;
  93. }
  94. Parameter *connectParameter(Parameter *new, Parameter *base){
  95. if (base == NULL)
  96. return new;
  97. Parameter *tmp = base;
  98. while (base->next != NULL)
  99. base = base->next;
  100. base->next = new;
  101. return tmp;
  102. }
  103. Parameter *connectOnlyValueParameter(Statement *st, Parameter *base){
  104. Parameter *new = makeOnlyValueParameter(st);
  105. return connectParameter(new, base);
  106. }
  107. Parameter *connectNameValueParameter(Statement *value, Statement *name, Parameter *base){
  108. Parameter *new = makeNameValueParameter(value, name);
  109. return connectParameter(new, base);
  110. }
  111. Parameter *connectOnlyArgsParameter(Statement *st, Parameter *base){
  112. Parameter *new = makeOnlyArgsParameter(st);
  113. return connectParameter(new, base);
  114. }
  115. void freeParameter(Parameter *pt, bool free_st) {
  116. while (pt != NULL){
  117. if (free_st) {
  118. freeStatement(pt->data.value);
  119. freeStatement(pt->data.name);
  120. }
  121. Parameter *tmp = pt->next;
  122. memFree(pt);
  123. pt = tmp;
  124. }
  125. }
  126. Argument *listToArgument(LinkValue *list_value, INTER_FUNCTIONSIG_CORE){
  127. Argument *at = NULL;
  128. for (int i=0;i<list_value->value->data.list.size;i++){
  129. at = connectOnlyValueArgument(list_value->value->data.list.list[i], at);
  130. }
  131. return at;
  132. }
  133. /**
  134. * 设置形式参数的默认值
  135. * 仅支持name_value
  136. * @param function_ad
  137. * @param inter
  138. * @param var_list
  139. * @param num
  140. * @return
  141. */
  142. Result defaultParameter(Parameter **function_ad, Inter *inter, VarList *var_list, int *num) {
  143. Parameter *function = *function_ad;
  144. Result result;
  145. while (function != NULL && function->type == name_par){
  146. Result tmp, tmp_ass;
  147. if(operationSafeInterStatement(&tmp, CALL_INTER_FUNCTIONSIG(function->data.value, var_list))) {
  148. *function_ad = function;
  149. return tmp;
  150. }
  151. tmp_ass = assCore(function->data.name, tmp.value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  152. if (!run_continue(tmp_ass)) {
  153. *function_ad = function;
  154. return tmp_ass;
  155. }
  156. (*num)++;
  157. function = function->next;
  158. }
  159. setResult(&result, true, inter);
  160. *function_ad = function;
  161. return result;
  162. }
  163. /**
  164. * 设置实际参数的默认值, 仅支持name_base_value
  165. * @param call_ad
  166. * @param inter
  167. * @param var_list
  168. * @param num
  169. * @return
  170. */
  171. Result argumentToVar(Argument **call_ad, struct Inter *inter, struct VarList *var_list, NUMBER_TYPE *num) {
  172. Argument *call = *call_ad;
  173. Result result;
  174. while (call != NULL && call->type == name_arg){
  175. Result tmp_ass;
  176. tmp_ass = assCore(call->data.name, call->data.value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  177. if (!run_continue(tmp_ass)) {
  178. *call_ad = call;
  179. return tmp_ass;
  180. }
  181. (*num)++;
  182. call = call->next;
  183. }
  184. setResult(&result, true, inter);
  185. *call_ad = call;
  186. return result;
  187. }
  188. /**
  189. * 形式参数从变量空间中获取值
  190. * @param function_ad
  191. * @param function_var
  192. * @param inter
  193. * @param var_list
  194. * @param num
  195. * @return
  196. */
  197. Result parameterFromVar(Parameter **function_ad, VarList *function_var, INTER_FUNCTIONSIG_CORE, NUMBER_TYPE *num){
  198. Parameter *function = *function_ad;
  199. Result result;
  200. setResultOperation(&result, inter);
  201. bool get;
  202. while (function != NULL){
  203. Result tmp;
  204. Statement *name = function->type == value_par ? function->data.value : function->data.name;
  205. char *str_name = NULL;
  206. int int_times;
  207. LinkValue *value = NULL;
  208. get = true;
  209. tmp = getBaseVarInfo(&str_name, &int_times, CALL_INTER_FUNCTIONSIG(name, var_list));
  210. if (!run_continue(tmp)) {
  211. memFree(str_name);
  212. return tmp;
  213. }
  214. value = findFromVarList(str_name, var_list, int_times, true);
  215. memFree(str_name);
  216. if(value == NULL) {
  217. get = false;
  218. if (function->type == name_par && !operationSafeInterStatement(&tmp, CALL_INTER_FUNCTIONSIG(function->data.value, var_list))) {
  219. value = tmp.value;
  220. goto not_return;
  221. }
  222. setResultError(&tmp, inter);
  223. *function_ad = function;
  224. return tmp;
  225. }
  226. not_return:
  227. tmp = assCore(name, value, CALL_INTER_FUNCTIONSIG_CORE(function_var));
  228. if (!run_continue(tmp)) {
  229. *function_ad = function;
  230. return tmp;
  231. }
  232. if (get)
  233. (*num)++;
  234. function = function->next;
  235. }
  236. setResult(&result, true, inter);
  237. *function_ad = function;
  238. return result;
  239. }
  240. /**
  241. * 对位赋值
  242. * @param call_ad
  243. * @param function_ad
  244. * @param function_var
  245. * @param inter
  246. * @param var_list
  247. * @return
  248. */
  249. Result argumentToParameter(Argument **call_ad, Parameter **function_ad, VarList *function_var, INTER_FUNCTIONSIG_CORE){
  250. Argument *call = *call_ad;
  251. Parameter *function = *function_ad;
  252. Result result;
  253. while (call != NULL && function != NULL && (call->type == value_arg) && function->type != args_par){
  254. Result tmp_ass;
  255. Statement *name = function->type == value_par ? function->data.value : function->data.name;
  256. tmp_ass = assCore(name, call->data.value, CALL_INTER_FUNCTIONSIG_CORE(function_var));
  257. if (!run_continue(tmp_ass)) {
  258. *call_ad = call;
  259. *function_ad = function;
  260. return tmp_ass;
  261. }
  262. call = call->next;
  263. function = function->next;
  264. }
  265. setResult(&result, true, inter);
  266. *call_ad = call;
  267. *function_ad = function;
  268. return result;
  269. }
  270. /**
  271. * 把所有实际参数的值计算出来
  272. * @param call_ad
  273. * @param inter
  274. * @param var_list
  275. * @return
  276. */
  277. Result iterParameter(Parameter *call, Argument **base_ad, INTER_FUNCTIONSIG_CORE){
  278. Result result;
  279. Argument *base = *base_ad;
  280. while (call != NULL){
  281. Result tmp;
  282. if(operationSafeInterStatement(&tmp, CALL_INTER_FUNCTIONSIG(call->data.value, var_list))) {
  283. *base_ad = base;
  284. return tmp;
  285. }
  286. if (call->type == value_par)
  287. base = connectOnlyValueArgument(tmp.value, base);
  288. else if (call->type == name_par)
  289. base = connectNameValueArgument(tmp.value, call->data.name, base);
  290. else if (call->type == args_par){
  291. Argument *tmp_at = listToArgument(tmp.value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  292. base = connectArgument(tmp_at, base);
  293. }
  294. call = call->next;
  295. }
  296. setResult(&result, true, inter);
  297. *base_ad = base;
  298. return result;
  299. }
  300. Argument *getArgument(Parameter *call, Result *result, INTER_FUNCTIONSIG_CORE){
  301. Argument *new_arg = NULL;
  302. *result = iterParameter(call, &new_arg, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  303. return new_arg;
  304. }
  305. /**
  306. * 参数表:
  307. |实参 \ 形参| name | value | arg | kwarg | null |
  308. ----------------------------------------
  309. |name | p_3 | p_3 | p_4 | p_5! | error |
  310. |value | p_1 | p_1 | p_4 | error | error |
  311. |null | p_2 | error | p_4 | p_5 | okay |
  312. ----------------------------------------
  313. * 注解: @p_1 match_status; @p_2 default_status; @p_3 self_ass; @p_4 mul_par; @p_5 pow_par
  314. * @param call
  315. * @param function
  316. * @param function_var
  317. * @param inter
  318. * @param var_list
  319. * @return
  320. */
  321. Result setParameter(Parameter *call_base, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_CORE) {
  322. Result result;
  323. Argument *call;
  324. call = getArgument(call_base, &result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  325. if (!run_continue(result)) {
  326. freeArgument(call, false);
  327. return result;
  328. }
  329. result = setParameterCore(call, function_base, function_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  330. freeArgument(call, false);
  331. return result;
  332. }
  333. Result setParameterCore(Argument *call, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_CORE){
  334. Result result;
  335. Parameter *function = copyParameter(function_base), *tmp_function = function; // 释放使用
  336. enum {
  337. match_status = 1,
  338. default_status = 2,
  339. self_ass = 3,
  340. mul_par = 4,
  341. error = -1,
  342. finished = 0
  343. } status = match_status;
  344. while (true){
  345. if (call == NULL && function == NULL)
  346. status = finished;
  347. else if ((call != NULL && function == NULL) || (call == NULL && function != NULL && function->type == value_par))
  348. status = error;
  349. else if (call == NULL && function->type == name_par) // 根据前面的条件, 已经决定function不会为NULL
  350. status = default_status;
  351. else if (function->type == args_par)
  352. status = mul_par;
  353. else if (call->type == value_arg)
  354. status = match_status;
  355. else if (call->type == name_arg)
  356. status = self_ass;
  357. switch (status) {
  358. case match_status: {
  359. result = argumentToParameter(&call, &function, function_var, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  360. returnResult(result);
  361. break;
  362. }
  363. case default_status: {
  364. int num = 0;
  365. result = defaultParameter(&function, CALL_INTER_FUNCTIONSIG_CORE(function_var), &num);
  366. returnResult(result);
  367. break;
  368. }
  369. case self_ass: {
  370. VarList *tmp = makeVarList(inter);
  371. NUMBER_TYPE set_num = 0, get_num = 0;
  372. result = argumentToVar(&call, CALL_INTER_FUNCTIONSIG_CORE(tmp), &set_num);
  373. returnResult(result);
  374. result = parameterFromVar(&function, function_var, CALL_INTER_FUNCTIONSIG_CORE(tmp), &get_num);
  375. returnResult(result);
  376. freeVarList(tmp, true);
  377. if (set_num > get_num)
  378. status = error;
  379. break;
  380. }
  381. case mul_par: {
  382. Value *value = makeListValue(&call, inter, value_tuple);
  383. LinkValue *tmp = makeLinkValue(value, NULL, inter);
  384. result = assCore(function->data.value, tmp, CALL_INTER_FUNCTIONSIG_CORE(function_var));
  385. returnResult(result);
  386. function = function->next;
  387. break;
  388. }
  389. case error:
  390. writeLog(inter->debug, ERROR, "setParameter error", NULL);
  391. setResultError(&result, inter);
  392. goto return_;
  393. default:
  394. goto break_;
  395. }
  396. }
  397. break_:
  398. setResult(&result, true ,inter);
  399. return_:
  400. freeParameter(tmp_function, false);
  401. return result;
  402. }