#!/usr/bin/env python3
import sys, os, struct
fn=sys.argv[1]
f=open(fn,"rb")

R_NONE    = 0x00
R_EMPTY   = 0x01
R_REAL    = 0x02
R_IMAG    = 0x04
R_SYMM    = 0x08
R_ASYMM   = 0x10

def flag_str(f):
    r=""
    if f & R_EMPTY:
        r += "empty "
    if f & R_REAL:
        r += "real "
    if f & R_IMAG:
        r += "imag "
    if f & R_SYMM:
        r += "symm "
    if f & R_ASYMM:
        r += "asymm "
    return r.strip()

try:
    while True:
        rd=f.read(4)
        if len(rd) == 0:
            break
        ntag=struct.unpack('i', rd)[0]
        tag=f.read(ntag).decode("utf-8")
        (crc32,ln,flags)=struct.unpack('IHH', f.read(4*2))
        print("Tag[%s] Size[%d] Flags[%s] CRC32[%X]" % (tag[0:-1],ln,flag_str(flags),crc32))

        nf = 1
        if flags & (R_REAL|R_IMAG):
            nf = 2
        if flags & (R_SYMM|R_ASYMM):
            ln = ln//2+1
        if flags & R_EMPTY:
            ln = 0

        f.seek(ln*16 // nf,1)
    f.close()
except:
    raise
#pass
