feat: SQL between/hostvar-key alignment, class-condition parsing, gcov merge across scenario runs
This commit is contained in:
@@ -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)
|
||||
# 本 GnuCOBOL(GC32-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}")
|
||||
|
||||
Reference in New Issue
Block a user