__run.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "__run.h"
  2. Result getBaseVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  3. Result result;
  4. Result times_tmp;
  5. *name = setStrVarName(st->u.base_var.name, false, inter, var_list);
  6. *times = 0;
  7. if (st->u.base_var.times == NULL){
  8. *times = 0;
  9. goto not_times;
  10. }
  11. if (operationSafeInterStatement(&times_tmp, CALL_INTER_FUNCTIONSIG(st->u.base_var.times, var_list)))
  12. return times_tmp;
  13. *times = (int)times_tmp.value->value->data.num.num; // TODO-szh 类型检查
  14. not_times:
  15. setResultOperation(&result, inter);
  16. result.value->value = makeStringValue(st->u.base_var.name, inter);
  17. return result;
  18. }
  19. Result getBaseSVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  20. Result result;
  21. Result times_tmp;
  22. if (operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(st->u.base_svar.name, var_list)))
  23. return result;
  24. *name = getNameFromValue(result.value->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  25. if (st->u.base_svar.times == NULL){
  26. *times = 0;
  27. goto not_times;
  28. }
  29. if (operationSafeInterStatement(&times_tmp, CALL_INTER_FUNCTIONSIG(st->u.base_svar.times, var_list)))
  30. return times_tmp;
  31. *times = (int)times_tmp.value->value->data.num.num; // TODO-szh 类型检查
  32. not_times:
  33. result.type = operation_return;
  34. return result;
  35. }
  36. Result getVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  37. Result result;
  38. if (st->type == base_var)
  39. result = getBaseVarInfo(name, times, CALL_INTER_FUNCTIONSIG(st, var_list));
  40. else if (st->type == base_svar)
  41. result = getBaseSVarInfo(name, times, CALL_INTER_FUNCTIONSIG(st, var_list));
  42. else{
  43. if (operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(st, var_list)))
  44. return result;
  45. *name = getNameFromValue(result.value->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  46. *times = 0;
  47. }
  48. return result;
  49. }
  50. char *setStrVarName(char *old, bool free_old, INTER_FUNCTIONSIG_CORE) {
  51. char *name = memStrcat(inter->data.var_str_prefix, old);
  52. if (free_old)
  53. memFree(old);
  54. return name;
  55. }
  56. char *setNumVarName(NUMBER_TYPE num, INTER_FUNCTIONSIG_CORE) {
  57. char name[50];
  58. snprintf(name, 50, "%"NUMBER_FORMAT, num);
  59. return memStrcat(inter->data.var_num_prefix, name);
  60. }
  61. char *getNameFromValue(Value *value, INTER_FUNCTIONSIG_CORE) {
  62. switch (value->type){
  63. case string:
  64. return setStrVarName(value->data.str.str, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  65. case number:
  66. return setNumVarName(value->data.num.num, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  67. default:
  68. return memStrcpy(inter->data.var_defualt, 0, false, false);
  69. }
  70. }