// File: DimitriFourny[P]unxip/unxip.cpp
// Function: ParseNodeFile(_xmlNode*, XarFile*)
bool ParseNodeFile(xmlNode* file_node, struct XarFile* xar_file) {
  /*
    <file id="2">
      <data>
        <offset>8111880836</offset>
        <size>355</size>
      </data>
      <name>Metadata</name>
    </file>
  */
  bool is_name_init = false;
  bool is_offset_init = false;
  bool is_size_init = false;

  xmlNode* data_node = nullptr;
  xmlNode* node = file_node->children;
  while (node) {
    if (!node->children) {
      node = node->next;
      continue;
    }
    const char* node_name = reinterpret_cast<const char*>(node->name);
    auto* node_content = reinterpret_cast<const char*>(node->children->content);

    if (!strcmp(node_name, "name")) {
      xar_file->name = std::string(node_content);
      is_name_init = true;
    } else if (!strcmp(node_name, "data")) {
      data_node = node;
    }
    node = node->next;
  }

  if (!is_name_init || !data_node) {
    return false;
  }
  node = data_node->children;
  while (node) {
    if (!node->children) {
      node = node->next;
      continue;
    }
    const char* node_name = reinterpret_cast<const char*>(node->name);
    auto* node_content = reinterpret_cast<const char*>(node->children->content);

    if (!strcmp(node_name, "offset")) {
      xar_file->offset = atol(node_content);
      is_offset_init = true;
    } else if (!strcmp(node_name, "length")) {
      xar_file->size = atol(node_content);
      is_size_init = true;
    }
    node = node->next;
  }

  return is_offset_init && is_size_init;
}

// Assembly:
subq $0xa8, %rsp
movq %rdi, 0x98(%rsp)
movq %rsi, 0x90(%rsp)
movb $0x0, 0x8f(%rsp)
movb $0x0, 0x8e(%rsp)
movb $0x0, 0x8d(%rsp)
movq $0x0, 0x80(%rsp)
movq 0x98(%rsp), %rax
movq 0x18(%rax), %rax
movq %rax, 0x78(%rsp)
cmpq $0x0, 0x78(%rsp)
je 0x2a8e
movq 0x78(%rsp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x29a4
movq 0x78(%rsp), %rax
movq 0x30(%rax), %rax
movq %rax, 0x78(%rsp)
jmp 0x297c
movq 0x78(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x70(%rsp)
movq 0x78(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rax), %rax
movq %rax, 0x68(%rsp)
movq 0x70(%rsp), %rdi
leaq 0x2686(%rip), %rsi      # 0x5056
callq 0x22b0
cmpl $0x0, %eax
jne 0x2a56
movq 0x68(%rsp), %rax
movq %rax, 0x10(%rsp)
leaq 0x47(%rsp), %rdi
movq %rdi, 0x18(%rsp)
callq 0x2320
movq 0x10(%rsp), %rsi
movq 0x18(%rsp), %rdx
leaq 0x48(%rsp), %rdi
callq 0x3690
jmp 0x2a09
movq 0x90(%rsp), %rdi
leaq 0x48(%rsp), %rsi
callq 0x2270
leaq 0x48(%rsp), %rdi
callq 0x2100
leaq 0x47(%rsp), %rdi
callq 0x2200
movb $0x1, 0x8f(%rsp)
jmp 0x2a7b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x38(%rsp)
movl %eax, 0x34(%rsp)
leaq 0x47(%rsp), %rdi
callq 0x2200
jmp 0x2bc7
movq 0x70(%rsp), %rdi
leaq 0x25f9(%rip), %rsi      # 0x505b
callq 0x22b0
cmpl $0x0, %eax
jne 0x2a79
movq 0x78(%rsp), %rax
movq %rax, 0x80(%rsp)
jmp 0x2a7b
movq 0x78(%rsp), %rax
movq 0x30(%rax), %rax
movq %rax, 0x78(%rsp)
jmp 0x297c
testb $0x1, 0x8f(%rsp)
je 0x2aa3
cmpq $0x0, 0x80(%rsp)
jne 0x2ab0
movb $0x0, 0xa7(%rsp)
jmp 0x2bb6
movq 0x80(%rsp), %rax
movq 0x18(%rax), %rax
movq %rax, 0x78(%rsp)
cmpq $0x0, 0x78(%rsp)
je 0x2b8e
movq 0x78(%rsp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x2ae9
movq 0x78(%rsp), %rax
movq 0x30(%rax), %rax
movq %rax, 0x78(%rsp)
jmp 0x2ac1
movq 0x78(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x78(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rdi
leaq 0x254b(%rip), %rsi      # 0x5060
callq 0x22b0
cmpl $0x0, %eax
jne 0x2b42
movq 0x20(%rsp), %rdi
callq 0x2260
movq %rax, %rcx
movq 0x90(%rsp), %rax
movq %rcx, 0x20(%rax)
movb $0x1, 0x8e(%rsp)
jmp 0x2b7b
movq 0x28(%rsp), %rdi
leaq 0x2519(%rip), %rsi      # 0x5067
callq 0x22b0
cmpl $0x0, %eax
jne 0x2b79
movq 0x20(%rsp), %rdi
callq 0x2260
movq %rax, %rcx
movq 0x90(%rsp), %rax
movq %rcx, 0x28(%rax)
movb $0x1, 0x8d(%rsp)
jmp 0x2b7b
movq 0x78(%rsp), %rax
movq 0x30(%rax), %rax
movq %rax, 0x78(%rsp)
jmp 0x2ac1
xorl %eax, %eax
testb $0x1, 0x8e(%rsp)
movb %al, 0xf(%rsp)
je 0x2ba9
movb 0x8d(%rsp), %al
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %al
andb $0x1, %al
movb %al, 0xa7(%rsp)
movb 0xa7(%rsp), %al
andb $0x1, %al
addq $0xa8, %rsp
retq
movq 0x38(%rsp), %rdi
callq 0x2310
nopw %cs:(%rax,%rax)