Files
luban-lite/packages/third-party/awtk-ui/awtk/src/fscript_ext/fscript_bits.c

140 lines
3.8 KiB
C
Raw Normal View History

2023-11-09 20:19:51 +08:00
/**
* File: fscript_bits.c
* Author: AWTK Develop Team
* Brief: bits functions for fscript
*
* Copyright (c) 2020 - 2023 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
*/
/**
* History:
* ================================================================
* 2021-01-03 Li XianJing <lixianjing@zlg.cn> created
*
*/
#include "tkc/fscript.h"
typedef enum _func_type_t {
FUNC_LSHIFT = 1,
FUNC_RSHIFT = 2,
FUNC_BIT_CLEAR = 3,
} func_type_t;
static ret_t func_lshift(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t n = 0;
value_t* value = NULL;
ret_t ret = RET_OK;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
value = args->args;
n = value_uint32(args->args + 1);
ret = value_lshift(value, result, n);
return ret;
}
static ret_t func_rshift(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t n = 0;
value_t* value = NULL;
ret_t ret = RET_OK;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
value = args->args;
n = value_uint32(args->args + 1);
ret = value_rshift(value, result, n);
return ret;
}
static ret_t func_bit_set(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t n = 0;
value_t* value = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
value = args->args;
n = value_uint32(args->args + 1);
return value_set_bit(value, result, n, TRUE);
}
static ret_t func_bit_clear(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t n = 0;
value_t* value = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
value = args->args;
n = value_uint32(args->args + 1);
return value_set_bit(value, result, n, FALSE);
}
static ret_t func_bit_toggle(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t n = 0;
value_t* value = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
value = args->args;
n = value_uint32(args->args + 1);
return value_toggle_bit(value, result, n);
}
static ret_t func_bit_get(fscript_t* fscript, fscript_args_t* args, value_t* result) {
uint32_t n = 0;
value_t* value = NULL;
result->type = VALUE_TYPE_INVALID;
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
value = args->args;
n = value_uint32(args->args + 1);
return value_get_bit(value, result, n);
}
static ret_t func_bit_and(fscript_t* fscript, fscript_args_t* args, value_t* result) {
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
return value_bit_and(args->args, args->args + 1, result);
}
static ret_t func_bit_or(fscript_t* fscript, fscript_args_t* args, value_t* result) {
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
return value_bit_or(args->args, args->args + 1, result);
}
static ret_t func_bit_xor(fscript_t* fscript, fscript_args_t* args, value_t* result) {
FSCRIPT_FUNC_CHECK(args->size == 2, RET_BAD_PARAMS);
return value_bit_xor(args->args, args->args + 1, result);
}
static ret_t func_bit_not(fscript_t* fscript, fscript_args_t* args, value_t* result) {
FSCRIPT_FUNC_CHECK(args->size == 1, RET_BAD_PARAMS);
return value_bit_not(args->args, result);
}
FACTORY_TABLE_BEGIN(s_ext_bits)
FACTORY_TABLE_ENTRY("&", func_bit_and)
FACTORY_TABLE_ENTRY("^", func_bit_xor)
FACTORY_TABLE_ENTRY("~", func_bit_not)
FACTORY_TABLE_ENTRY("|", func_bit_or)
FACTORY_TABLE_ENTRY("<<", func_lshift)
FACTORY_TABLE_ENTRY(">>", func_rshift)
FACTORY_TABLE_ENTRY("bit_get", func_bit_get)
FACTORY_TABLE_ENTRY("bit_set", func_bit_set)
FACTORY_TABLE_ENTRY("bit_clear", func_bit_clear)
FACTORY_TABLE_ENTRY("bit_toggle", func_bit_toggle)
FACTORY_TABLE_END()
ret_t fscript_bits_register(void) {
return fscript_register_funcs(s_ext_bits);
}