#include "PikaStdData_List.h" #include "BaseObj.h" #include "PikaObj.h" #include "PikaStdData_Tuple.h" #include "dataStrs.h" void PikaStdData_List_append(PikaObj* self, Arg* arg) { __vm_List_append(self, arg); } void PikaStdData_List_set(PikaObj* self, int i, Arg* arg) { PikaList* list = obj_getPtr(self, "list"); if (PIKA_RES_OK != pikaList_setArg(list, i, arg)) { obj_setErrorCode(self, 1); obj_setSysOut(self, "Error: index exceeded lengh of list."); } } void PikaStdData_List___setitem__(PikaObj* self, Arg* __key, Arg* __val) { PikaStdData_List_set(self, obj_getInt(self, "__key"), obj_getArg(self, "__val")); } void PikaStdData_List___init__(PikaObj* self) { __vm_List___init__(self); } char* builtins_str(PikaObj* self, Arg* arg); char* PikaStdData_List___str__(PikaObj* self) { Arg* str_arg = arg_newStr("["); PikaList* list = obj_getPtr(self, "list"); int i = 0; while (PIKA_TRUE) { Arg* item = pikaList_getArg(list, i); if (NULL == item) { break; } if (i != 0) { str_arg = arg_strAppend(str_arg, ", "); } char* item_str = builtins_str(self, item); if (arg_getType(item) == ARG_TYPE_STRING) { str_arg = arg_strAppend(str_arg, "'"); } str_arg = arg_strAppend(str_arg, item_str); if (arg_getType(item) == ARG_TYPE_STRING) { str_arg = arg_strAppend(str_arg, "'"); } i++; } str_arg = arg_strAppend(str_arg, "]"); obj_setStr(self, "_buf", arg_getStr(str_arg)); arg_deinit(str_arg); return obj_getStr(self, "_buf"); } void PikaStdData_List_reverse(PikaObj* self) { PikaList* list = obj_getPtr(self, "list"); pikaList_reverse(list); } PikaObj* PikaStdData_List___add__(PikaObj* self, PikaObj* others) { PikaObj* res = newNormalObj(New_PikaStdData_List); PikaStdData_List___init__(res); PikaList* list_res = obj_getPtr(res, "list"); PikaList* list1 = obj_getPtr(self, "list"); PikaList* list2 = obj_getPtr(others, "list"); for (size_t i = 0; i < pikaList_getSize(list1); i++) { Arg* arg = pikaList_getArg(list1, i); pikaList_append(list_res, arg); } for (size_t i = 0; i < pikaList_getSize(list2); i++) { Arg* arg = pikaList_getArg(list2, i); pikaList_append(list_res, arg); } return res; } void PikaStdData_List_insert(PikaObj* self, int i, Arg* arg) { PikaList* list = obj_getPtr(self, "list"); if (PIKA_RES_OK != pikaList_insert(list, i, arg)) { obj_setErrorCode(self, 1); obj_setSysOut(self, "Error: index exceeded lengh of list."); } } Arg* PikaStdData_List_pop(PikaObj* self, PikaTuple* index) { int i = 0; PikaList* list = obj_getPtr(self, "list"); if (pikaTuple_getSize(index) == 1) { if (pikaTuple_getType(index, 0) == ARG_TYPE_INT) { i = pikaTuple_getInt(index, 0); } else { obj_setErrorCode(self, 1); obj_setSysOut(self, "Error: index must be int."); return NULL; } return pikaList_pop_withIndex(list, i); } else { return pikaList_pop(list); } } void PikaStdData_List_remove(PikaObj* self, Arg* val) { PikaList* list = obj_getPtr(self, "list"); pikaList_remove(list, val); }