__run.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. if (!isType(times_tmp.value->value, number)){
  14. setResultError(&result, inter, "TypeException", "Don't get a number value", st, true);
  15. goto return_;
  16. }
  17. *times = (int)times_tmp.value->value->data.num.num;
  18. not_times:
  19. setResultOperation(&result, inter);
  20. result.value->value = makeStringValue(st->u.base_var.name, inter);
  21. return_: return result;
  22. }
  23. Result getBaseSVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  24. Result result;
  25. Result times_tmp;
  26. if (operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(st->u.base_svar.name, var_list)))
  27. return result;
  28. *name = getNameFromValue(result.value->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  29. if (st->u.base_svar.times == NULL){
  30. *times = 0;
  31. goto not_times;
  32. }
  33. if (operationSafeInterStatement(&times_tmp, CALL_INTER_FUNCTIONSIG(st->u.base_svar.times, var_list)))
  34. return times_tmp;
  35. if (!isType(times_tmp.value->value, number)){
  36. setResultError(&result, inter, "TypeException", "Don't get a number value", st, true);
  37. goto return_;
  38. }
  39. *times = (int)times_tmp.value->value->data.num.num;
  40. not_times:
  41. result.type = operation_return;
  42. return_: return result;
  43. }
  44. Result getVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  45. Result result;
  46. if (st->type == base_var)
  47. result = getBaseVarInfo(name, times, CALL_INTER_FUNCTIONSIG(st, var_list));
  48. else if (st->type == base_svar)
  49. result = getBaseSVarInfo(name, times, CALL_INTER_FUNCTIONSIG(st, var_list));
  50. else{
  51. if (operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(st, var_list)))
  52. return result;
  53. *name = getNameFromValue(result.value->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  54. *times = 0;
  55. }
  56. return result;
  57. }
  58. char *setStrVarName(char *old, bool free_old, INTER_FUNCTIONSIG_CORE) {
  59. char *name = memStrcat(inter->data.var_str_prefix, old, false);
  60. if (free_old)
  61. memFree(old);
  62. return name;
  63. }
  64. char *setNumVarName(NUMBER_TYPE num, INTER_FUNCTIONSIG_CORE) {
  65. char name[50];
  66. snprintf(name, 50, "%"NUMBER_FORMAT, num);
  67. return memStrcat(inter->data.var_num_prefix, name, false);
  68. }
  69. char *getNameFromValue(Value *value, INTER_FUNCTIONSIG_CORE) {
  70. switch (value->type){
  71. case string:
  72. return setStrVarName(value->data.str.str, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  73. case number:
  74. return setNumVarName(value->data.num.num, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  75. default:
  76. return memStrcpy(inter->data.var_defualt, 0, false, false);
  77. }
  78. }