pointer.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "__ofunc.h"
  2. ResultType pointer_new(O_FUNC){
  3. LinkValue *value = NULL;
  4. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  5. {.must=-1}};
  6. int status = 1;
  7. arg = parserValueArgument(ap, arg, &status, NULL);
  8. if (status != 1){
  9. setResultError(E_ArgumentException, FEW_ARG, LINEFILE, true, CNEXT_NT);
  10. return R_error;
  11. }
  12. setResultCore(result);
  13. value = make_new(inter, belong, ap[0].value);
  14. value->value->type = V_pointer;
  15. value->value->data.pointer.pointer = NULL;
  16. run_init(value, arg, LINEFILE, CNEXT_NT);
  17. return result->type;
  18. }
  19. ResultType pointer_init(O_FUNC){
  20. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  21. {.type=name_value, .name=L"p", .must=0, .long_arg=false},
  22. {.must=-1}};
  23. LinkValue *base = NULL;
  24. setResultCore(result);
  25. parserArgumentUnion(ap, arg, CNEXT_NT);
  26. if (!CHECK_RESULT(result))
  27. return result->type;
  28. freeResult(result);
  29. base = ap[0].value;
  30. if (ap[1].value == NULL)
  31. goto return_;
  32. switch (ap[1].value->value->type){
  33. case V_int:
  34. base->value->data.pointer.pointer = (void *)ap[1].value->value->data.int_.num;
  35. break;
  36. case V_none:
  37. case V_ell:
  38. base->value->data.pointer.pointer = NULL;
  39. break;
  40. default:
  41. setResultError(E_TypeException, ERROR_INIT(num), LINEFILE, true, CNEXT_NT);
  42. return result->type;
  43. }
  44. return_:
  45. setResultBase(result, inter);
  46. return result->type;
  47. }
  48. void registeredPointer(R_FUNC){
  49. LinkValue *object = inter->data.base_obj[B_POINTER];
  50. NameFunc tmp[] = {{inter->data.mag_func[M_NEW], pointer_new, class_free_},
  51. {inter->data.mag_func[M_INIT], pointer_init, object_free_},
  52. {NULL, NULL}};
  53. gc_addTmpLink(&object->gc_status);
  54. addBaseClassVar(L"pointer", object, belong, inter);
  55. iterBaseClassFunc(tmp, object, CFUNC_CORE(inter->var_list));
  56. gc_freeTmpLink(&object->gc_status);
  57. }
  58. void makeBasePointer(Inter *inter){
  59. LinkValue *pointer = makeBaseChildClass(inter->data.base_obj[B_VOBJECT], inter);
  60. gc_addStatementLink(&pointer->gc_status);
  61. inter->data.base_obj[B_POINTER] = pointer;
  62. }