// File: twekkel[P]mzpq/libzpaq.cpp
// Function: libzpaq::Compiler::Compiler(char const*, int*, libzpaq::ZPAQL&, libzpaq::ZPAQL&, libzpaq::Writer*)
Compiler::Compiler(const char* in_, int* args_, ZPAQL& hz_, ZPAQL& pz_,
                   Writer* out2_): in(in_), args(args_), hz(hz_), pz(pz_),
                   out2(out2_), if_stack(1000), do_stack(1000) {
  line=1;
  state=0;
  hz.clear();
  pz.clear();
  hz.header.resize(68000); 

  // Compile the COMP section of header
  rtoken("comp");
  hz.header[2]=rtoken(0, 255);  // hh
  hz.header[3]=rtoken(0, 255);  // hm
  hz.header[4]=rtoken(0, 255);  // ph
  hz.header[5]=rtoken(0, 255);  // pm
  const int n=hz.header[6]=rtoken(0, 255);  // n
  hz.cend=7;
  for (int i=0; i<n; ++i) {
    rtoken(i, i);
    CompType type=CompType(rtoken(compname));
    hz.header[hz.cend++]=type;
    int clen=libzpaq::compsize[type&255];
    if (clen<1 || clen>10) syntaxError("invalid component");
    for (int j=1; j<clen; ++j)
      hz.header[hz.cend++]=rtoken(0, 255);  // component arguments
  }
  hz.header[hz.cend++];  // end
  hz.hbegin=hz.hend=hz.cend+128;

  // Compile HCOMP
  rtoken("hcomp");
  int op=compile_comp(hz);

  // Compute header size
  int hsize=hz.cend-2+hz.hend-hz.hbegin;
  hz.header[0]=hsize&255;
  hz.header[1]=hsize>>8;

  // Compile POST 0 END
  if (op==POST) {
    rtoken(0, 0);
    rtoken("end");
  }

  // Compile PCOMP pcomp_cmd ; program... END
  else if (op==PCOMP) {
    pz.header.resize(68000);
    pz.header[4]=hz.header[4];  // ph
    pz.header[5]=hz.header[5];  // pm
    pz.cend=8;
    pz.hbegin=pz.hend=pz.cend+128;

    // get pcomp_cmd ending with ";" (case sensitive)
    next();
    while (*in && *in!=';') {
      if (out2)
        out2->put(*in);
      ++in;
    }
    if (*in) ++in;

    // Compile PCOMP
    op=compile_comp(pz);
    int len=pz.cend-2+pz.hend-pz.hbegin;  // insert header size
    assert(len>=0);
    pz.header[0]=len&255;
    pz.header[1]=len>>8;
    if (op!=END)
      syntaxError("expected END");
  }
  else if (op!=END)
    syntaxError("expected END or POST 0 END or PCOMP cmd ; ... END");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x170, %rsp            # imm = 0x170
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x78(%rbp)
movq -0x10(%rbp), %rax
movq %rax, (%rdi)
movq -0x18(%rbp), %rax
movq %rax, 0x8(%rdi)
movq -0x20(%rbp), %rax
movq %rax, 0x10(%rdi)
movq -0x28(%rbp), %rax
movq %rax, 0x18(%rdi)
movq -0x30(%rbp), %rax
movq %rax, 0x20(%rdi)
addq $0x30, %rdi
movq %rdi, -0x80(%rbp)
movl $0x3e8, %esi            # imm = 0x3E8
movl %esi, -0x6c(%rbp)
callq 0x311b0
movq -0x78(%rbp), %rdi
movl -0x6c(%rbp), %esi
addq $0x50, %rdi
movq %rdi, -0x68(%rbp)
callq 0x311b0
jmp 0x1553d
movq -0x78(%rbp), %rax
movl $0x1, 0x28(%rax)
movl $0x0, 0x2c(%rax)
movq 0x10(%rax), %rdi
callq 0xeb50
jmp 0x1555a
movq -0x78(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0xeb50
jmp 0x15569
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x109a0, %esi          # imm = 0x109A0
xorl %edx, %edx
callq 0x30370
jmp 0x15583
movq -0x78(%rbp), %rdi
leaq 0x2315a(%rip), %rsi     # 0x386e8
callq 0x14c00
jmp 0x15595
movq -0x78(%rbp), %rdi
xorl %esi, %esi
movl $0xff, %edx
callq 0x14c50
movl %eax, -0x84(%rbp)
jmp 0x155ad
movq -0x78(%rbp), %rax
movl -0x84(%rbp), %ecx
movb %cl, -0x91(%rbp)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x2, %esi
callq 0x30630
movq %rax, -0x90(%rbp)
jmp 0x155d8
movq -0x78(%rbp), %rdi
movq -0x90(%rbp), %rax
movb -0x91(%rbp), %cl
movb %cl, (%rax)
xorl %esi, %esi
movl $0xff, %edx
callq 0x14c50
movl %eax, -0x98(%rbp)
jmp 0x155ff
movq -0x78(%rbp), %rax
movl -0x98(%rbp), %ecx
movb %cl, -0xa1(%rbp)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x3, %esi
callq 0x30630
movq %rax, -0xa0(%rbp)
jmp 0x1562a
movq -0x78(%rbp), %rdi
movq -0xa0(%rbp), %rax
movb -0xa1(%rbp), %cl
movb %cl, (%rax)
xorl %esi, %esi
movl $0xff, %edx
callq 0x14c50
movl %eax, -0xa8(%rbp)
jmp 0x15651
movq -0x78(%rbp), %rax
movl -0xa8(%rbp), %ecx
movb %cl, -0xb1(%rbp)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x4, %esi
callq 0x30630
movq %rax, -0xb0(%rbp)
jmp 0x1567c
movq -0x78(%rbp), %rdi
movq -0xb0(%rbp), %rax
movb -0xb1(%rbp), %cl
movb %cl, (%rax)
xorl %esi, %esi
movl $0xff, %edx
callq 0x14c50
movl %eax, -0xb8(%rbp)
jmp 0x156a3
movq -0x78(%rbp), %rax
movl -0xb8(%rbp), %ecx
movb %cl, -0xc1(%rbp)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x5, %esi
callq 0x30630
movq %rax, -0xc0(%rbp)
jmp 0x156ce
movq -0x78(%rbp), %rdi
movq -0xc0(%rbp), %rax
movb -0xc1(%rbp), %cl
movb %cl, (%rax)
xorl %esi, %esi
movl $0xff, %edx
callq 0x14c50
movl %eax, -0xc8(%rbp)
jmp 0x156f5
movq -0x78(%rbp), %rax
movl -0xc8(%rbp), %ecx
movb %cl, -0xd1(%rbp)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x6, %esi
callq 0x30630
movq %rax, -0xd0(%rbp)
jmp 0x15720
movq -0x78(%rbp), %rax
movb -0xd1(%rbp), %cl
movq -0xd0(%rbp), %rdx
movb %cl, (%rdx)
movzbl %cl, %ecx
movl %ecx, -0x40(%rbp)
movq 0x10(%rax), %rax
movl $0x7, 0x28(%rax)
movl $0x0, -0x44(%rbp)
movl -0x44(%rbp), %eax
cmpl -0x40(%rbp), %eax
jge 0x158b4
movq -0x78(%rbp), %rdi
movl -0x44(%rbp), %edx
movl %edx, %esi
callq 0x14c50
jmp 0x15767
movq -0x78(%rbp), %rdi
leaq 0x2bb5e(%rip), %rsi     # 0x412d0
callq 0x14b70
movl %eax, -0xd8(%rbp)
jmp 0x1577f
movq -0x78(%rbp), %rax
movl -0xd8(%rbp), %ecx
movl %ecx, -0x48(%rbp)
movb -0x48(%rbp), %cl
movb %cl, -0xe1(%rbp)
movq 0x10(%rax), %rax
movq %rax, %rdi
addq $0x10, %rdi
movslq 0x28(%rax), %rsi
movl %esi, %ecx
incl %ecx
movl %ecx, 0x28(%rax)
callq 0x30630
movq %rax, -0xe0(%rbp)
jmp 0x157b9
movq -0xe0(%rbp), %rax
movb -0xe1(%rbp), %cl
movb %cl, (%rax)
movl -0x48(%rbp), %eax
andl $0xff, %eax
movslq %eax, %rcx
leaq 0x1f3e6(%rip), %rax     # 0x34bc0
movl (%rax,%rcx,4), %eax
movl %eax, -0x4c(%rbp)
cmpl $0x1, -0x4c(%rbp)
jl 0x157ec
cmpl $0xa, -0x4c(%rbp)
jle 0x1582f
movq -0x78(%rbp), %rdi
leaq 0x22ede(%rip), %rsi     # 0x386d5
xorl %eax, %eax
movl %eax, %edx
callq 0x149a0
jmp 0x15802
jmp 0x1582f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x15c4f
movq -0x68(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
callq 0x311f0
jmp 0x15c4f
movl $0x1, -0x50(%rbp)
movl -0x50(%rbp), %eax
cmpl -0x4c(%rbp), %eax
jge 0x158a4
movq -0x78(%rbp), %rdi
xorl %esi, %esi
movl $0xff, %edx
callq 0x14c50
movl %eax, -0xe8(%rbp)
jmp 0x15856
movq -0x78(%rbp), %rax
movl -0xe8(%rbp), %ecx
movb %cl, -0xf1(%rbp)
movq 0x10(%rax), %rax
movq %rax, %rdi
addq $0x10, %rdi
movslq 0x28(%rax), %rsi
movl %esi, %ecx
incl %ecx
movl %ecx, 0x28(%rax)
callq 0x30630
movq %rax, -0xf0(%rbp)
jmp 0x1588a
movq -0xf0(%rbp), %rax
movb -0xf1(%rbp), %cl
movb %cl, (%rax)
movl -0x50(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x50(%rbp)
jmp 0x15836
jmp 0x158a6
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x1574b
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, %rdi
addq $0x10, %rdi
movslq 0x28(%rax), %rsi
movl %esi, %ecx
incl %ecx
movl %ecx, 0x28(%rax)
callq 0x30630
jmp 0x158d5
movq -0x78(%rbp), %rdi
movq 0x10(%rdi), %rax
movl 0x28(%rax), %ecx
subl $-0x80, %ecx
movl %ecx, 0x30(%rax)
movq 0x10(%rdi), %rax
movl %ecx, 0x2c(%rax)
leaq 0x22df3(%rip), %rsi     # 0x386e7
callq 0x14c00
jmp 0x158fb
movq -0x78(%rbp), %rdi
movq 0x10(%rdi), %rsi
callq 0x14d90
movl %eax, -0xf8(%rbp)
jmp 0x15910
movq -0x78(%rbp), %rax
movl -0xf8(%rbp), %ecx
movl %ecx, -0x54(%rbp)
movq 0x10(%rax), %rdx
movl 0x30(%rdx), %esi
movl 0x28(%rdx), %ecx
movl 0x2c(%rdx), %edx
addl %esi, %ecx
subl %edx, %ecx
addl $-0x2, %ecx
movl %ecx, -0x58(%rbp)
movb -0x58(%rbp), %cl
movb %cl, -0x101(%rbp)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x30630
movq %rax, -0x100(%rbp)
jmp 0x15957
movq -0x78(%rbp), %rax
movq -0x100(%rbp), %rcx
movb -0x101(%rbp), %dl
movb %dl, (%rcx)
movb -0x57(%rbp), %cl
movb %cl, -0x111(%rbp)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x1, %esi
callq 0x30630
movq %rax, -0x110(%rbp)
jmp 0x1598e
movq -0x110(%rbp), %rax
movb -0x111(%rbp), %cl
movb %cl, (%rax)
cmpl $0x100, -0x54(%rbp)     # imm = 0x100
jne 0x159cc
movq -0x78(%rbp), %rdi
xorl %edx, %edx
movl %edx, %esi
callq 0x14c50
jmp 0x159b5
movq -0x78(%rbp), %rdi
leaq 0x22c12(%rip), %rsi     # 0x385d2
callq 0x14c00
jmp 0x159c7
jmp 0x15c46
cmpl $0x101, -0x54(%rbp)     # imm = 0x101
jne 0x15c21
movq -0x78(%rbp), %rax
movq 0x18(%rax), %rdi
addq $0x10, %rdi
movl $0x109a0, %esi          # imm = 0x109A0
xorl %edx, %edx
callq 0x30370
jmp 0x159f3
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x4, %esi
callq 0x30630
movq %rax, -0x120(%rbp)
jmp 0x15a12
movq -0x78(%rbp), %rax
movq -0x120(%rbp), %rcx
movb (%rcx), %cl
movb %cl, -0x129(%rbp)
movq 0x18(%rax), %rdi
addq $0x10, %rdi
movl $0x4, %esi
callq 0x30630
movq %rax, -0x128(%rbp)
jmp 0x15a40
movq -0x78(%rbp), %rax
movq -0x128(%rbp), %rcx
movb -0x129(%rbp), %dl
movb %dl, (%rcx)
movq 0x10(%rax), %rdi
addq $0x10, %rdi
movl $0x5, %esi
callq 0x30630
movq %rax, -0x138(%rbp)
jmp 0x15a6e
movq -0x78(%rbp), %rax
movq -0x138(%rbp), %rcx
movb (%rcx), %cl
movb %cl, -0x141(%rbp)
movq 0x18(%rax), %rdi
addq $0x10, %rdi
movl $0x5, %esi
callq 0x30630
movq %rax, -0x140(%rbp)
jmp 0x15a9c
movq -0x78(%rbp), %rdi
movq -0x140(%rbp), %rax
movb -0x141(%rbp), %cl
movb %cl, (%rax)
movq 0x18(%rdi), %rax
movl $0x8, 0x28(%rax)
movq 0x18(%rdi), %rax
movl 0x28(%rax), %ecx
subl $-0x80, %ecx
movl %ecx, 0x30(%rax)
movq 0x18(%rdi), %rax
movl %ecx, 0x2c(%rax)
callq 0x14760
jmp 0x15ad5
jmp 0x15ad7
movq -0x78(%rbp), %rax
movq (%rax), %rcx
xorl %eax, %eax
cmpb $0x0, (%rcx)
movb %al, -0x142(%rbp)
je 0x15b01
movq -0x78(%rbp), %rax
movq (%rax), %rax
movsbl (%rax), %eax
cmpl $0x3b, %eax
setne %al
movb %al, -0x142(%rbp)
movb -0x142(%rbp), %al
testb $0x1, %al
jne 0x15b0d
jmp 0x15b42
movq -0x78(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0x15b32
movq -0x78(%rbp), %rcx
movq (%rcx), %rax
movq 0x20(%rcx), %rdi
movsbl (%rax), %esi
movq (%rdi), %rax
movq (%rax), %rax
callq *%rax
jmp 0x15b30
jmp 0x15b32
movq -0x78(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x15ad7
movq -0x78(%rbp), %rax
movq (%rax), %rax
cmpb $0x0, (%rax)
je 0x15b5c
movq -0x78(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq -0x78(%rbp), %rdi
movq 0x18(%rdi), %rsi
callq 0x14d90
movl %eax, -0x148(%rbp)
jmp 0x15b71
movq -0x78(%rbp), %rax
movl -0x148(%rbp), %ecx
movl %ecx, -0x54(%rbp)
movq 0x18(%rax), %rdx
movl 0x30(%rdx), %esi
movl 0x28(%rdx), %ecx
movl 0x2c(%rdx), %edx
addl %esi, %ecx
subl %edx, %ecx
addl $-0x2, %ecx
movl %ecx, -0x5c(%rbp)
movb -0x5c(%rbp), %cl
movb %cl, -0x151(%rbp)
movq 0x18(%rax), %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x30630
movq %rax, -0x150(%rbp)
jmp 0x15bb8
movq -0x78(%rbp), %rax
movq -0x150(%rbp), %rcx
movb -0x151(%rbp), %dl
movb %dl, (%rcx)
movb -0x5b(%rbp), %cl
movb %cl, -0x161(%rbp)
movq 0x18(%rax), %rdi
addq $0x10, %rdi
movl $0x1, %esi
callq 0x30630
movq %rax, -0x160(%rbp)
jmp 0x15bef
movq -0x160(%rbp), %rax
movb -0x161(%rbp), %cl
movb %cl, (%rax)
cmpl $0x102, -0x54(%rbp)     # imm = 0x102
je 0x15c1f
movq -0x78(%rbp), %rdi
leaq 0x22adb(%rip), %rsi     # 0x386ed
xorl %eax, %eax
movl %eax, %edx
callq 0x149a0
jmp 0x15c1d
jmp 0x15c1f
jmp 0x15c44
cmpl $0x102, -0x54(%rbp)     # imm = 0x102
je 0x15c42
movq -0x78(%rbp), %rdi
leaq 0x22ac5(%rip), %rsi     # 0x386fa
xorl %eax, %eax
movl %eax, %edx
callq 0x149a0
jmp 0x15c40
jmp 0x15c42
jmp 0x15c44
jmp 0x15c46
addq $0x170, %rsp            # imm = 0x170
popq %rbp
retq
movq -0x80(%rbp), %rdi
callq 0x311f0
movq -0x38(%rbp), %rdi
callq 0x5490
nopw %cs:(%rax,%rax)