parameter.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #ifndef VIRTUALMATH_PARAMETER_H
  2. #define VIRTUALMATH_PARAMETER_H
  3. #include "__macro.h"
  4. #include "inter.h"
  5. struct Parameter{
  6. enum ParameterType{
  7. value_par,
  8. name_par,
  9. args_par,
  10. kwargs_par,
  11. } type;
  12. struct ParameterData{
  13. struct Statement *value;
  14. struct Statement *name; // 仅在name-value模式生效
  15. bool is_sep; // 是否为分割符
  16. } data;
  17. struct Parameter *next;
  18. };
  19. struct Argument{
  20. enum ArgumentType{
  21. value_arg,
  22. name_arg,
  23. } type;
  24. enum ArgumentNameType{
  25. name_st,
  26. name_char,
  27. } name_type;
  28. struct ArgumentData{
  29. struct LinkValue *value;
  30. struct Statement *name; // 仅在name-value模式生效
  31. wchar_t *name_;
  32. struct LinkValue *name_value;
  33. } data;
  34. struct Argument *next;
  35. };
  36. struct ArgumentParser{
  37. struct LinkValue *value;
  38. struct Argument *arg;
  39. wchar_t *name;
  40. enum ArgumentParserType{
  41. only_value,
  42. name_value,
  43. only_name,
  44. } type;
  45. int must;
  46. bool long_arg;
  47. int c_count;
  48. };
  49. // 该结构体为数组形式, 因此不需要make函数(即不存在于堆中)
  50. // 但其成员arg等为不确定长度的数组,因此需要memCalloc申请内存, 并且释放
  51. struct ArgumentFFI {
  52. ffi_type **arg; // arg的类型
  53. void **arg_v; // arg的真实数值
  54. enum ArgumentFFIType{
  55. af_usint,
  56. af_sint,
  57. af_uint,
  58. af_int,
  59. af_ulint,
  60. af_lint,
  61. af_float,
  62. af_double,
  63. af_ldouble,
  64. af_str,
  65. af_wstr,
  66. af_uchar,
  67. af_char,
  68. af_void,
  69. af_pointer,
  70. } *type; // 数据类型 (决定如何释放arg_v)
  71. unsigned int size; // 数组长度
  72. unsigned int b_va; // 非可变参数的个数
  73. };
  74. typedef struct Parameter Parameter;
  75. typedef struct Argument Argument;
  76. typedef struct ArgumentParser ArgumentParser;
  77. typedef struct ArgumentFFI ArgumentFFI;
  78. Argument *makeArgument(void);
  79. Argument *makeValueArgument(LinkValue *value);
  80. Argument *makeStatementNameArgument(LinkValue *value, struct Statement *name);
  81. Argument *makeCharNameArgument(LinkValue *value, LinkValue *name_value, wchar_t *name);
  82. Argument *connectArgument(Argument *new, Argument *base);
  83. Argument *connectValueArgument(LinkValue *value, Argument *base);
  84. Argument *connectStatementNameArgument(LinkValue *value, struct Statement *name, Argument *base);
  85. Argument *connectCharNameArgument(LinkValue *value, LinkValue *name_value, wchar_t *name, Argument *base);
  86. void freeArgument(Argument *at, bool free_st);
  87. Parameter *makeParameter(void);
  88. Parameter *copyParameter(Parameter *base);
  89. Parameter *makeValueParameter(struct Statement *st);
  90. Parameter *makeNameParameter(struct Statement *value, struct Statement *name);
  91. Parameter *makeArgsParameter(struct Statement *st);
  92. Parameter *makeKwrgsParameter(struct Statement *st);
  93. Parameter *connectParameter(Parameter *new, Parameter *base);
  94. Parameter *connectValueParameter(Statement *st, Parameter *base, bool is_sep);
  95. Parameter *connectNameParameter(struct Statement *value, struct Statement *name, Parameter *base);
  96. Parameter *connectArgsParameter(Statement *st, Parameter *base, bool is_sep);
  97. Parameter *connectKwargsParameter(struct Statement *st, Parameter *base);
  98. void freeParameter(Parameter *pt, bool free_st);
  99. Argument *listToArgument(LinkValue *list_value, long line, char *file, FUNC_NT);
  100. Argument *dictToArgument(LinkValue *dict_value, long line, char *file, FUNC_NT);
  101. ResultType setParameterCore(fline line, char *file, Argument *call, Parameter *function_base, VarList *function_var, FUNC_NT);
  102. ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, FUNC_NT);
  103. Argument *getArgument(Parameter *call, bool is_dict, FUNC_NT);
  104. ResultType defaultParameter(Parameter **function_ad, vint *num, FUNC_NT);
  105. ResultType argumentToVar(Argument **call_ad, vint *num, FUNC_NT);
  106. ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, vint *num, vint max, bool *status,
  107. FUNC_NT);
  108. ResultType argumentToParameter(Argument **call_ad, Parameter **function_ad, VarList *function_var, FUNC_NT);
  109. Inherit *setFatherCore(Inherit *father_tmp);
  110. Inherit *setFather(Argument *call);
  111. bool checkFormal(Parameter *pt);
  112. Argument *parserValueArgument(ArgumentParser *ap, Argument *arg, int *status, ArgumentParser **bak);
  113. int parserNameArgument(ArgumentParser ap[], Argument *arg, ArgumentParser **bak, FUNC_NT);
  114. int parserArgumentUnion(ArgumentParser ap[], Argument *arg, FUNC_NT);
  115. Argument *parserArgumentValueCore(Argument *arg, ArgumentParser *ap);
  116. ArgumentParser *parserArgumentNameDefault(ArgumentParser *ap);
  117. ArgumentParser *parserArgumentValueDefault(ArgumentParser *ap);
  118. int parserArgumentVar(ArgumentParser *ap, Inter *inter, VarList *var_list);
  119. void setArgumentFFICore(ArgumentFFI *af);
  120. void setArgumentFFI(ArgumentFFI *af, unsigned int size);
  121. void freeArgumentFFI(ArgumentFFI *af);
  122. unsigned int checkArgument(Argument *arg, enum ArgumentType type);
  123. bool listToArgumentFFI(ArgumentFFI *af, LinkValue **list, vint size, LinkValue **valist, vint vasize);
  124. bool setArgumentToFFI(ArgumentFFI *af, Argument *arg);
  125. ffi_type *getFFIType(wchar_t *str, enum ArgumentFFIType *aft);
  126. ffi_type *getFFITypeUp(wchar_t *str, enum ArgumentFFIType *aft);
  127. #endif //VIRTUALMATH_PARAMETER_H