pikapython/package/PikaStdLib/PikaStdLib_SysObj.c

252 lines
8.0 KiB
C
Raw Normal View History

2021-10-01 20:00:15 +08:00
#include "BaseObj.h"
2021-12-28 01:21:47 +08:00
#include "PikaStdLib_RangeObj.h"
2022-01-09 23:49:23 +08:00
#include "PikaStdLib_StringObj.h"
2021-10-01 20:00:15 +08:00
#include "dataStrs.h"
void PikaStdLib_SysObj_remove(PikaObj* self, char* argPath) {
obj_setErrorCode(self, 0);
int32_t res = obj_removeArg(self, argPath);
if (1 == res) {
obj_setSysOut(self, "[error] del: object no found.");
obj_setErrorCode(self, 1);
return;
}
if (2 == res) {
obj_setSysOut(self, "[error] del: arg not match.");
obj_setErrorCode(self, 2);
return;
}
}
void PikaStdLib_SysObj_type(PikaObj* self, Arg* arg) {
2021-10-01 20:00:15 +08:00
if (NULL == arg) {
obj_setSysOut(self, "[error] type: arg no found.");
obj_setErrorCode(self, 1);
return;
}
2021-11-15 09:58:54 +08:00
ArgType type = arg_getType(arg);
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_INT == type) {
2022-04-27 23:38:00 +08:00
obj_setSysOut(self, "<class 'int'>");
2021-11-15 09:58:54 +08:00
return;
}
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_FLOAT == type) {
2022-04-27 23:38:00 +08:00
obj_setSysOut(self, "<class 'float'>");
2021-11-15 09:58:54 +08:00
return;
}
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_STRING == type) {
2022-04-27 23:38:00 +08:00
obj_setSysOut(self, "<class 'str'>");
2021-11-15 09:58:54 +08:00
return;
}
2022-04-26 10:43:50 +08:00
if (ARG_TYPE_OBJECT == type) {
2022-04-27 23:38:00 +08:00
obj_setSysOut(self, "<class 'object'>");
2021-11-15 09:58:54 +08:00
return;
}
if (ARG_TYPE_OBJECT_META == type) {
obj_setSysOut(self, "<class 'meta object'>");
2021-11-15 09:58:54 +08:00
return;
}
if (ARG_TYPE_BYTES == type) {
obj_setSysOut(self, "<class 'bytes'>");
return;
}
2022-04-27 23:38:00 +08:00
if (ARG_TYPE_METHOD_NATIVE == type) {
obj_setSysOut(self, "<class 'buitin_function_or_method'>");
return;
}
2022-04-28 00:29:32 +08:00
if (ARG_TYPE_METHOD_OBJECT == type) {
2022-04-27 23:38:00 +08:00
obj_setSysOut(self, "<class 'method'>");
return;
}
2022-04-28 00:29:32 +08:00
if (ARG_TYPE_METHOD_STATIC == type) {
2022-04-27 23:38:00 +08:00
obj_setSysOut(self, "<class 'function'>");
2021-11-15 09:58:54 +08:00
return;
}
2021-10-01 20:00:15 +08:00
}
float PikaStdLib_SysObj_float(PikaObj* self, Arg* arg) {
ArgType type = arg_getType(arg);
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_INT == type) {
return (float)arg_getInt(arg);
}
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_FLOAT == type) {
return (float)arg_getFloat(arg);
}
obj_setSysOut(self, "[error] convert to float type faild.");
obj_setErrorCode(self, 1);
return -99999.99999;
}
int PikaStdLib_SysObj_int(PikaObj* self, Arg* arg) {
ArgType type = arg_getType(arg);
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_INT == type) {
return (int)arg_getInt(arg);
}
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_FLOAT == type) {
return (int)arg_getFloat(arg);
}
if (ARG_TYPE_STRING == type) {
return (int)fast_atoi(arg_getStr(arg));
}
obj_setSysOut(self, "[error] convert to int type faild.");
obj_setErrorCode(self, 1);
return -999999999;
2021-12-28 01:21:47 +08:00
}
2022-01-09 00:13:02 +08:00
char* PikaStdLib_SysObj_str(PikaObj* self, Arg* arg) {
ArgType type = arg_getType(arg);
2022-03-19 09:44:53 +08:00
Args buffs = {0};
2022-01-09 00:13:02 +08:00
char* res = NULL;
do {
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_INT == type) {
2022-01-09 00:13:02 +08:00
int val = arg_getInt(arg);
2022-03-17 16:47:03 +08:00
res = strsFormat(&buffs, 11, "%d", val);
2022-01-09 00:13:02 +08:00
break;
}
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_FLOAT == type) {
2022-01-09 00:13:02 +08:00
float val = arg_getFloat(arg);
2022-03-17 16:47:03 +08:00
res = strsFormat(&buffs, 11, "%f", val);
2022-01-09 00:13:02 +08:00
break;
}
} while (0);
obj_setStr(self, "__strtmp", res);
2022-03-17 16:47:03 +08:00
strsDeinit(&buffs);
2022-01-09 00:13:02 +08:00
return obj_getStr(self, "__strtmp");
}
2021-12-28 01:21:47 +08:00
Arg* PikaStdLib_SysObj_iter(PikaObj* self, Arg* arg) {
2022-01-09 23:49:23 +08:00
/* a String, return a StringObj */
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_STRING == arg_getType(arg)) {
2022-01-09 23:49:23 +08:00
obj_setStr(self, "_sobj", arg_getStr(arg));
2022-04-28 00:29:32 +08:00
return arg_newMetaObj(New_PikaStdLib_StringObj);
2022-01-09 23:49:23 +08:00
}
/* a MATE object, return itself */
if (ARG_TYPE_OBJECT_META == arg_getType(arg)) {
2021-12-28 01:21:47 +08:00
return arg_copy(arg);
}
/* object */
2022-04-26 10:43:50 +08:00
if (ARG_TYPE_OBJECT == arg_getType(arg)) {
2021-12-28 01:21:47 +08:00
PikaObj* arg_obj = arg_getPtr(arg);
2022-03-19 09:44:53 +08:00
// pikaVM_runAsm(arg_obj,
// "B0\n"
// "0 RUN __iter__\n"
// "0 OUT __res\n");
const uint8_t bytes[] = {
0x08, 0x00, /* instruct array size */
0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x0a, 0x00, /* instruct array */
0x10, 0x00, /* const pool size */
0x00, 0x5f, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x5f,
0x5f, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, /* const pool */
};
pikaVM_runByteCode(arg_obj, (uint8_t*)bytes);
2022-04-26 10:12:34 +08:00
Arg* res = arg_copy(args_getArg(arg_obj->list, "__res"));
obj_removeArg(arg_obj, "__res");
return res;
2021-12-28 01:21:47 +08:00
}
return arg_setNull(NULL);
}
2022-03-30 01:22:25 +08:00
Arg* PikaStdLib_SysObj_range(PikaObj* self, int a1, int a2) {
2021-12-28 01:21:47 +08:00
/* set template arg to create rangeObj */
2021-12-29 01:15:05 +08:00
obj_setInt(self, "_r1", a1);
obj_setInt(self, "_r2", a2);
2022-04-28 00:29:32 +08:00
return arg_newMetaObj(New_PikaStdLib_RangeObj);
2021-12-28 01:21:47 +08:00
}
2022-01-13 21:57:32 +08:00
Arg* PikaStdLib_SysObj___get__(PikaObj* self, Arg* key, Arg* obj) {
ArgType obj_type = arg_getType(obj);
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_STRING == obj_type) {
2022-01-18 23:52:20 +08:00
int index = arg_getInt(key);
char* str_pyload = arg_getStr(obj);
char char_buff[] = " ";
char_buff[0] = str_pyload[index];
return arg_setStr(NULL, "", char_buff);
}
2022-04-26 11:09:18 +08:00
if (ARG_TYPE_OBJECT == obj_type) {
2022-01-13 21:57:32 +08:00
PikaObj* arg_obj = arg_getPtr(obj);
obj_setArg(arg_obj, "__key", key);
2022-03-19 09:44:53 +08:00
// pikaVM_runAsm(arg_obj,
// "B0\n"
// "1 REF __key\n"
// "0 RUN __get__\n"
// "0 OUT __res\n");
const uint8_t bytes[] = {
0x0c, 0x00, /* instruct array size */
0x10, 0x81, 0x01, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x04, 0x0f,
0x00,
/* instruct array */
0x15, 0x00, /* const pool size */
0x00, 0x5f, 0x5f, 0x6b, 0x65, 0x79, 0x00, 0x5f, 0x5f, 0x67, 0x65,
0x74, 0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x73,
0x00, /* const pool */
};
pikaVM_runByteCode(arg_obj, (uint8_t*)bytes);
2022-01-13 21:57:32 +08:00
return arg_copy(args_getArg(arg_obj->list, "__res"));
}
return arg_setNull(NULL);
}
2022-01-18 23:52:20 +08:00
void PikaStdLib_SysObj___set__(PikaObj* self,
Arg* key,
Arg* obj,
char* obj_str,
Arg* val) {
2022-01-13 21:57:32 +08:00
ArgType obj_type = arg_getType(obj);
2022-03-02 15:27:19 +08:00
if (ARG_TYPE_STRING == obj_type) {
2022-01-18 23:52:20 +08:00
int index = arg_getInt(key);
char* str_val = arg_getStr(val);
char* str_pyload = arg_getStr(obj);
str_pyload[index] = str_val[0];
obj_setStr(self, obj_str, str_pyload);
}
2022-04-26 11:09:18 +08:00
if (ARG_TYPE_OBJECT == obj_type) {
2022-01-13 21:57:32 +08:00
PikaObj* arg_obj = arg_getPtr(obj);
obj_setArg(arg_obj, "__key", key);
obj_setArg(arg_obj, "__val", val);
2022-03-19 09:44:53 +08:00
// pikaVM_runAsm(arg_obj,
// "B0\n"
// "1 REF __key\n"
// "1 REF __val\n"
// "0 RUN __set__\n");
const uint8_t bytes[] = {
0x0c, 0x00, /* instruct array size */
0x10, 0x81, 0x01, 0x00, 0x10, 0x01, 0x07, 0x00, 0x00, 0x02, 0x0d,
0x00,
/* instruct array */
0x15, 0x00, /* const pool size */
0x00, 0x5f, 0x5f, 0x6b, 0x65, 0x79, 0x00, 0x5f, 0x5f, 0x76, 0x61,
0x6c, 0x00, 0x5f, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x5f,
0x00, /* const pool */
};
pikaVM_runByteCode(arg_obj, (uint8_t*)bytes);
2022-01-13 21:57:32 +08:00
}
}
int PikaStdLib_SysObj_len(PikaObj* self, Arg* arg) {
if (ARG_TYPE_STRING == arg_getType(arg)) {
return strGetSize(arg_getStr(arg));
}
obj_setErrorCode(self, 1);
__platform_printf("[Error] len: arg type not support\r\n");
return -1;
}
2022-04-13 13:23:45 +08:00
2022-04-25 15:01:58 +08:00
Arg* PikaStdLib_SysObj_list(PikaObj* self) {
#if PIKA_BUILTIN_LIST_ENABLE
2022-04-25 15:01:58 +08:00
PikaObj* New_PikaStdData_List(Args * args);
2022-04-13 13:23:45 +08:00
return obj_newObjInPackage(New_PikaStdData_List);
2022-04-14 15:58:24 +08:00
#endif
obj_setErrorCode(self, 1);
2022-04-14 16:12:18 +08:00
__platform_printf("[Error] built-in list is not enabled.\r\n");
return arg_setNull(NULL);
}
2022-04-25 15:01:58 +08:00
Arg* PikaStdLib_SysObj_dict(PikaObj* self) {
#if PIKA_BUILTIN_DICT_ENABLE
2022-04-25 15:01:58 +08:00
PikaObj* New_PikaStdData_Dict(Args * args);
2022-04-14 16:12:18 +08:00
return obj_newObjInPackage(New_PikaStdData_Dict);
#endif
obj_setErrorCode(self, 1);
__platform_printf("[Error] built-in dist is not enabled.\r\n");
2022-04-14 15:58:24 +08:00
return arg_setNull(NULL);
2022-04-13 13:23:45 +08:00
}