Files
TransPyC/includes/json/__init__.py
2026-07-18 19:25:40 +08:00

238 lines
7.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import t, c
from stdint import *
import memhub
import string
import viperio
# ============================================================
# JSON 值类型枚举
# ============================================================
JSON_NULL: t.CDefine = 0
JSON_BOOL: t.CDefine = 1
JSON_INT: t.CDefine = 2
JSON_FLOAT: t.CDefine = 3
JSON_STRING: t.CDefine = 4
JSON_ARRAY: t.CDefine = 5
JSON_OBJECT: t.CDefine = 6
# ============================================================
# JsonValue - JSON 值节点
# 使用 mpool 分配JsonValue(pool) 从池中分配内存
# ============================================================
class JsonValue:
vtype: t.CInt
bool_val: t.CInt
int_val: t.CInt64T
float_val: t.CDouble
str_val: t.CChar | t.CPtr
next: 'JsonValue' | t.CPtr
key: t.CChar | t.CPtr
child: 'JsonValue' | t.CPtr
child_count: t.CSizeT
def __new__(self, pool: memhub.MemManager | t.CPtr):
"""从 mpool 分配 JsonValue 结构体内存并零初始化"""
ptr: JsonValue | t.CPtr = pool.alloc(JsonValue.__sizeof__())
if ptr:
string.memset(ptr, 0, JsonValue.__sizeof__())
return ptr
def type(self) -> t.CInt:
return self.vtype
def is_null(self) -> bool:
return self.vtype == JSON_NULL
def is_bool(self) -> bool:
return self.vtype == JSON_BOOL
def is_int(self) -> bool:
return self.vtype == JSON_INT
def is_float(self) -> bool:
return self.vtype == JSON_FLOAT
def is_string(self) -> bool:
return self.vtype == JSON_STRING
def is_array(self) -> bool:
return self.vtype == JSON_ARRAY
def is_object(self) -> bool:
return self.vtype == JSON_OBJECT
def as_bool(self) -> bool:
return self.bool_val != 0
def as_int(self) -> t.CInt64T:
return self.int_val
def as_float(self) -> t.CDouble:
return self.float_val
def as_string(self) -> t.CChar | t.CPtr:
return self.str_val
def __len__(self) -> t.CSizeT:
return self.child_count
def __getitem__(self, key: t.CChar | t.CPtr) -> 'JsonValue' | t.CPtr:
"""Python风格取值v["key"] 取对象字段"""
if self.vtype != JSON_OBJECT:
return None
if key == None:
return None
cur: JsonValue | t.CPtr = self.child
while cur != None:
if cur.key != None:
if cur.key == key:
return cur
cur = cur.next
return None
def __setitem__(self, key: t.CChar | t.CPtr, val: 'JsonValue' | t.CPtr):
"""Python风格赋值v["key"] = val"""
if self.vtype != JSON_OBJECT or key == None or val == None:
return
cur: JsonValue | t.CPtr = self.child
while cur != None:
if cur.key != None:
if cur.key == key:
cur.vtype = val.vtype
cur.bool_val = val.bool_val
cur.int_val = val.int_val
cur.float_val = val.float_val
cur.str_val = val.str_val
cur.child = val.child
cur.child_count = val.child_count
return
cur = cur.next
# key 不存在,追加新子节点
klen: t.CSizeT = string.strlen(key)
kbuf: t.CChar | t.CPtr = self._pool_alloc(klen + 1)
if kbuf != None:
string.memcpy(kbuf, key, klen + 1)
val.key = kbuf
self._append_child(val)
def get_item(self, index: t.CSizeT) -> 'JsonValue' | t.CPtr:
"""按索引取数组元素v.get_item(0)"""
if self.vtype != JSON_ARRAY and self.vtype != JSON_OBJECT:
return None
cur: JsonValue | t.CPtr = self.child
i: t.CSizeT = 0
while cur != None:
if i == index:
return cur
cur = cur.next
i += 1
return None
def _pool_alloc(self, size: t.CSizeT) -> t.CChar | t.CPtr:
"""内部方法:从当前对象的 mpool 分配内存(预留,暂返回 None"""
return None
def _append_child(self, child: 'JsonValue' | t.CPtr):
if self.child == None:
self.child = child
else:
cur: JsonValue | t.CPtr = self.child
while cur.next != None:
cur = cur.next
cur.next = child
self.child_count += 1
# ============================================================
# 构造函数:创建各类 JsonValue从 mpool 分配)
# ============================================================
def null(pool: memhub.MemManager | t.CPtr) -> JsonValue | t.CPtr:
v: JsonValue | t.CPtr = JsonValue(pool)
if v == None: return None
v.vtype = JSON_NULL
return v
def bool_val(pool: memhub.MemManager | t.CPtr, val: bool) -> JsonValue | t.CPtr:
v: JsonValue | t.CPtr = JsonValue(pool)
if v == None: return None
v.vtype = JSON_BOOL
v.bool_val = 1 if val else 0
return v
def int_val(pool: memhub.MemManager | t.CPtr, val: t.CInt64T) -> JsonValue | t.CPtr:
v: JsonValue | t.CPtr = JsonValue(pool)
if v == None: return None
v.vtype = JSON_INT
v.int_val = val
return v
def float_val(pool: memhub.MemManager | t.CPtr, val: t.CDouble) -> JsonValue | t.CPtr:
v: JsonValue | t.CPtr = JsonValue(pool)
if v == None: return None
v.vtype = JSON_FLOAT
v.float_val = val
return v
def string_val(pool: memhub.MemManager | t.CPtr, val: t.CChar | t.CPtr) -> JsonValue | t.CPtr:
v: JsonValue | t.CPtr = JsonValue(pool)
if v == None: return None
v.vtype = JSON_STRING
if val != None:
slen: t.CSizeT = string.strlen(val)
buf: t.CChar | t.CPtr = pool.alloc(slen + 1)
if buf != None:
string.memcpy(buf, val, slen + 1)
v.str_val = buf
return v
def array(pool: memhub.MemManager | t.CPtr) -> JsonValue | t.CPtr:
v: JsonValue | t.CPtr = JsonValue(pool)
if v == None: return None
v.vtype = JSON_ARRAY
return v
def object(pool: memhub.MemManager | t.CPtr) -> JsonValue | t.CPtr:
v: JsonValue | t.CPtr = JsonValue(pool)
if v == None: return None
v.vtype = JSON_OBJECT
return v
# 向数组追加元素
def array_append(pool: memhub.MemManager | t.CPtr, arr: JsonValue | t.CPtr, item: JsonValue | t.CPtr):
if arr == None or item == None: return
if arr.vtype != JSON_ARRAY: return
arr._append_child(item)
# 向对象设置键值对
def object_set(pool: memhub.MemManager | t.CPtr, obj: JsonValue | t.CPtr, key: t.CChar | t.CPtr, val: JsonValue | t.CPtr):
if obj == None or key == None or val == None: return
if obj.vtype != JSON_OBJECT: return
cur: JsonValue | t.CPtr = obj.child
while cur != None:
if cur.key != None:
if cur.key == key:
cur.vtype = val.vtype
cur.bool_val = val.bool_val
cur.int_val = val.int_val
cur.float_val = val.float_val
cur.str_val = val.str_val
cur.child = val.child
cur.child_count = val.child_count
return
cur = cur.next
klen: t.CSizeT = string.strlen(key)
kbuf: t.CChar | t.CPtr = pool.alloc(klen + 1)
if kbuf != None:
string.memcpy(kbuf, key, klen + 1)
val.key = kbuf
obj._append_child(val)
# ============================================================
# 导入子模块
# ============================================================
from .__parser import parse
from .__writer import write