PikaStdData_List.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "PikaStdData_List.h"
  2. #include "BaseObj.h"
  3. #include "PikaObj.h"
  4. #include "PikaStdData_Tuple.h"
  5. #include "dataStrs.h"
  6. void PikaStdData_List_append(PikaObj* self, Arg* arg) {
  7. pikaList_append(self, arg_copy(arg));
  8. }
  9. void PikaStdData_List_set(PikaObj* self, int i, Arg* arg) {
  10. pikaList_set(self, i, arg_copy(arg));
  11. }
  12. void PikaStdData_List___setitem__(PikaObj* self, Arg* __key, Arg* __val) {
  13. PikaStdData_List_set(self, obj_getInt(self, "__key"),
  14. obj_getArg(self, "__val"));
  15. }
  16. void PikaStdData_List___init__(PikaObj* self) {
  17. pikaList_init(self);
  18. }
  19. char* builtins_str(PikaObj* self, Arg* arg);
  20. typedef struct {
  21. Arg* buf;
  22. int count;
  23. } ListToStrContext;
  24. int32_t listToStrEachHandle(PikaObj* self,
  25. int itemIndex,
  26. Arg* itemEach,
  27. void* context) {
  28. ListToStrContext* ctx = (ListToStrContext*)context;
  29. char* item_str = builtins_str(self, itemEach);
  30. if (ctx->count != 0) {
  31. ctx->buf = arg_strAppend(ctx->buf, ", ");
  32. }
  33. if (arg_getType(itemEach) == ARG_TYPE_STRING) {
  34. ctx->buf = arg_strAppend(ctx->buf, "'");
  35. }
  36. ctx->buf = arg_strAppend(ctx->buf, item_str);
  37. if (arg_getType(itemEach) == ARG_TYPE_STRING) {
  38. ctx->buf = arg_strAppend(ctx->buf, "'");
  39. }
  40. ctx->count++;
  41. return 0;
  42. }
  43. char* PikaStdData_List___str__(PikaObj* self) {
  44. ListToStrContext context;
  45. context.buf = arg_newStr("[");
  46. context.count = 0;
  47. pikaList_forEach(self, listToStrEachHandle, &context);
  48. context.buf = arg_strAppend(context.buf, "]");
  49. obj_setStr(self, "_buf", arg_getStr(context.buf));
  50. arg_deinit(context.buf);
  51. return obj_getStr(self, "_buf");
  52. }
  53. void PikaStdData_List_reverse(PikaObj* self) {
  54. pikaList_reverse(self);
  55. }
  56. PikaObj* PikaStdData_List___add__(PikaObj* self, PikaObj* others) {
  57. PikaObj* res = New_PikaList();
  58. for (size_t i = 0; i < pikaList_getSize(self); i++) {
  59. Arg* arg = pikaList_get(self, i);
  60. pikaList_append(res, arg_copy(arg));
  61. }
  62. for (size_t i = 0; i < pikaList_getSize(others); i++) {
  63. Arg* arg = pikaList_get(others, i);
  64. pikaList_append(res, arg_copy(arg));
  65. }
  66. return res;
  67. }
  68. void PikaStdData_List_insert(PikaObj* self, int i, Arg* arg) {
  69. if (PIKA_RES_OK != pikaList_insert(self, i, arg)) {
  70. obj_setErrorCode(self, 1);
  71. obj_setSysOut(self, "Error: index exceeded lengh of list.");
  72. }
  73. }
  74. Arg* PikaStdData_List_pop(PikaObj* self, PikaTuple* index) {
  75. int i = 0;
  76. if (pikaTuple_getSize(index) == 1) {
  77. if (pikaTuple_getType(index, 0) == ARG_TYPE_INT) {
  78. i = pikaTuple_getInt(index, 0);
  79. } else {
  80. obj_setErrorCode(self, 1);
  81. obj_setSysOut(self, "Error: index must be int.");
  82. return NULL;
  83. }
  84. return pikaList_pop_withIndex(self, i);
  85. } else {
  86. return pikaList_pop(self);
  87. }
  88. }
  89. void PikaStdData_List_remove(PikaObj* self, Arg* val) {
  90. pikaList_remove(self, val);
  91. }
  92. PikaObj* PikaStdData_List___mul__(PikaObj* self, int n) {
  93. PikaObj* res = New_PikaList();
  94. for (int i = 0; i < n; i++) {
  95. for (size_t j = 0; j < pikaList_getSize(self); j++) {
  96. Arg* arg = pikaList_get(self, j);
  97. pikaList_append(res, arg_copy(arg));
  98. }
  99. }
  100. return res;
  101. }