feat: SQL between/hostvar-key alignment, class-condition parsing, gcov merge across scenario runs

This commit is contained in:
hangshuo652
2026-08-09 17:43:00 +08:00
parent f331c8fa2a
commit 273a3f8211
31 changed files with 3789 additions and 272 deletions
+12 -5
View File
@@ -29,7 +29,10 @@ def get_storage_length(field: dict) -> int:
else:
return 8
elif usage in ('COMP-3', 'PACKED-DECIMAL'):
return (digits + 2) // 2
# 打包小数含小数位(如 9(3)V9(2)=5 位+符号 → 3 字节)。
# 只算整数位(digits)会少算 1 字节,导致与 GnuCOBOL FD 布局错位。
decimal = pi.get('decimal', 0)
return (digits + decimal + 2) // 2
else:
raise ValueError(f"Unsupported USAGE: {usage}")
@@ -74,10 +77,12 @@ def pack_value(value: str, field: dict) -> bytes:
fmt = fmt_map[size]
if not signed:
fmt = fmt.upper()
return struct.pack('<' + fmt, int_val)
# 本 GnuCOBOLGC32-BDB-SP1、主机兼容)的 COMP 按大端存储。
return struct.pack('>' + fmt, int_val)
elif usage in ('COMP-3', 'PACKED-DECIMAL'):
abs_str = str(abs(int_val)).zfill(digits)
# 打包长度含小数位(digits + decimal
abs_str = str(abs(int_val)).zfill(digits + pi.get('decimal', 0))
nibbles = [int(ch) for ch in abs_str]
if not signed:
nibbles.append(0xF)
@@ -112,7 +117,8 @@ def unpack_value(data: bytes, field: dict) -> str:
fmt = fmt_map[size]
if not signed:
fmt = fmt.upper()
val = struct.unpack('<' + fmt, data)[0]
# 与 pack_value 一致:本 GnuCOBOL 的 COMP 为大端存储。
val = struct.unpack('>' + fmt, data)[0]
sign = '-' if val < 0 else ''
return f"{sign}{str(abs(val)).zfill(digits)}"
@@ -127,7 +133,8 @@ def unpack_value(data: bytes, field: dict) -> str:
num_str = ''.join(chars).lstrip('0') or '0'
if signed and sign == 0xD:
num_str = '-' + num_str
return num_str.zfill(digits)
# 补零长度含小数位
return num_str.zfill(digits + pi.get('decimal', 0))
else:
raise ValueError(f"Unsupported USAGE: {usage}")