
bin_tree_t * create_token_tree(re_dfa_t *dfa,bin_tree_t *left,bin_tree_t *right,re_token_t *token)

{
  undefined1 *puVar1;
  bin_tree_t *pbVar2;
  wchar_t wVar3;
  undefined8 uVar4;
  bin_tree_storage_t *pbVar5;
  
  if (dfa->str_tree_storage_idx == L'\x0f') {
    pbVar5 = (bin_tree_storage_t *)malloc(0x3c8);
    if (pbVar5 == (bin_tree_storage_t *)0x0) {
      return (bin_tree_t *)0x0;
    }
    pbVar5->next = dfa->str_tree_storage;
    dfa->str_tree_storage = pbVar5;
    dfa->str_tree_storage_idx = L'\0';
  }
  pbVar5 = dfa->str_tree_storage;
  wVar3 = dfa->str_tree_storage_idx;
  dfa->str_tree_storage_idx = wVar3 + L'\x01';
  pbVar2 = pbVar5->data + wVar3;
  pbVar5->data[wVar3].parent = (bin_tree_t *)0x0;
  pbVar5->data[wVar3].left = left;
  pbVar5->data[wVar3].right = right;
  uVar4 = *(undefined8 *)&token->field_0x8;
  pbVar5->data[wVar3].token.opr = token->opr;
  *(undefined8 *)&pbVar5->data[wVar3].token.field_0x8 = uVar4;
  puVar1 = &pbVar5->data[wVar3].token.field_0xa;
  *puVar1 = *puVar1 & 0xf3;
  pbVar5->data[wVar3].first = (bin_tree_t *)0x0;
  pbVar5->data[wVar3].next = (bin_tree_t *)0x0;
  pbVar5->data[wVar3].node_idx = -1;
  if (left != (bin_tree_t *)0x0) {
    left->parent = pbVar2;
  }
  if (right != (bin_tree_t *)0x0) {
    right->parent = pbVar2;
  }
  return pbVar2;
}



long FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)

{
  long lVar1;
  int iVar2;
  undefined8 uVar3;
  undefined8 *puVar4;
  long lVar5;
  
  if (*(int *)(param_1 + 0x80) == 0xf) {
    puVar4 = (undefined8 *)malloc(0x3c8);
    if (puVar4 == (undefined8 *)0x0) {
      return 0;
    }
    *puVar4 = *(undefined8 *)(param_1 + 0x70);
    *(undefined8 **)(param_1 + 0x70) = puVar4;
    *(undefined4 *)(param_1 + 0x80) = 0;
  }
  iVar2 = *(int *)(param_1 + 0x80);
  *(int *)(param_1 + 0x80) = iVar2 + 1;
  lVar5 = (long)iVar2 * 0x40;
  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;
  lVar5 = lVar5 + *(long *)(param_1 + 0x70);
  *(undefined8 *)(lVar5 + 8) = 0;
  *(long **)(lVar5 + 0x10) = param_2;
  *(long **)(lVar5 + 0x18) = param_3;
  uVar3 = param_4[1];
  *(undefined8 *)(lVar5 + 0x30) = *param_4;
  *(undefined8 *)(lVar5 + 0x38) = uVar3;
  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;
  *(undefined8 *)(lVar5 + 0x20) = 0;
  *(undefined8 *)(lVar5 + 0x28) = 0;
  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;
  if (param_2 != (long *)0x0) {
    *param_2 = lVar1;
  }
  if (param_3 != (long *)0x0) {
    *param_3 = lVar1;
  }
  return lVar1;
}


PUSH R13
PUSH R12
PUSH RBP
PUSH RBX
SUB RSP,0x8
MOV R13,RDI
MOV RBP,RSI
MOV RBX,RDX
MOV R12,RCX
CMP dword ptr [RDI + 0x80],0xf
JZ 0x0016a673
MOV RCX,qword ptr [R13 + 0x70]
MOV EDX,dword ptr [R13 + 0x80]
LEA EAX,[RDX + 0x1]
MOV dword ptr [R13 + 0x80],EAX
MOVSXD RDX,EDX
SHL RDX,0x6
LEA RAX,[RCX + RDX*0x1 + 0x8]
ADD RDX,RCX
MOV qword ptr [RDX + 0x8],0x0
MOV qword ptr [RDX + 0x10],RBP
MOV qword ptr [RDX + 0x18],RBX
LEA RCX,[RDX + 0x20]
MOV RSI,qword ptr [R12]
MOV RDI,qword ptr [R12 + 0x8]
MOV qword ptr [RDX + 0x30],RSI
MOV qword ptr [RDX + 0x38],RDI
AND byte ptr [RCX + 0x1a],0xf3
MOV qword ptr [RDX + 0x20],0x0
MOV qword ptr [RDX + 0x28],0x0
MOV dword ptr [RDX + 0x40],0xffffffff
TEST RBP,RBP
JZ 0x0016a660
MOV qword ptr [RBP],RAX
TEST RBX,RBX
JZ 0x0016a668
MOV qword ptr [RBX],RAX
ADD RSP,0x8
POP RBX
POP RBP
POP R12
POP R13
RET
MOV EDI,0x3c8
CALL 0x00108f10
TEST RAX,RAX
JZ 0x0016a69d
MOV RDX,qword ptr [R13 + 0x70]
MOV qword ptr [RAX],RDX
MOV qword ptr [R13 + 0x70],RAX
MOV dword ptr [R13 + 0x80],0x0
JMP 0x0016a5f3
MOV EAX,0x0
JMP 0x0016a668
(translation_unit "long FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)\n\n{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}\n\n" (function_definition "long FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)\n\n{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}" (sized_type_specifier "long" long) (function_declarator "FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)" identifier (parameter_list "(long param_1,long *param_2,long *param_3,undefined8 *param_4)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long *param_2" (sized_type_specifier "long" long) (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "undefined8 *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) ))) (compound_statement "{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "undefined8 uVar3;" type_identifier identifier ;) (declaration "undefined8 *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "long lVar5;" (sized_type_specifier "long" long) identifier ;) (if_statement "if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }" if (parenthesized_expression "(*(int *)(param_1 + 0x80) == 0xf)" ( (binary_expression "*(int *)(param_1 + 0x80) == 0xf" (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) == number_literal) )) (compound_statement "{\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }" { (expression_statement "puVar4 = (undefined8 *)malloc(0x3c8);" (assignment_expression "puVar4 = (undefined8 *)malloc(0x3c8)" identifier = (cast_expression "(undefined8 *)malloc(0x3c8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "malloc(0x3c8)" identifier (argument_list "(0x3c8)" ( number_literal ))))) ;) (if_statement "if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }" if (parenthesized_expression "(puVar4 == (undefined8 *)0x0)" ( (binary_expression "puVar4 == (undefined8 *)0x0" identifier == (cast_expression "(undefined8 *)0x0" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n      return 0;\n    }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "*puVar4 = *(undefined8 *)(param_1 + 0x70);" (assignment_expression "*puVar4 = *(undefined8 *)(param_1 + 0x70)" (pointer_expression "*puVar4" * identifier) = (pointer_expression "*(undefined8 *)(param_1 + 0x70)" * (cast_expression "(undefined8 *)(param_1 + 0x70)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) ))))) ;) (expression_statement "*(undefined8 **)(param_1 + 0x70) = puVar4;" (assignment_expression "*(undefined8 **)(param_1 + 0x70) = puVar4" (pointer_expression "*(undefined8 **)(param_1 + 0x70)" * (cast_expression "(undefined8 **)(param_1 + 0x70)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) )))) = identifier) ;) (expression_statement "*(undefined4 *)(param_1 + 0x80) = 0;" (assignment_expression "*(undefined4 *)(param_1 + 0x80) = 0" (pointer_expression "*(undefined4 *)(param_1 + 0x80)" * (cast_expression "(undefined4 *)(param_1 + 0x80)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) = number_literal) ;) })) (expression_statement "iVar2 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar2 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (expression_statement "*(int *)(param_1 + 0x80) = iVar2 + 1;" (assignment_expression "*(int *)(param_1 + 0x80) = iVar2 + 1" (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) = (binary_expression "iVar2 + 1" identifier + number_literal)) ;) (expression_statement "lVar5 = (long)iVar2 * 0x40;" (assignment_expression "lVar5 = (long)iVar2 * 0x40" identifier = (binary_expression "(long)iVar2 * 0x40" (cast_expression "(long)iVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) * number_literal)) ;) (expression_statement "lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;" (assignment_expression "lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5" identifier = (binary_expression "*(long *)(param_1 + 0x70) + 8 + lVar5" (binary_expression "*(long *)(param_1 + 0x70) + 8" (pointer_expression "*(long *)(param_1 + 0x70)" * (cast_expression "(long *)(param_1 + 0x70)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) )))) + number_literal) + identifier)) ;) (expression_statement "lVar5 = lVar5 + *(long *)(param_1 + 0x70);" (assignment_expression "lVar5 = lVar5 + *(long *)(param_1 + 0x70)" identifier = (binary_expression "lVar5 + *(long *)(param_1 + 0x70)" identifier + (pointer_expression "*(long *)(param_1 + 0x70)" * (cast_expression "(long *)(param_1 + 0x70)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) )))))) ;) (expression_statement "*(undefined8 *)(lVar5 + 8) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 8) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 8)" * (cast_expression "(undefined8 *)(lVar5 + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 8)" ( (binary_expression "lVar5 + 8" identifier + number_literal) )))) = number_literal) ;) (expression_statement "*(long **)(lVar5 + 0x10) = param_2;" (assignment_expression "*(long **)(lVar5 + 0x10) = param_2" (pointer_expression "*(long **)(lVar5 + 0x10)" * (cast_expression "(long **)(lVar5 + 0x10)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(lVar5 + 0x10)" ( (binary_expression "lVar5 + 0x10" identifier + number_literal) )))) = identifier) ;) (expression_statement "*(long **)(lVar5 + 0x18) = param_3;" (assignment_expression "*(long **)(lVar5 + 0x18) = param_3" (pointer_expression "*(long **)(lVar5 + 0x18)" * (cast_expression "(long **)(lVar5 + 0x18)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(lVar5 + 0x18)" ( (binary_expression "lVar5 + 0x18" identifier + number_literal) )))) = identifier) ;) (expression_statement "uVar3 = param_4[1];" (assignment_expression "uVar3 = param_4[1]" identifier = (subscript_expression "param_4[1]" identifier [ number_literal ])) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x30) = *param_4;" (assignment_expression "*(undefined8 *)(lVar5 + 0x30) = *param_4" (pointer_expression "*(undefined8 *)(lVar5 + 0x30)" * (cast_expression "(undefined8 *)(lVar5 + 0x30)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x30)" ( (binary_expression "lVar5 + 0x30" identifier + number_literal) )))) = (pointer_expression "*param_4" * identifier)) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x38) = uVar3;" (assignment_expression "*(undefined8 *)(lVar5 + 0x38) = uVar3" (pointer_expression "*(undefined8 *)(lVar5 + 0x38)" * (cast_expression "(undefined8 *)(lVar5 + 0x38)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x38)" ( (binary_expression "lVar5 + 0x38" identifier + number_literal) )))) = identifier) ;) (expression_statement "*(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;" (assignment_expression "*(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3" (pointer_expression "*(byte *)(lVar5 + 0x3a)" * (cast_expression "(byte *)(lVar5 + 0x3a)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x3a)" ( (binary_expression "lVar5 + 0x3a" identifier + number_literal) )))) = (binary_expression "*(byte *)(lVar5 + 0x3a) & 0xf3" (pointer_expression "*(byte *)(lVar5 + 0x3a)" * (cast_expression "(byte *)(lVar5 + 0x3a)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x3a)" ( (binary_expression "lVar5 + 0x3a" identifier + number_literal) )))) & number_literal)) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x20) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 0x20) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 0x20)" * (cast_expression "(undefined8 *)(lVar5 + 0x20)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x20)" ( (binary_expression "lVar5 + 0x20" identifier + number_literal) )))) = number_literal) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x28) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 0x28) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 0x28)" * (cast_expression "(undefined8 *)(lVar5 + 0x28)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x28)" ( (binary_expression "lVar5 + 0x28" identifier + number_literal) )))) = number_literal) ;) (expression_statement "*(undefined4 *)(lVar5 + 0x40) = 0xffffffff;" (assignment_expression "*(undefined4 *)(lVar5 + 0x40) = 0xffffffff" (pointer_expression "*(undefined4 *)(lVar5 + 0x40)" * (cast_expression "(undefined4 *)(lVar5 + 0x40)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x40)" ( (binary_expression "lVar5 + 0x40" identifier + number_literal) )))) = number_literal) ;) (if_statement "if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }" if (parenthesized_expression "(param_2 != (long *)0x0)" ( (binary_expression "param_2 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_2 = lVar1;\n  }" { (expression_statement "*param_2 = lVar1;" (assignment_expression "*param_2 = lVar1" (pointer_expression "*param_2" * identifier) = identifier) ;) })) (if_statement "if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }" if (parenthesized_expression "(param_3 != (long *)0x0)" ( (binary_expression "param_3 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_3 = lVar1;\n  }" { (expression_statement "*param_3 = lVar1;" (assignment_expression "*param_3 = lVar1" (pointer_expression "*param_3" * identifier) = identifier) ;) })) (return_statement "return lVar1;" return identifier ;) })))
(translation_unit "bin_tree_t * create_token_tree(re_dfa_t *dfa,bin_tree_t *left,bin_tree_t *right,re_token_t *token)\n\n{\n  undefined1 *puVar1;\n  bin_tree_t *pbVar2;\n  wchar_t wVar3;\n  undefined8 uVar4;\n  bin_tree_storage_t *pbVar5;\n  \n  if (dfa->str_tree_storage_idx == L'\x0f') {\n    pbVar5 = (bin_tree_storage_t *)malloc(0x3c8);\n    if (pbVar5 == (bin_tree_storage_t *)0x0) {\n      return (bin_tree_t *)0x0;\n    }\n    pbVar5->next = dfa->str_tree_storage;\n    dfa->str_tree_storage = pbVar5;\n    dfa->str_tree_storage_idx = L'\0';\n  }\n  pbVar5 = dfa->str_tree_storage;\n  wVar3 = dfa->str_tree_storage_idx;\n  dfa->str_tree_storage_idx = wVar3 + L'\x01';\n  pbVar2 = pbVar5->data + wVar3;\n  pbVar5->data[wVar3].parent = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].left = left;\n  pbVar5->data[wVar3].right = right;\n  uVar4 = *(undefined8 *)&token->field_0x8;\n  pbVar5->data[wVar3].token.opr = token->opr;\n  *(undefined8 *)&pbVar5->data[wVar3].token.field_0x8 = uVar4;\n  puVar1 = &pbVar5->data[wVar3].token.field_0xa;\n  *puVar1 = *puVar1 & 0xf3;\n  pbVar5->data[wVar3].first = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].next = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].node_idx = -1;\n  if (left != (bin_tree_t *)0x0) {\n    left->parent = pbVar2;\n  }\n  if (right != (bin_tree_t *)0x0) {\n    right->parent = pbVar2;\n  }\n  return pbVar2;\n}\n\n" (function_definition "bin_tree_t * create_token_tree(re_dfa_t *dfa,bin_tree_t *left,bin_tree_t *right,re_token_t *token)\n\n{\n  undefined1 *puVar1;\n  bin_tree_t *pbVar2;\n  wchar_t wVar3;\n  undefined8 uVar4;\n  bin_tree_storage_t *pbVar5;\n  \n  if (dfa->str_tree_storage_idx == L'\x0f') {\n    pbVar5 = (bin_tree_storage_t *)malloc(0x3c8);\n    if (pbVar5 == (bin_tree_storage_t *)0x0) {\n      return (bin_tree_t *)0x0;\n    }\n    pbVar5->next = dfa->str_tree_storage;\n    dfa->str_tree_storage = pbVar5;\n    dfa->str_tree_storage_idx = L'\0';\n  }\n  pbVar5 = dfa->str_tree_storage;\n  wVar3 = dfa->str_tree_storage_idx;\n  dfa->str_tree_storage_idx = wVar3 + L'\x01';\n  pbVar2 = pbVar5->data + wVar3;\n  pbVar5->data[wVar3].parent = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].left = left;\n  pbVar5->data[wVar3].right = right;\n  uVar4 = *(undefined8 *)&token->field_0x8;\n  pbVar5->data[wVar3].token.opr = token->opr;\n  *(undefined8 *)&pbVar5->data[wVar3].token.field_0x8 = uVar4;\n  puVar1 = &pbVar5->data[wVar3].token.field_0xa;\n  *puVar1 = *puVar1 & 0xf3;\n  pbVar5->data[wVar3].first = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].next = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].node_idx = -1;\n  if (left != (bin_tree_t *)0x0) {\n    left->parent = pbVar2;\n  }\n  if (right != (bin_tree_t *)0x0) {\n    right->parent = pbVar2;\n  }\n  return pbVar2;\n}" type_identifier (pointer_declarator "* create_token_tree(re_dfa_t *dfa,bin_tree_t *left,bin_tree_t *right,re_token_t *token)" * (function_declarator "create_token_tree(re_dfa_t *dfa,bin_tree_t *left,bin_tree_t *right,re_token_t *token)" identifier (parameter_list "(re_dfa_t *dfa,bin_tree_t *left,bin_tree_t *right,re_token_t *token)" ( (parameter_declaration "re_dfa_t *dfa" type_identifier (pointer_declarator "*dfa" * identifier)) , (parameter_declaration "bin_tree_t *left" type_identifier (pointer_declarator "*left" * identifier)) , (parameter_declaration "bin_tree_t *right" type_identifier (pointer_declarator "*right" * identifier)) , (parameter_declaration "re_token_t *token" type_identifier (pointer_declarator "*token" * identifier)) )))) (compound_statement "{\n  undefined1 *puVar1;\n  bin_tree_t *pbVar2;\n  wchar_t wVar3;\n  undefined8 uVar4;\n  bin_tree_storage_t *pbVar5;\n  \n  if (dfa->str_tree_storage_idx == L'\x0f') {\n    pbVar5 = (bin_tree_storage_t *)malloc(0x3c8);\n    if (pbVar5 == (bin_tree_storage_t *)0x0) {\n      return (bin_tree_t *)0x0;\n    }\n    pbVar5->next = dfa->str_tree_storage;\n    dfa->str_tree_storage = pbVar5;\n    dfa->str_tree_storage_idx = L'\0';\n  }\n  pbVar5 = dfa->str_tree_storage;\n  wVar3 = dfa->str_tree_storage_idx;\n  dfa->str_tree_storage_idx = wVar3 + L'\x01';\n  pbVar2 = pbVar5->data + wVar3;\n  pbVar5->data[wVar3].parent = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].left = left;\n  pbVar5->data[wVar3].right = right;\n  uVar4 = *(undefined8 *)&token->field_0x8;\n  pbVar5->data[wVar3].token.opr = token->opr;\n  *(undefined8 *)&pbVar5->data[wVar3].token.field_0x8 = uVar4;\n  puVar1 = &pbVar5->data[wVar3].token.field_0xa;\n  *puVar1 = *puVar1 & 0xf3;\n  pbVar5->data[wVar3].first = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].next = (bin_tree_t *)0x0;\n  pbVar5->data[wVar3].node_idx = -1;\n  if (left != (bin_tree_t *)0x0) {\n    left->parent = pbVar2;\n  }\n  if (right != (bin_tree_t *)0x0) {\n    right->parent = pbVar2;\n  }\n  return pbVar2;\n}" { (declaration "undefined1 *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "bin_tree_t *pbVar2;" type_identifier (pointer_declarator "*pbVar2" * identifier) ;) (declaration "wchar_t wVar3;" type_identifier identifier ;) (declaration "undefined8 uVar4;" type_identifier identifier ;) (declaration "bin_tree_storage_t *pbVar5;" type_identifier (pointer_declarator "*pbVar5" * identifier) ;) (if_statement "if (dfa->str_tree_storage_idx == L'\x0f') {\n    pbVar5 = (bin_tree_storage_t *)malloc(0x3c8);\n    if (pbVar5 == (bin_tree_storage_t *)0x0) {\n      return (bin_tree_t *)0x0;\n    }\n    pbVar5->next = dfa->str_tree_storage;\n    dfa->str_tree_storage = pbVar5;\n    dfa->str_tree_storage_idx = L'\0';\n  }" if (parenthesized_expression "(dfa->str_tree_storage_idx == L'\x0f')" ( (binary_expression "dfa->str_tree_storage_idx == L'\x0f'" (field_expression "dfa->str_tree_storage_idx" identifier -> field_identifier) == (char_literal "L'\x0f'" L' escape_sequence ')) )) (compound_statement "{\n    pbVar5 = (bin_tree_storage_t *)malloc(0x3c8);\n    if (pbVar5 == (bin_tree_storage_t *)0x0) {\n      return (bin_tree_t *)0x0;\n    }\n    pbVar5->next = dfa->str_tree_storage;\n    dfa->str_tree_storage = pbVar5;\n    dfa->str_tree_storage_idx = L'\0';\n  }" { (expression_statement "pbVar5 = (bin_tree_storage_t *)malloc(0x3c8);" (assignment_expression "pbVar5 = (bin_tree_storage_t *)malloc(0x3c8)" identifier = (cast_expression "(bin_tree_storage_t *)malloc(0x3c8)" ( (type_descriptor "bin_tree_storage_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "malloc(0x3c8)" identifier (argument_list "(0x3c8)" ( number_literal ))))) ;) (if_statement "if (pbVar5 == (bin_tree_storage_t *)0x0) {\n      return (bin_tree_t *)0x0;\n    }" if (parenthesized_expression "(pbVar5 == (bin_tree_storage_t *)0x0)" ( (binary_expression "pbVar5 == (bin_tree_storage_t *)0x0" identifier == (cast_expression "(bin_tree_storage_t *)0x0" ( (type_descriptor "bin_tree_storage_t *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n      return (bin_tree_t *)0x0;\n    }" { (return_statement "return (bin_tree_t *)0x0;" return (cast_expression "(bin_tree_t *)0x0" ( (type_descriptor "bin_tree_t *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal) ;) })) (expression_statement "pbVar5->next = dfa->str_tree_storage;" (assignment_expression "pbVar5->next = dfa->str_tree_storage" (field_expression "pbVar5->next" identifier -> field_identifier) = (field_expression "dfa->str_tree_storage" identifier -> field_identifier)) ;) (expression_statement "dfa->str_tree_storage = pbVar5;" (assignment_expression "dfa->str_tree_storage = pbVar5" (field_expression "dfa->str_tree_storage" identifier -> field_identifier) = identifier) ;) (expression_statement "dfa->str_tree_storage_idx = L'\0';" (assignment_expression "dfa->str_tree_storage_idx = L'\0'" (field_expression "dfa->str_tree_storage_idx" identifier -> field_identifier) = (char_literal "L'\0'" L' escape_sequence ')) ;) })) (expression_statement "pbVar5 = dfa->str_tree_storage;" (assignment_expression "pbVar5 = dfa->str_tree_storage" identifier = (field_expression "dfa->str_tree_storage" identifier -> field_identifier)) ;) (expression_statement "wVar3 = dfa->str_tree_storage_idx;" (assignment_expression "wVar3 = dfa->str_tree_storage_idx" identifier = (field_expression "dfa->str_tree_storage_idx" identifier -> field_identifier)) ;) (expression_statement "dfa->str_tree_storage_idx = wVar3 + L'\x01';" (assignment_expression "dfa->str_tree_storage_idx = wVar3 + L'\x01'" (field_expression "dfa->str_tree_storage_idx" identifier -> field_identifier) = (binary_expression "wVar3 + L'\x01'" identifier + (char_literal "L'\x01'" L' escape_sequence '))) ;) (expression_statement "pbVar2 = pbVar5->data + wVar3;" (assignment_expression "pbVar2 = pbVar5->data + wVar3" identifier = (binary_expression "pbVar5->data + wVar3" (field_expression "pbVar5->data" identifier -> field_identifier) + identifier)) ;) (expression_statement "pbVar5->data[wVar3].parent = (bin_tree_t *)0x0;" (assignment_expression "pbVar5->data[wVar3].parent = (bin_tree_t *)0x0" (field_expression "pbVar5->data[wVar3].parent" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) = (cast_expression "(bin_tree_t *)0x0" ( (type_descriptor "bin_tree_t *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "pbVar5->data[wVar3].left = left;" (assignment_expression "pbVar5->data[wVar3].left = left" (field_expression "pbVar5->data[wVar3].left" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) = identifier) ;) (expression_statement "pbVar5->data[wVar3].right = right;" (assignment_expression "pbVar5->data[wVar3].right = right" (field_expression "pbVar5->data[wVar3].right" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) = identifier) ;) (expression_statement "uVar4 = *(undefined8 *)&token->field_0x8;" (assignment_expression "uVar4 = *(undefined8 *)&token->field_0x8" identifier = (pointer_expression "*(undefined8 *)&token->field_0x8" * (cast_expression "(undefined8 *)&token->field_0x8" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "&token->field_0x8" & (field_expression "token->field_0x8" identifier -> field_identifier))))) ;) (expression_statement "pbVar5->data[wVar3].token.opr = token->opr;" (assignment_expression "pbVar5->data[wVar3].token.opr = token->opr" (field_expression "pbVar5->data[wVar3].token.opr" (field_expression "pbVar5->data[wVar3].token" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) . field_identifier) = (field_expression "token->opr" identifier -> field_identifier)) ;) (expression_statement "*(undefined8 *)&pbVar5->data[wVar3].token.field_0x8 = uVar4;" (assignment_expression "*(undefined8 *)&pbVar5->data[wVar3].token.field_0x8 = uVar4" (pointer_expression "*(undefined8 *)&pbVar5->data[wVar3].token.field_0x8" * (cast_expression "(undefined8 *)&pbVar5->data[wVar3].token.field_0x8" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "&pbVar5->data[wVar3].token.field_0x8" & (field_expression "pbVar5->data[wVar3].token.field_0x8" (field_expression "pbVar5->data[wVar3].token" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) . field_identifier)))) = identifier) ;) (expression_statement "puVar1 = &pbVar5->data[wVar3].token.field_0xa;" (assignment_expression "puVar1 = &pbVar5->data[wVar3].token.field_0xa" identifier = (pointer_expression "&pbVar5->data[wVar3].token.field_0xa" & (field_expression "pbVar5->data[wVar3].token.field_0xa" (field_expression "pbVar5->data[wVar3].token" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) . field_identifier))) ;) (expression_statement "*puVar1 = *puVar1 & 0xf3;" (assignment_expression "*puVar1 = *puVar1 & 0xf3" (pointer_expression "*puVar1" * identifier) = (binary_expression "*puVar1 & 0xf3" (pointer_expression "*puVar1" * identifier) & number_literal)) ;) (expression_statement "pbVar5->data[wVar3].first = (bin_tree_t *)0x0;" (assignment_expression "pbVar5->data[wVar3].first = (bin_tree_t *)0x0" (field_expression "pbVar5->data[wVar3].first" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) = (cast_expression "(bin_tree_t *)0x0" ( (type_descriptor "bin_tree_t *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "pbVar5->data[wVar3].next = (bin_tree_t *)0x0;" (assignment_expression "pbVar5->data[wVar3].next = (bin_tree_t *)0x0" (field_expression "pbVar5->data[wVar3].next" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) = (cast_expression "(bin_tree_t *)0x0" ( (type_descriptor "bin_tree_t *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) (expression_statement "pbVar5->data[wVar3].node_idx = -1;" (assignment_expression "pbVar5->data[wVar3].node_idx = -1" (field_expression "pbVar5->data[wVar3].node_idx" (subscript_expression "pbVar5->data[wVar3]" (field_expression "pbVar5->data" identifier -> field_identifier) [ identifier ]) . field_identifier) = number_literal) ;) (if_statement "if (left != (bin_tree_t *)0x0) {\n    left->parent = pbVar2;\n  }" if (parenthesized_expression "(left != (bin_tree_t *)0x0)" ( (binary_expression "left != (bin_tree_t *)0x0" identifier != (cast_expression "(bin_tree_t *)0x0" ( (type_descriptor "bin_tree_t *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    left->parent = pbVar2;\n  }" { (expression_statement "left->parent = pbVar2;" (assignment_expression "left->parent = pbVar2" (field_expression "left->parent" identifier -> field_identifier) = identifier) ;) })) (if_statement "if (right != (bin_tree_t *)0x0) {\n    right->parent = pbVar2;\n  }" if (parenthesized_expression "(right != (bin_tree_t *)0x0)" ( (binary_expression "right != (bin_tree_t *)0x0" identifier != (cast_expression "(bin_tree_t *)0x0" ( (type_descriptor "bin_tree_t *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    right->parent = pbVar2;\n  }" { (expression_statement "right->parent = pbVar2;" (assignment_expression "right->parent = pbVar2" (field_expression "right->parent" identifier -> field_identifier) = identifier) ;) })) (return_statement "return pbVar2;" return identifier ;) })))
(translation_unit "long FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)\n\n{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}\n\n" (function_definition "long FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)\n\n{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}" (sized_type_specifier "long" long) (function_declarator "FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)" identifier (parameter_list "(long param_1,long *param_2,long *param_3,undefined8 *param_4)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long *param_2" (sized_type_specifier "long" long) (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "undefined8 *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) ))) (compound_statement "{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "undefined8 uVar3;" type_identifier identifier ;) (declaration "undefined8 *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "long lVar5;" (sized_type_specifier "long" long) identifier ;) (if_statement "if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }" if (parenthesized_expression "(*(int *)(param_1 + 0x80) == 0xf)" ( (binary_expression "*(int *)(param_1 + 0x80) == 0xf" (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) == number_literal) )) (compound_statement "{\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }" { (expression_statement "puVar4 = (undefined8 *)malloc(0x3c8);" (assignment_expression "puVar4 = (undefined8 *)malloc(0x3c8)" identifier = (cast_expression "(undefined8 *)malloc(0x3c8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "malloc(0x3c8)" identifier (argument_list "(0x3c8)" ( number_literal ))))) ;) (if_statement "if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }" if (parenthesized_expression "(puVar4 == (undefined8 *)0x0)" ( (binary_expression "puVar4 == (undefined8 *)0x0" identifier == (cast_expression "(undefined8 *)0x0" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n      return 0;\n    }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "*puVar4 = *(undefined8 *)(param_1 + 0x70);" (assignment_expression "*puVar4 = *(undefined8 *)(param_1 + 0x70)" (pointer_expression "*puVar4" * identifier) = (pointer_expression "*(undefined8 *)(param_1 + 0x70)" * (cast_expression "(undefined8 *)(param_1 + 0x70)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) ))))) ;) (expression_statement "*(undefined8 **)(param_1 + 0x70) = puVar4;" (assignment_expression "*(undefined8 **)(param_1 + 0x70) = puVar4" (pointer_expression "*(undefined8 **)(param_1 + 0x70)" * (cast_expression "(undefined8 **)(param_1 + 0x70)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) )))) = identifier) ;) (expression_statement "*(undefined4 *)(param_1 + 0x80) = 0;" (assignment_expression "*(undefined4 *)(param_1 + 0x80) = 0" (pointer_expression "*(undefined4 *)(param_1 + 0x80)" * (cast_expression "(undefined4 *)(param_1 + 0x80)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) = number_literal) ;) })) (expression_statement "iVar2 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar2 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (expression_statement "*(int *)(param_1 + 0x80) = iVar2 + 1;" (assignment_expression "*(int *)(param_1 + 0x80) = iVar2 + 1" (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) = (binary_expression "iVar2 + 1" identifier + number_literal)) ;) (expression_statement "lVar5 = (long)iVar2 * 0x40;" (assignment_expression "lVar5 = (long)iVar2 * 0x40" identifier = (binary_expression "(long)iVar2 * 0x40" (cast_expression "(long)iVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) * number_literal)) ;) (expression_statement "lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;" (assignment_expression "lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5" identifier = (binary_expression "*(long *)(param_1 + 0x70) + 8 + lVar5" (binary_expression "*(long *)(param_1 + 0x70) + 8" (pointer_expression "*(long *)(param_1 + 0x70)" * (cast_expression "(long *)(param_1 + 0x70)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) )))) + number_literal) + identifier)) ;) (expression_statement "lVar5 = lVar5 + *(long *)(param_1 + 0x70);" (assignment_expression "lVar5 = lVar5 + *(long *)(param_1 + 0x70)" identifier = (binary_expression "lVar5 + *(long *)(param_1 + 0x70)" identifier + (pointer_expression "*(long *)(param_1 + 0x70)" * (cast_expression "(long *)(param_1 + 0x70)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x70)" ( (binary_expression "param_1 + 0x70" identifier + number_literal) )))))) ;) (expression_statement "*(undefined8 *)(lVar5 + 8) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 8) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 8)" * (cast_expression "(undefined8 *)(lVar5 + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 8)" ( (binary_expression "lVar5 + 8" identifier + number_literal) )))) = number_literal) ;) (expression_statement "*(long **)(lVar5 + 0x10) = param_2;" (assignment_expression "*(long **)(lVar5 + 0x10) = param_2" (pointer_expression "*(long **)(lVar5 + 0x10)" * (cast_expression "(long **)(lVar5 + 0x10)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(lVar5 + 0x10)" ( (binary_expression "lVar5 + 0x10" identifier + number_literal) )))) = identifier) ;) (expression_statement "*(long **)(lVar5 + 0x18) = param_3;" (assignment_expression "*(long **)(lVar5 + 0x18) = param_3" (pointer_expression "*(long **)(lVar5 + 0x18)" * (cast_expression "(long **)(lVar5 + 0x18)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(lVar5 + 0x18)" ( (binary_expression "lVar5 + 0x18" identifier + number_literal) )))) = identifier) ;) (expression_statement "uVar3 = param_4[1];" (assignment_expression "uVar3 = param_4[1]" identifier = (subscript_expression "param_4[1]" identifier [ number_literal ])) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x30) = *param_4;" (assignment_expression "*(undefined8 *)(lVar5 + 0x30) = *param_4" (pointer_expression "*(undefined8 *)(lVar5 + 0x30)" * (cast_expression "(undefined8 *)(lVar5 + 0x30)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x30)" ( (binary_expression "lVar5 + 0x30" identifier + number_literal) )))) = (pointer_expression "*param_4" * identifier)) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x38) = uVar3;" (assignment_expression "*(undefined8 *)(lVar5 + 0x38) = uVar3" (pointer_expression "*(undefined8 *)(lVar5 + 0x38)" * (cast_expression "(undefined8 *)(lVar5 + 0x38)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x38)" ( (binary_expression "lVar5 + 0x38" identifier + number_literal) )))) = identifier) ;) (expression_statement "*(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;" (assignment_expression "*(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3" (pointer_expression "*(byte *)(lVar5 + 0x3a)" * (cast_expression "(byte *)(lVar5 + 0x3a)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x3a)" ( (binary_expression "lVar5 + 0x3a" identifier + number_literal) )))) = (binary_expression "*(byte *)(lVar5 + 0x3a) & 0xf3" (pointer_expression "*(byte *)(lVar5 + 0x3a)" * (cast_expression "(byte *)(lVar5 + 0x3a)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x3a)" ( (binary_expression "lVar5 + 0x3a" identifier + number_literal) )))) & number_literal)) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x20) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 0x20) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 0x20)" * (cast_expression "(undefined8 *)(lVar5 + 0x20)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x20)" ( (binary_expression "lVar5 + 0x20" identifier + number_literal) )))) = number_literal) ;) (expression_statement "*(undefined8 *)(lVar5 + 0x28) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 0x28) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 0x28)" * (cast_expression "(undefined8 *)(lVar5 + 0x28)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x28)" ( (binary_expression "lVar5 + 0x28" identifier + number_literal) )))) = number_literal) ;) (expression_statement "*(undefined4 *)(lVar5 + 0x40) = 0xffffffff;" (assignment_expression "*(undefined4 *)(lVar5 + 0x40) = 0xffffffff" (pointer_expression "*(undefined4 *)(lVar5 + 0x40)" * (cast_expression "(undefined4 *)(lVar5 + 0x40)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar5 + 0x40)" ( (binary_expression "lVar5 + 0x40" identifier + number_literal) )))) = number_literal) ;) (if_statement "if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }" if (parenthesized_expression "(param_2 != (long *)0x0)" ( (binary_expression "param_2 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_2 = lVar1;\n  }" { (expression_statement "*param_2 = lVar1;" (assignment_expression "*param_2 = lVar1" (pointer_expression "*param_2" * identifier) = identifier) ;) })) (if_statement "if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }" if (parenthesized_expression "(param_3 != (long *)0x0)" ( (binary_expression "param_3 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_3 = lVar1;\n  }" { (expression_statement "*param_3 = lVar1;" (assignment_expression "*param_3 = lVar1" (pointer_expression "*param_3" * identifier) = identifier) ;) })) (return_statement "return lVar1;" return identifier ;) })))
(translation_unit (function_definition (sized_type_specifier long) (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) IDENT) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) ))) (compound_statement { (declaration (sized_type_specifier long) IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration (sized_type_specifier long) IDENT ;) (if_statement if (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression IDENT (argument_list ( LIT ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (return_statement return LIT ;) })) (expression_statement (assignment_expression (pointer_expression * IDENT) = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = IDENT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) * LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) + LIT) + IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))))) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = IDENT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = IDENT) ;) (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = IDENT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) & LIT)) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) })) (return_statement return IDENT ;) })))
(function_definition "long FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)\n\n{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}" (sized_type_specifier "long" (long "long")) (function_declarator "FUN_0016a5d0(long param_1,long *param_2,long *param_3,undefined8 *param_4)" (identifier "FUN_0016a5d0") (parameter_list "(long param_1,long *param_2,long *param_3,undefined8 *param_4)" (( "(") (parameter_declaration "long param_1" (sized_type_specifier "long" (long "long")) (identifier "param_1")) (, ",") (parameter_declaration "long *param_2" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) (, ",") (parameter_declaration "long *param_3" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_3" (* "*") (identifier "param_3"))) (, ",") (parameter_declaration "undefined8 *param_4" (type_identifier "undefined8") (pointer_declarator "*param_4" (* "*") (identifier "param_4"))) () ")"))) (compound_statement "{\n  long lVar1;\n  int iVar2;\n  undefined8 uVar3;\n  undefined8 *puVar4;\n  long lVar5;\n  \n  if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }\n  iVar2 = *(int *)(param_1 + 0x80);\n  *(int *)(param_1 + 0x80) = iVar2 + 1;\n  lVar5 = (long)iVar2 * 0x40;\n  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;\n  lVar5 = lVar5 + *(long *)(param_1 + 0x70);\n  *(undefined8 *)(lVar5 + 8) = 0;\n  *(long **)(lVar5 + 0x10) = param_2;\n  *(long **)(lVar5 + 0x18) = param_3;\n  uVar3 = param_4[1];\n  *(undefined8 *)(lVar5 + 0x30) = *param_4;\n  *(undefined8 *)(lVar5 + 0x38) = uVar3;\n  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;\n  *(undefined8 *)(lVar5 + 0x20) = 0;\n  *(undefined8 *)(lVar5 + 0x28) = 0;\n  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;\n  if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }\n  if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }\n  return lVar1;\n}" ({ "{") (declaration "long lVar1;" (sized_type_specifier "long" (long "long")) (identifier "lVar1") (; ";")) (declaration "int iVar2;" (primitive_type "int") (identifier "iVar2") (; ";")) (declaration "undefined8 uVar3;" (type_identifier "undefined8") (identifier "uVar3") (; ";")) (declaration "undefined8 *puVar4;" (type_identifier "undefined8") (pointer_declarator "*puVar4" (* "*") (identifier "puVar4")) (; ";")) (declaration "long lVar5;" (sized_type_specifier "long" (long "long")) (identifier "lVar5") (; ";")) (if_statement "if (*(int *)(param_1 + 0x80) == 0xf) {\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }" (if "if") (parenthesized_expression "(*(int *)(param_1 + 0x80) == 0xf)" (( "(") (binary_expression "*(int *)(param_1 + 0x80) == 0xf" (pointer_expression "*(int *)(param_1 + 0x80)" (* "*") (cast_expression "(int *)(param_1 + 0x80)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")")))) (== "==") (number_literal "0xf")) () ")")) (compound_statement "{\n    puVar4 = (undefined8 *)malloc(0x3c8);\n    if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }\n    *puVar4 = *(undefined8 *)(param_1 + 0x70);\n    *(undefined8 **)(param_1 + 0x70) = puVar4;\n    *(undefined4 *)(param_1 + 0x80) = 0;\n  }" ({ "{") (expression_statement "puVar4 = (undefined8 *)malloc(0x3c8);" (assignment_expression "puVar4 = (undefined8 *)malloc(0x3c8)" (identifier "puVar4") (= "=") (cast_expression "(undefined8 *)malloc(0x3c8)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "malloc(0x3c8)" (identifier "malloc") (argument_list "(0x3c8)" (( "(") (number_literal "0x3c8") () ")"))))) (; ";")) (if_statement "if (puVar4 == (undefined8 *)0x0) {\n      return 0;\n    }" (if "if") (parenthesized_expression "(puVar4 == (undefined8 *)0x0)" (( "(") (binary_expression "puVar4 == (undefined8 *)0x0" (identifier "puVar4") (== "==") (cast_expression "(undefined8 *)0x0" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n      return 0;\n    }" ({ "{") (return_statement "return 0;" (return "return") (number_literal "0") (; ";")) (} "}"))) (expression_statement "*puVar4 = *(undefined8 *)(param_1 + 0x70);" (assignment_expression "*puVar4 = *(undefined8 *)(param_1 + 0x70)" (pointer_expression "*puVar4" (* "*") (identifier "puVar4")) (= "=") (pointer_expression "*(undefined8 *)(param_1 + 0x70)" (* "*") (cast_expression "(undefined8 *)(param_1 + 0x70)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x70)" (( "(") (binary_expression "param_1 + 0x70" (identifier "param_1") (+ "+") (number_literal "0x70")) () ")"))))) (; ";")) (expression_statement "*(undefined8 **)(param_1 + 0x70) = puVar4;" (assignment_expression "*(undefined8 **)(param_1 + 0x70) = puVar4" (pointer_expression "*(undefined8 **)(param_1 + 0x70)" (* "*") (cast_expression "(undefined8 **)(param_1 + 0x70)" (( "(") (type_descriptor "undefined8 **" (type_identifier "undefined8") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 0x70)" (( "(") (binary_expression "param_1 + 0x70" (identifier "param_1") (+ "+") (number_literal "0x70")) () ")")))) (= "=") (identifier "puVar4")) (; ";")) (expression_statement "*(undefined4 *)(param_1 + 0x80) = 0;" (assignment_expression "*(undefined4 *)(param_1 + 0x80) = 0" (pointer_expression "*(undefined4 *)(param_1 + 0x80)" (* "*") (cast_expression "(undefined4 *)(param_1 + 0x80)" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")")))) (= "=") (number_literal "0")) (; ";")) (} "}"))) (expression_statement "iVar2 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar2 = *(int *)(param_1 + 0x80)" (identifier "iVar2") (= "=") (pointer_expression "*(int *)(param_1 + 0x80)" (* "*") (cast_expression "(int *)(param_1 + 0x80)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")"))))) (; ";")) (expression_statement "*(int *)(param_1 + 0x80) = iVar2 + 1;" (assignment_expression "*(int *)(param_1 + 0x80) = iVar2 + 1" (pointer_expression "*(int *)(param_1 + 0x80)" (* "*") (cast_expression "(int *)(param_1 + 0x80)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")")))) (= "=") (binary_expression "iVar2 + 1" (identifier "iVar2") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "lVar5 = (long)iVar2 * 0x40;" (assignment_expression "lVar5 = (long)iVar2 * 0x40" (identifier "lVar5") (= "=") (binary_expression "(long)iVar2 * 0x40" (cast_expression "(long)iVar2" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "iVar2")) (* "*") (number_literal "0x40"))) (; ";")) (expression_statement "lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;" (assignment_expression "lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5" (identifier "lVar1") (= "=") (binary_expression "*(long *)(param_1 + 0x70) + 8 + lVar5" (binary_expression "*(long *)(param_1 + 0x70) + 8" (pointer_expression "*(long *)(param_1 + 0x70)" (* "*") (cast_expression "(long *)(param_1 + 0x70)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x70)" (( "(") (binary_expression "param_1 + 0x70" (identifier "param_1") (+ "+") (number_literal "0x70")) () ")")))) (+ "+") (number_literal "8")) (+ "+") (identifier "lVar5"))) (; ";")) (expression_statement "lVar5 = lVar5 + *(long *)(param_1 + 0x70);" (assignment_expression "lVar5 = lVar5 + *(long *)(param_1 + 0x70)" (identifier "lVar5") (= "=") (binary_expression "lVar5 + *(long *)(param_1 + 0x70)" (identifier "lVar5") (+ "+") (pointer_expression "*(long *)(param_1 + 0x70)" (* "*") (cast_expression "(long *)(param_1 + 0x70)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x70)" (( "(") (binary_expression "param_1 + 0x70" (identifier "param_1") (+ "+") (number_literal "0x70")) () ")")))))) (; ";")) (expression_statement "*(undefined8 *)(lVar5 + 8) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 8) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 8)" (* "*") (cast_expression "(undefined8 *)(lVar5 + 8)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 8)" (( "(") (binary_expression "lVar5 + 8" (identifier "lVar5") (+ "+") (number_literal "8")) () ")")))) (= "=") (number_literal "0")) (; ";")) (expression_statement "*(long **)(lVar5 + 0x10) = param_2;" (assignment_expression "*(long **)(lVar5 + 0x10) = param_2" (pointer_expression "*(long **)(lVar5 + 0x10)" (* "*") (cast_expression "(long **)(lVar5 + 0x10)" (( "(") (type_descriptor "long **" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(lVar5 + 0x10)" (( "(") (binary_expression "lVar5 + 0x10" (identifier "lVar5") (+ "+") (number_literal "0x10")) () ")")))) (= "=") (identifier "param_2")) (; ";")) (expression_statement "*(long **)(lVar5 + 0x18) = param_3;" (assignment_expression "*(long **)(lVar5 + 0x18) = param_3" (pointer_expression "*(long **)(lVar5 + 0x18)" (* "*") (cast_expression "(long **)(lVar5 + 0x18)" (( "(") (type_descriptor "long **" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(lVar5 + 0x18)" (( "(") (binary_expression "lVar5 + 0x18" (identifier "lVar5") (+ "+") (number_literal "0x18")) () ")")))) (= "=") (identifier "param_3")) (; ";")) (expression_statement "uVar3 = param_4[1];" (assignment_expression "uVar3 = param_4[1]" (identifier "uVar3") (= "=") (subscript_expression "param_4[1]" (identifier "param_4") ([ "[") (number_literal "1") (] "]"))) (; ";")) (expression_statement "*(undefined8 *)(lVar5 + 0x30) = *param_4;" (assignment_expression "*(undefined8 *)(lVar5 + 0x30) = *param_4" (pointer_expression "*(undefined8 *)(lVar5 + 0x30)" (* "*") (cast_expression "(undefined8 *)(lVar5 + 0x30)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 0x30)" (( "(") (binary_expression "lVar5 + 0x30" (identifier "lVar5") (+ "+") (number_literal "0x30")) () ")")))) (= "=") (pointer_expression "*param_4" (* "*") (identifier "param_4"))) (; ";")) (expression_statement "*(undefined8 *)(lVar5 + 0x38) = uVar3;" (assignment_expression "*(undefined8 *)(lVar5 + 0x38) = uVar3" (pointer_expression "*(undefined8 *)(lVar5 + 0x38)" (* "*") (cast_expression "(undefined8 *)(lVar5 + 0x38)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 0x38)" (( "(") (binary_expression "lVar5 + 0x38" (identifier "lVar5") (+ "+") (number_literal "0x38")) () ")")))) (= "=") (identifier "uVar3")) (; ";")) (expression_statement "*(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;" (assignment_expression "*(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3" (pointer_expression "*(byte *)(lVar5 + 0x3a)" (* "*") (cast_expression "(byte *)(lVar5 + 0x3a)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 0x3a)" (( "(") (binary_expression "lVar5 + 0x3a" (identifier "lVar5") (+ "+") (number_literal "0x3a")) () ")")))) (= "=") (binary_expression "*(byte *)(lVar5 + 0x3a) & 0xf3" (pointer_expression "*(byte *)(lVar5 + 0x3a)" (* "*") (cast_expression "(byte *)(lVar5 + 0x3a)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 0x3a)" (( "(") (binary_expression "lVar5 + 0x3a" (identifier "lVar5") (+ "+") (number_literal "0x3a")) () ")")))) (& "&") (number_literal "0xf3"))) (; ";")) (expression_statement "*(undefined8 *)(lVar5 + 0x20) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 0x20) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 0x20)" (* "*") (cast_expression "(undefined8 *)(lVar5 + 0x20)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 0x20)" (( "(") (binary_expression "lVar5 + 0x20" (identifier "lVar5") (+ "+") (number_literal "0x20")) () ")")))) (= "=") (number_literal "0")) (; ";")) (expression_statement "*(undefined8 *)(lVar5 + 0x28) = 0;" (assignment_expression "*(undefined8 *)(lVar5 + 0x28) = 0" (pointer_expression "*(undefined8 *)(lVar5 + 0x28)" (* "*") (cast_expression "(undefined8 *)(lVar5 + 0x28)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 0x28)" (( "(") (binary_expression "lVar5 + 0x28" (identifier "lVar5") (+ "+") (number_literal "0x28")) () ")")))) (= "=") (number_literal "0")) (; ";")) (expression_statement "*(undefined4 *)(lVar5 + 0x40) = 0xffffffff;" (assignment_expression "*(undefined4 *)(lVar5 + 0x40) = 0xffffffff" (pointer_expression "*(undefined4 *)(lVar5 + 0x40)" (* "*") (cast_expression "(undefined4 *)(lVar5 + 0x40)" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar5 + 0x40)" (( "(") (binary_expression "lVar5 + 0x40" (identifier "lVar5") (+ "+") (number_literal "0x40")) () ")")))) (= "=") (number_literal "0xffffffff")) (; ";")) (if_statement "if (param_2 != (long *)0x0) {\n    *param_2 = lVar1;\n  }" (if "if") (parenthesized_expression "(param_2 != (long *)0x0)" (( "(") (binary_expression "param_2 != (long *)0x0" (identifier "param_2") (!= "!=") (cast_expression "(long *)0x0" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    *param_2 = lVar1;\n  }" ({ "{") (expression_statement "*param_2 = lVar1;" (assignment_expression "*param_2 = lVar1" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (= "=") (identifier "lVar1")) (; ";")) (} "}"))) (if_statement "if (param_3 != (long *)0x0) {\n    *param_3 = lVar1;\n  }" (if "if") (parenthesized_expression "(param_3 != (long *)0x0)" (( "(") (binary_expression "param_3 != (long *)0x0" (identifier "param_3") (!= "!=") (cast_expression "(long *)0x0" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    *param_3 = lVar1;\n  }" ({ "{") (expression_statement "*param_3 = lVar1;" (assignment_expression "*param_3 = lVar1" (pointer_expression "*param_3" (* "*") (identifier "param_3")) (= "=") (identifier "lVar1")) (; ";")) (} "}"))) (return_statement "return lVar1;" (return "return") (identifier "lVar1") (; ";")) (} "}")))

type_1 * function_1(type_2 *dfa,type_1 *var_4,type_1 *var_5,type_3 *token)

{
  type_4 *puVar1;
  type_1 *pbVar2;
  type_5 var_3;
  type_6 uVar4;
  type_7 *var_2;
  
  if (dfa->str_tree_storage_idx == L'\x0f') {
    var_2 = (type_7 *)var_1(0x3c8);
    if (var_2 == (type_7 *)0x0) {
      return (type_1 *)0x0;
    }
    var_2->next = dfa->str_tree_storage;
    dfa->str_tree_storage = var_2;
    dfa->str_tree_storage_idx = L'\0';
  }
  var_2 = dfa->str_tree_storage;
  var_3 = dfa->str_tree_storage_idx;
  dfa->str_tree_storage_idx = var_3 + L'\x01';
  pbVar2 = var_2->data + var_3;
  var_2->data[var_3].parent = (type_1 *)0x0;
  var_2->data[var_3].var_4 = var_4;
  var_2->data[var_3].var_5 = var_5;
  uVar4 = *(type_6 *)&token->field_0x8;
  var_2->data[var_3].token.opr = token->opr;
  *(type_6 *)&var_2->data[var_3].token.field_0x8 = uVar4;
  puVar1 = &var_2->data[var_3].token.field_0xa;
  *puVar1 = *puVar1 & 0xf3;
  var_2->data[var_3].first = (type_1 *)0x0;
  var_2->data[var_3].next = (type_1 *)0x0;
  var_2->data[var_3].node_idx = -1;
  if (var_4 != (type_1 *)0x0) {
    var_4->parent = pbVar2;
  }
  if (var_5 != (type_1 *)0x0) {
    var_5->parent = pbVar2;
  }
  return pbVar2;
}


(translation_unit (function_definition type: (sized_type_specifier) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (sized_type_specifier) declarator: (identifier)) (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))))) body: (compound_statement (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (sized_type_specifier) declarator: (identifier)) (if_statement condition: (parenthesized_expression (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (call_expression function: (identifier) arguments: (argument_list (number_literal)))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (return_statement (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (identifier))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal)) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (identifier))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (identifier))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))))) (return_statement (identifier)))))

long MASKED(long param_1,long *param_2,long *param_3,undefined8 *param_4)

{
  long lVar1;
  int iVar2;
  undefined8 uVar3;
  undefined8 *puVar4;
  long lVar5;
  
  if (*(int *)(param_1 + 0x80) == 0xf) {
    puVar4 = (undefined8 *)malloc(0x3c8);
    if (puVar4 == (undefined8 *)0x0) {
      return 0;
    }
    *puVar4 = *(undefined8 *)(param_1 + 0x70);
    *(undefined8 **)(param_1 + 0x70) = puVar4;
    *(undefined4 *)(param_1 + 0x80) = 0;
  }
  iVar2 = *(int *)(param_1 + 0x80);
  *(int *)(param_1 + 0x80) = iVar2 + 1;
  lVar5 = (long)iVar2 * 0x40;
  lVar1 = *(long *)(param_1 + 0x70) + 8 + lVar5;
  lVar5 = lVar5 + *(long *)(param_1 + 0x70);
  *(undefined8 *)(lVar5 + 8) = 0;
  *(long **)(lVar5 + 0x10) = param_2;
  *(long **)(lVar5 + 0x18) = param_3;
  uVar3 = param_4[1];
  *(undefined8 *)(lVar5 + 0x30) = *param_4;
  *(undefined8 *)(lVar5 + 0x38) = uVar3;
  *(byte *)(lVar5 + 0x3a) = *(byte *)(lVar5 + 0x3a) & 0xf3;
  *(undefined8 *)(lVar5 + 0x20) = 0;
  *(undefined8 *)(lVar5 + 0x28) = 0;
  *(undefined4 *)(lVar5 + 0x40) = 0xffffffff;
  if (param_2 != (long *)0x0) {
    *param_2 = lVar1;
  }
  if (param_3 != (long *)0x0) {
    *param_3 = lVar1;
  }
  return lVar1;
}

