// File: /workspace/github_c_makefile_star2_O0/bluecmd[P]fst-example/gtkwave/fstapi.c
// Function: fstReaderIterateHier
struct fstHier *fstReaderIterateHier(void *ctx)
{
struct fstReaderContext *xc = (struct fstReaderContext *)ctx;
int isfeof;
fstHandle alias;
char *pnt;
int ch;

if(!xc) return(NULL);

if(!xc->fh)
        {
        if(!fstReaderRecreateHierFile(xc))
                {
                return(NULL);
                }
        }

if(xc->do_rewind)
        {
        xc->do_rewind = 0;
        xc->current_handle = 0;
        fstReaderFseeko(xc, xc->fh, 0, SEEK_SET);
        clearerr(xc->fh);
        }

if(!(isfeof=feof(xc->fh)))
        {
        int tag = fgetc(xc->fh);
        switch(tag)
                {
                case FST_ST_VCD_SCOPE:
                        xc->hier.htyp = FST_HT_SCOPE;
                        xc->hier.u.scope.typ = fgetc(xc->fh);
                        xc->hier.u.scope.name = pnt = xc->str_scope_nam;
                        while((ch = fgetc(xc->fh)))
                                {
                                *(pnt++) = ch;
                                }; /* scopename */
                        *pnt = 0;
                        xc->hier.u.scope.name_length = pnt - xc->hier.u.scope.name;

                        xc->hier.u.scope.component = pnt = xc->str_scope_comp;
                        while((ch = fgetc(xc->fh)))
                                {
                                *(pnt++) = ch;
                                }; /* scopecomp */
                        *pnt = 0;
                        xc->hier.u.scope.component_length = pnt - xc->hier.u.scope.component;
                        break;

                case FST_ST_VCD_UPSCOPE:
                        xc->hier.htyp = FST_HT_UPSCOPE;
                        break;

                case FST_ST_GEN_ATTRBEGIN:
                        xc->hier.htyp = FST_HT_ATTRBEGIN;
                        xc->hier.u.attr.typ = fgetc(xc->fh);
                        xc->hier.u.attr.subtype = fgetc(xc->fh);
                        xc->hier.u.attr.name = pnt = xc->str_scope_nam;
                        while((ch = fgetc(xc->fh)))
                                {
                                *(pnt++) = ch;
                                }; /* scopename */
                        *pnt = 0;
                        xc->hier.u.attr.name_length = pnt - xc->hier.u.scope.name;

                        xc->hier.u.attr.arg = fstReaderVarint64(xc->fh);

                        if(xc->hier.u.attr.typ == FST_AT_MISC)
                                {
                                if((xc->hier.u.attr.subtype == FST_MT_SOURCESTEM)||(xc->hier.u.attr.subtype == FST_MT_SOURCEISTEM))
                                        {
                                        int sidx_skiplen_dummy = 0;
                                        xc->hier.u.attr.arg_from_name = fstGetVarint64((unsigned char *)xc->str_scope_nam, &sidx_skiplen_dummy);
                                        }
                                }
                        break;

                case FST_ST_GEN_ATTREND:
                        xc->hier.htyp = FST_HT_ATTREND;
                        break;

                case FST_VT_VCD_EVENT:
                case FST_VT_VCD_INTEGER:
                case FST_VT_VCD_PARAMETER:
                case FST_VT_VCD_REAL:
                case FST_VT_VCD_REAL_PARAMETER:
                case FST_VT_VCD_REG:
                case FST_VT_VCD_SUPPLY0:
                case FST_VT_VCD_SUPPLY1:
                case FST_VT_VCD_TIME:
                case FST_VT_VCD_TRI:
                case FST_VT_VCD_TRIAND:
                case FST_VT_VCD_TRIOR:
                case FST_VT_VCD_TRIREG:
                case FST_VT_VCD_TRI0:
                case FST_VT_VCD_TRI1:
                case FST_VT_VCD_WAND:
                case FST_VT_VCD_WIRE:
                case FST_VT_VCD_WOR:
                case FST_VT_VCD_PORT:
                case FST_VT_VCD_SPARRAY:
                case FST_VT_VCD_REALTIME:
                case FST_VT_GEN_STRING:
                case FST_VT_SV_BIT:
                case FST_VT_SV_LOGIC:
                case FST_VT_SV_INT:
                case FST_VT_SV_SHORTINT:
                case FST_VT_SV_LONGINT:
                case FST_VT_SV_BYTE:
                case FST_VT_SV_ENUM:
                case FST_VT_SV_SHORTREAL:
                        xc->hier.htyp = FST_HT_VAR;
                        xc->hier.u.var.svt_workspace = FST_SVT_NONE;
                        xc->hier.u.var.sdt_workspace = FST_SDT_NONE;
                        xc->hier.u.var.sxt_workspace = 0;
                        xc->hier.u.var.typ = tag;
                        xc->hier.u.var.direction = fgetc(xc->fh);
                        xc->hier.u.var.name = pnt = xc->str_scope_nam;
                        while((ch = fgetc(xc->fh)))
                                {
                                *(pnt++) = ch;
                                }; /* varname */
                        *pnt = 0;
                        xc->hier.u.var.name_length = pnt - xc->hier.u.var.name;
                        xc->hier.u.var.length = fstReaderVarint32(xc->fh);
                        if(tag == FST_VT_VCD_PORT)
                                {
                                xc->hier.u.var.length -= 2; /* removal of delimiting spaces */
                                xc->hier.u.var.length /= 3; /* port -> signal size adjust */
                                }

                        alias = fstReaderVarint32(xc->fh);

                        if(!alias)
                                {
                                xc->current_handle++;
                                xc->hier.u.var.handle = xc->current_handle;
                                xc->hier.u.var.is_alias = 0;
                                }
                                else
                                {
                                xc->hier.u.var.handle = alias;
                                xc->hier.u.var.is_alias = 1;
                                }

                        break;

                default:
                        isfeof = 1;
                        break;
                }
        }

return(!isfeof ? &xc->hier : NULL);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0xb6c8
movq $0x0, -0x8(%rbp)
jmp 0xbba2
movq -0x18(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jne 0xb6f0
movq -0x18(%rbp), %rdi
callq 0xb000
cmpl $0x0, %eax
jne 0xb6ee
movq $0x0, -0x8(%rbp)
jmp 0xbba2
jmp 0xb6f0
movq -0x18(%rbp), %rax
movb 0x294(%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
je 0xb74c
movq -0x18(%rbp), %rax
movb 0x294(%rax), %cl
andb $-0x2, %cl
orb $0x0, %cl
movb %cl, 0x294(%rax)
movq -0x18(%rbp), %rax
movl $0x0, 0x280(%rax)
movq -0x18(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
xorl %eax, %eax
movl %eax, %edx
xorl %ecx, %ecx
callq 0xa3d0
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x2240
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x2230
movl %eax, -0x1c(%rbp)
cmpl $0x0, %eax
jne 0xbb7c
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movl %eax, -0x30(%rbp)
movl -0x30(%rbp), %eax
movq %rax, -0x40(%rbp)
subq $0xff, %rax
ja 0xbb73
movq -0x40(%rbp), %rax
leaq 0x1ed91(%rip), %rcx     # 0x2a524
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x18(%rbp), %rax
movb $0x0, 0x248(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x250(%rax)
movq -0x18(%rbp), %rcx
addq $0x295, %rcx            # imm = 0x295
movq %rcx, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq %rcx, 0x258(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movl %eax, -0x2c(%rbp)
cmpl $0x0, %eax
je 0xb807
movl -0x2c(%rbp), %eax
movb %al, %cl
movq -0x28(%rbp), %rax
movq %rax, %rdx
addq $0x1, %rdx
movq %rdx, -0x28(%rbp)
movb %cl, (%rax)
jmp 0xb7da
movq -0x28(%rbp), %rax
movb $0x0, (%rax)
movq -0x28(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x258(%rcx), %rcx
subq %rcx, %rax
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x268(%rax)
movq -0x18(%rbp), %rcx
addq $0x496, %rcx            # imm = 0x496
movq %rcx, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq %rcx, 0x260(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movl %eax, -0x2c(%rbp)
cmpl $0x0, %eax
je 0xb873
movl -0x2c(%rbp), %eax
movb %al, %cl
movq -0x28(%rbp), %rax
movq %rax, %rdx
addq $0x1, %rdx
movq %rdx, -0x28(%rbp)
movb %cl, (%rax)
jmp 0xb846
movq -0x28(%rbp), %rax
movb $0x0, (%rax)
movq -0x28(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x260(%rcx), %rcx
subq %rcx, %rax
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x26c(%rax)
jmp 0xbb7a
movq -0x18(%rbp), %rax
movb $0x1, 0x248(%rax)
jmp 0xbb7a
movq -0x18(%rbp), %rax
movb $0x3, 0x248(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x250(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x251(%rax)
movq -0x18(%rbp), %rcx
addq $0x295, %rcx            # imm = 0x295
movq %rcx, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq %rcx, 0x258(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movl %eax, -0x2c(%rbp)
cmpl $0x0, %eax
je 0xb931
movl -0x2c(%rbp), %eax
movb %al, %cl
movq -0x28(%rbp), %rax
movq %rax, %rdx
addq $0x1, %rdx
movq %rdx, -0x28(%rbp)
movb %cl, (%rax)
jmp 0xb904
movq -0x28(%rbp), %rax
movb $0x0, (%rax)
movq -0x28(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x258(%rcx), %rcx
subq %rcx, %rax
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x270(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0xbbb0
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x260(%rax)
movq -0x18(%rbp), %rax
movzbl 0x250(%rax), %eax
cmpl $0x0, %eax
jne 0xb9cc
movq -0x18(%rbp), %rax
movzbl 0x251(%rax), %eax
cmpl $0x4, %eax
je 0xb9a1
movq -0x18(%rbp), %rax
movzbl 0x251(%rax), %eax
cmpl $0x5, %eax
jne 0xb9ca
movl $0x0, -0x34(%rbp)
movq -0x18(%rbp), %rdi
addq $0x295, %rdi            # imm = 0x295
leaq -0x34(%rbp), %rsi
callq 0xbc50
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x268(%rax)
jmp 0xb9cc
jmp 0xbb7a
movq -0x18(%rbp), %rax
movb $0x4, 0x248(%rax)
jmp 0xbb7a
movq -0x18(%rbp), %rax
movb $0x2, 0x248(%rax)
movq -0x18(%rbp), %rax
movb $0x0, 0x252(%rax)
movq -0x18(%rbp), %rax
movb $0x0, 0x253(%rax)
movq -0x18(%rbp), %rax
movl $0x0, 0x254(%rax)
movl -0x30(%rbp), %eax
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x250(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movb %al, %cl
movq -0x18(%rbp), %rax
movb %cl, 0x251(%rax)
movq -0x18(%rbp), %rcx
addq $0x295, %rcx            # imm = 0x295
movq %rcx, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq %rcx, 0x258(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x21a0
movl %eax, -0x2c(%rbp)
cmpl $0x0, %eax
je 0xba7f
movl -0x2c(%rbp), %eax
movb %al, %cl
movq -0x28(%rbp), %rax
movq %rax, %rdx
addq $0x1, %rdx
movq %rdx, -0x28(%rbp)
movb %cl, (%rax)
jmp 0xba52
movq -0x28(%rbp), %rax
movb $0x0, (%rax)
movq -0x28(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x258(%rcx), %rcx
subq %rcx, %rax
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x268(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0xbcf0
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x260(%rax)
cmpl $0x12, -0x30(%rbp)
jne 0xbaf9
movq -0x18(%rbp), %rax
movl 0x260(%rax), %ecx
subl $0x2, %ecx
movl %ecx, 0x260(%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x48(%rbp)
movl 0x260(%rax), %eax
movl $0x3, %ecx
xorl %edx, %edx
divl %ecx
movl %eax, %ecx
movq -0x48(%rbp), %rax
movl %ecx, 0x260(%rax)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0xbcf0
movl %eax, -0x20(%rbp)
cmpl $0x0, -0x20(%rbp)
jne 0xbb4e
movq -0x18(%rbp), %rax
movl 0x280(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x280(%rax)
movq -0x18(%rbp), %rax
movl 0x280(%rax), %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x264(%rax)
movq -0x18(%rbp), %rax
movb 0x26c(%rax), %cl
andb $-0x2, %cl
orb $0x0, %cl
movb %cl, 0x26c(%rax)
jmp 0xbb71
movl -0x20(%rbp), %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x264(%rax)
movq -0x18(%rbp), %rax
movb 0x26c(%rax), %cl
andb $-0x2, %cl
orb $0x1, %cl
movb %cl, 0x26c(%rax)
jmp 0xbb7a
movl $0x1, -0x1c(%rbp)
jmp 0xbb7c
cmpl $0x0, -0x1c(%rbp)
jne 0xbb92
movq -0x18(%rbp), %rax
addq $0x248, %rax            # imm = 0x248
movq %rax, -0x50(%rbp)
jmp 0xbb9a
xorl %eax, %eax
movq %rax, -0x50(%rbp)
jmp 0xbb9a
movq -0x50(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax)