Files
luban-lite/packages/third-party/awtk-ui/awtk/src/fscript_ext/fscript_istream.c
刘可亮 3b4064f334 v1.0.2
2023-11-30 19:48:02 +08:00

312 lines
10 KiB
C

/**
* File: fscript_istream.c
* Author: AWTK Develop Team
* Brief: istream functions for fscript
*
* Copyright (c) 2020 - 2023 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
*/
/**
* History:
* ================================================================
* 2021-01-06 Li XianJing <lixianjing@zlg.cn> created
*
*/
#include "tkc/mem.h"
#include "tkc/buffer.h"
#include "tkc/fscript.h"
#include "tkc/istream.h"
static ret_t func_istream_seek(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t offset = 0;
tk_istream_t* istream = NULL;
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
offset = value_uint32(args->args + 1);
value_set_bool(result, tk_istream_seek(istream, offset) == RET_OK);
return RET_OK;
}
static ret_t func_istream_tell(fscript_t* fscript, fscript_args_t* args, value_t* result) {
tk_istream_t* istream = NULL;
FSCRIPT_FUNC_CHECK(args->size == 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
value_set_uint32(result, tk_istream_tell(istream));
return RET_OK;
}
static ret_t func_istream_is_eos(fscript_t* fscript, fscript_args_t* args, value_t* result) {
tk_istream_t* istream = NULL;
FSCRIPT_FUNC_CHECK(args->size == 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
value_set_bool(result, tk_istream_eos(istream));
return RET_OK;
}
static ret_t func_istream_read_uint8(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint8_t v = 0;
int32_t ret = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
timeout = args->size > 1 ? value_uint32(args->args + 1) : 0;
ret = tk_istream_read_len(istream, &v, sizeof(v), timeout);
if (ret == sizeof(v)) {
value_set_uint8(result, v);
}
return ret == sizeof(v) ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_uint16(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint16_t v = 0;
int32_t ret = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
timeout = args->size > 1 ? value_uint32(args->args + 1) : 0;
ret = tk_istream_read_len(istream, &v, sizeof(v), timeout);
if (ret == sizeof(v)) {
value_set_uint16(result, v);
}
return ret == sizeof(v) ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_uint32(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t v = 0;
int32_t ret = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
timeout = args->size > 1 ? value_uint32(args->args + 1) : 0;
ret = tk_istream_read_len(istream, &v, sizeof(v), timeout);
if (ret == sizeof(v)) {
value_set_uint32(result, v);
}
return ret == sizeof(v) ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_uint64(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint64_t v = 0;
int32_t ret = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
timeout = args->size > 1 ? value_uint32(args->args + 1) : 0;
ret = tk_istream_read_len(istream, &v, sizeof(v), timeout);
if (ret == sizeof(v)) {
value_set_uint64(result, v);
}
return ret == sizeof(v) ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_int8(fscript_t* fscript, fscript_args_t* args, value_t* result) {
ret_t ret = func_istream_read_uint8(fscript, args, result);
if (result->type != VALUE_TYPE_INVALID) {
result->type = VALUE_TYPE_INT8;
}
return ret;
}
static ret_t func_istream_read_int16(fscript_t* fscript, fscript_args_t* args, value_t* result) {
ret_t ret = func_istream_read_uint16(fscript, args, result);
if (result->type != VALUE_TYPE_INVALID) {
result->type = VALUE_TYPE_INT16;
}
return ret;
}
static ret_t func_istream_read_int32(fscript_t* fscript, fscript_args_t* args, value_t* result) {
ret_t ret = func_istream_read_uint32(fscript, args, result);
if (result->type != VALUE_TYPE_INVALID) {
result->type = VALUE_TYPE_INT32;
}
return ret;
}
static ret_t func_istream_read_int64(fscript_t* fscript, fscript_args_t* args, value_t* result) {
ret_t ret = func_istream_read_uint64(fscript, args, result);
if (result->type != VALUE_TYPE_INVALID) {
result->type = VALUE_TYPE_INT64;
}
return ret;
}
static ret_t func_istream_read_float(fscript_t* fscript, fscript_args_t* args, value_t* result) {
float v = 0;
int32_t ret = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
timeout = args->size > 1 ? value_uint32(args->args + 1) : 0;
ret = tk_istream_read_len(istream, &v, sizeof(v), timeout);
if (ret == sizeof(v)) {
value_set_float(result, v);
}
return ret == sizeof(v) ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_double(fscript_t* fscript, fscript_args_t* args, value_t* result) {
double v = 0;
int32_t ret = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
timeout = args->size > 1 ? value_uint32(args->args + 1) : 0;
ret = tk_istream_read_len(istream, &v, sizeof(v), timeout);
if (ret == sizeof(v)) {
value_set_double(result, v);
}
return ret == sizeof(v) ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_string(fscript_t* fscript, fscript_args_t* args, value_t* result) {
char* v = 0;
int32_t ret = 0;
uint32_t size = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
size = args->size > 1 ? value_uint32(args->args + 1) : 0;
timeout = args->size > 2 ? value_uint32(args->args + 2) : 0;
FSCRIPT_FUNC_CHECK(size > 0, RET_BAD_PARAMS);
v = TKMEM_ALLOC(size + 1);
FSCRIPT_FUNC_CHECK(v != NULL, RET_BAD_PARAMS);
ret = tk_istream_read_len(istream, v, size, timeout);
if (ret >= 0) {
v[ret] = '\0';
value_set_str(result, v);
result->free_handle = TRUE;
} else {
TKMEM_FREE(v);
}
return ret >= 0 ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_binary(fscript_t* fscript, fscript_args_t* args, value_t* result) {
char* v = 0;
int32_t ret = 0;
uint32_t size = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
size = args->size > 1 ? value_uint32(args->args + 1) : 0;
timeout = args->size > 2 ? value_uint32(args->args + 2) : 0;
FSCRIPT_FUNC_CHECK(size > 0, RET_BAD_PARAMS);
v = TKMEM_ALLOC(size + 1);
FSCRIPT_FUNC_CHECK(v != NULL, RET_BAD_PARAMS);
ret = tk_istream_read_len(istream, v, size, timeout);
if (ret >= 0) {
v[ret] = '\0';
value_set_binary_data(result, v, ret);
result->free_handle = TRUE;
} else {
TKMEM_FREE(v);
}
return ret >= 0 ? RET_OK : RET_FAIL;
}
static ret_t func_istream_read_line(fscript_t* fscript, fscript_args_t* args, value_t* result) {
char* v = 0;
int32_t ret = 0;
uint32_t size = 0;
uint32_t timeout = 0;
tk_istream_t* istream = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size >= 1, RET_BAD_PARAMS);
istream = TK_ISTREAM(value_object(args->args));
FSCRIPT_FUNC_CHECK(istream != NULL && istream != NULL, RET_BAD_PARAMS);
size = args->size > 1 ? value_uint32(args->args + 1) : 0;
timeout = args->size > 2 ? value_uint32(args->args + 2) : 0;
FSCRIPT_FUNC_CHECK(size > 0, RET_BAD_PARAMS);
v = TKMEM_ALLOC(size + 1);
FSCRIPT_FUNC_CHECK(v != NULL, RET_BAD_PARAMS);
ret = tk_istream_read_line(istream, v, size, timeout);
if (ret >= 0) {
v[ret] = '\0';
value_set_str(result, v);
result->free_handle = TRUE;
} else {
TKMEM_FREE(v);
}
return ret >= 0 ? RET_OK : RET_FAIL;
}
FACTORY_TABLE_BEGIN(s_ext_istream)
FACTORY_TABLE_ENTRY("istream_seek", func_istream_seek)
FACTORY_TABLE_ENTRY("istream_tell", func_istream_tell)
FACTORY_TABLE_ENTRY("istream_read_uint8", func_istream_read_uint8)
FACTORY_TABLE_ENTRY("istream_read_uint16", func_istream_read_uint16)
FACTORY_TABLE_ENTRY("istream_read_uint32", func_istream_read_uint32)
FACTORY_TABLE_ENTRY("istream_read_uint64", func_istream_read_uint64)
FACTORY_TABLE_ENTRY("istream_read_int8", func_istream_read_int8)
FACTORY_TABLE_ENTRY("istream_read_int16", func_istream_read_int16)
FACTORY_TABLE_ENTRY("istream_read_int32", func_istream_read_int32)
FACTORY_TABLE_ENTRY("istream_read_int64", func_istream_read_int64)
FACTORY_TABLE_ENTRY("istream_read_float", func_istream_read_float)
FACTORY_TABLE_ENTRY("istream_read_double", func_istream_read_double)
FACTORY_TABLE_ENTRY("istream_read_string", func_istream_read_string)
FACTORY_TABLE_ENTRY("istream_read_binary", func_istream_read_binary)
FACTORY_TABLE_ENTRY("istream_read_line", func_istream_read_line)
FACTORY_TABLE_ENTRY("istream_is_eos", func_istream_is_eos)
FACTORY_TABLE_END()
ret_t fscript_istream_register(void) {
return fscript_register_funcs(s_ext_istream);
}