
ulong concat_length(char *first,...)

{
  size_t sVar1;
  ulong uVar2;
  undefined8 in_RCX;
  undefined8 in_RDX;
  ulong uVar3;
  undefined8 in_RSI;
  undefined8 in_R8;
  undefined8 in_R9;
  va_list args;
  long local_48 [4];
  undefined8 local_28;
  undefined8 local_20;
  
  args[0].overflow_arg_area = &stack0x00000008;
  args[0].gp_offset = 8;
  if (first == (char *)0x0) {
    return 0;
  }
  uVar3 = 0;
  local_48[1] = in_RSI;
  local_48[2] = in_RDX;
  local_48[3] = in_RCX;
  local_28 = in_R8;
  local_20 = in_R9;
  do {
    while( true ) {
      sVar1 = strlen(first);
      uVar3 = uVar3 + sVar1;
      uVar2 = (ulong)args[0].gp_offset;
      if (0x2f < args[0].gp_offset) break;
      args[0].gp_offset = args[0].gp_offset + 8;
      first = *(char **)((long)local_48 + uVar2);
      if (first == (char *)0x0) {
        return uVar3;
      }
    }
                    /* WARNING: Load size is inaccurate */
    first = *args[0].overflow_arg_area;
    args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);
  } while (first != (char *)0x0);
  return uVar3;
}



long FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,
                 undefined8 param_5,undefined8 param_6)

{
  size_t sVar1;
  ulong uVar2;
  long lVar3;
  uint local_60;
  long *local_58;
  long local_48 [4];
  undefined8 local_28;
  undefined8 local_20;
  
  local_58 = (long *)&stack0x00000008;
  local_60 = 8;
  if (param_1 == (char *)0x0) {
    return 0;
  }
  lVar3 = 0;
  local_48[1] = param_2;
  local_48[2] = param_3;
  local_48[3] = param_4;
  local_28 = param_5;
  local_20 = param_6;
  do {
    while( true ) {
      sVar1 = strlen(param_1);
      lVar3 = lVar3 + sVar1;
      uVar2 = (ulong)local_60;
      if (0x2f < local_60) break;
      local_60 = local_60 + 8;
      param_1 = *(char **)((long)local_48 + uVar2);
      if (param_1 == (char *)0x0) {
        return lVar3;
      }
    }
    param_1 = (char *)*local_58;
    local_58 = local_58 + 1;
  } while (param_1 != (char *)0x0);
  return lVar3;
}


PUSH RBP
PUSH RBX
SUB RSP,0x58
LEA RAX,[RSP + 0x70]
MOV qword ptr [RSP + 0x28],RSI
MOV qword ptr [RSP + 0x10],RAX
LEA RAX,[RSP + 0x20]
MOV qword ptr [RSP + 0x30],RDX
MOV qword ptr [RSP + 0x38],RCX
MOV qword ptr [RSP + 0x40],R8
MOV qword ptr [RSP + 0x48],R9
MOV dword ptr [RSP + 0x8],0x8
MOV qword ptr [RSP + 0x18],RAX
TEST RDI,RDI
JZ 0x00156678
MOV RBP,RAX
XOR EBX,EBX
JMP 0x00156644
MOV EDX,EAX
ADD EAX,0x8
ADD RDX,RBP
MOV dword ptr [RSP + 0x8],EAX
MOV RDI,qword ptr [RDX]
TEST RDI,RDI
JZ 0x0015666b
CALL 0x00107150
ADD RBX,RAX
MOV EAX,dword ptr [RSP + 0x8]
CMP EAX,0x2f
JBE 0x00156630
MOV RDX,qword ptr [RSP + 0x10]
MOV RDI,qword ptr [RDX]
LEA RAX,[RDX + 0x8]
MOV qword ptr [RSP + 0x10],RAX
TEST RDI,RDI
JNZ 0x00156644
ADD RSP,0x58
MOV RAX,RBX
POP RBX
POP RBP
RET
XOR EBX,EBX
ADD RSP,0x58
MOV RAX,RBX
POP RBX
POP RBP
RET
(translation_unit "long FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)\n\n{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}\n\n" (function_definition "long FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)\n\n{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}" (sized_type_specifier "long" long) (function_declarator "FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)" identifier (parameter_list "(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)" ( (parameter_declaration "char *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "undefined8 param_2" type_identifier identifier) , (parameter_declaration "undefined8 param_3" type_identifier identifier) , (parameter_declaration "undefined8 param_4" type_identifier identifier) , (parameter_declaration "undefined8 param_5" type_identifier identifier) , (parameter_declaration "undefined8 param_6" type_identifier identifier) ))) (compound_statement "{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}" { (declaration "size_t sVar1;" primitive_type identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "long lVar3;" (sized_type_specifier "long" long) identifier ;) (declaration "uint local_60;" type_identifier identifier ;) (declaration "long *local_58;" (sized_type_specifier "long" long) (pointer_declarator "*local_58" * identifier) ;) (declaration "long local_48 [4];" (sized_type_specifier "long" long) (array_declarator "local_48 [4]" identifier [ number_literal ]) ;) (declaration "undefined8 local_28;" type_identifier identifier ;) (declaration "undefined8 local_20;" type_identifier identifier ;) (expression_statement "local_58 = (long *)&stack0x00000008;" (assignment_expression "local_58 = (long *)&stack0x00000008" identifier = (cast_expression "(long *)&stack0x00000008" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "&stack0x00000008" & identifier))) ;) (expression_statement "local_60 = 8;" (assignment_expression "local_60 = 8" identifier = number_literal) ;) (if_statement "if (param_1 == (char *)0x0) {\n    return 0;\n  }" if (parenthesized_expression "(param_1 == (char *)0x0)" ( (binary_expression "param_1 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    return 0;\n  }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "lVar3 = 0;" (assignment_expression "lVar3 = 0" identifier = number_literal) ;) (expression_statement "local_48[1] = param_2;" (assignment_expression "local_48[1] = param_2" (subscript_expression "local_48[1]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_48[2] = param_3;" (assignment_expression "local_48[2] = param_3" (subscript_expression "local_48[2]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_48[3] = param_4;" (assignment_expression "local_48[3] = param_4" (subscript_expression "local_48[3]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_28 = param_5;" (assignment_expression "local_28 = param_5" identifier = identifier) ;) (expression_statement "local_20 = param_6;" (assignment_expression "local_20 = param_6" identifier = identifier) ;) (do_statement "do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);" do (compound_statement "{\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  }" { (while_statement "while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }" { (expression_statement "sVar1 = strlen(param_1);" (assignment_expression "sVar1 = strlen(param_1)" identifier = (call_expression "strlen(param_1)" identifier (argument_list "(param_1)" ( identifier )))) ;) (expression_statement "lVar3 = lVar3 + sVar1;" (assignment_expression "lVar3 = lVar3 + sVar1" identifier = (binary_expression "lVar3 + sVar1" identifier + identifier)) ;) (expression_statement "uVar2 = (ulong)local_60;" (assignment_expression "uVar2 = (ulong)local_60" identifier = (cast_expression "(ulong)local_60" ( (type_descriptor "ulong" type_identifier) ) identifier)) ;) (if_statement "if (0x2f < local_60) break;" if (parenthesized_expression "(0x2f < local_60)" ( (binary_expression "0x2f < local_60" number_literal < identifier) )) (break_statement "break;" break ;)) (expression_statement "local_60 = local_60 + 8;" (assignment_expression "local_60 = local_60 + 8" identifier = (binary_expression "local_60 + 8" identifier + number_literal)) ;) (expression_statement "param_1 = *(char **)((long)local_48 + uVar2);" (assignment_expression "param_1 = *(char **)((long)local_48 + uVar2)" identifier = (pointer_expression "*(char **)((long)local_48 + uVar2)" * (cast_expression "(char **)((long)local_48 + uVar2)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "((long)local_48 + uVar2)" ( (binary_expression "(long)local_48 + uVar2" (cast_expression "(long)local_48" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + identifier) ))))) ;) (if_statement "if (param_1 == (char *)0x0) {\n        return lVar3;\n      }" if (parenthesized_expression "(param_1 == (char *)0x0)" ( (binary_expression "param_1 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n        return lVar3;\n      }" { (return_statement "return lVar3;" return identifier ;) })) })) (expression_statement "param_1 = (char *)*local_58;" (assignment_expression "param_1 = (char *)*local_58" identifier = (cast_expression "(char *)*local_58" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*local_58" * identifier))) ;) (expression_statement "local_58 = local_58 + 1;" (assignment_expression "local_58 = local_58 + 1" identifier = (binary_expression "local_58 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(param_1 != (char *)0x0)" ( (binary_expression "param_1 != (char *)0x0" identifier != (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) ;) (return_statement "return lVar3;" return identifier ;) })))
(translation_unit "ulong concat_length(char *first,...)\n\n{\n  size_t sVar1;\n  ulong uVar2;\n  undefined8 in_RCX;\n  undefined8 in_RDX;\n  ulong uVar3;\n  undefined8 in_RSI;\n  undefined8 in_R8;\n  undefined8 in_R9;\n  va_list args;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  args[0].overflow_arg_area = &stack0x00000008;\n  args[0].gp_offset = 8;\n  if (first == (char *)0x0) {\n    return 0;\n  }\n  uVar3 = 0;\n  local_48[1] = in_RSI;\n  local_48[2] = in_RDX;\n  local_48[3] = in_RCX;\n  local_28 = in_R8;\n  local_20 = in_R9;\n  do {\n    while( true ) {\n      sVar1 = strlen(first);\n      uVar3 = uVar3 + sVar1;\n      uVar2 = (ulong)args[0].gp_offset;\n      if (0x2f < args[0].gp_offset) break;\n      args[0].gp_offset = args[0].gp_offset + 8;\n      first = *(char **)((long)local_48 + uVar2);\n      if (first == (char *)0x0) {\n        return uVar3;\n      }\n    }\n                    /* WARNING: Load size is inaccurate */\n    first = *args[0].overflow_arg_area;\n    args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);\n  } while (first != (char *)0x0);\n  return uVar3;\n}\n\n" (function_definition "ulong concat_length(char *first,...)\n\n{\n  size_t sVar1;\n  ulong uVar2;\n  undefined8 in_RCX;\n  undefined8 in_RDX;\n  ulong uVar3;\n  undefined8 in_RSI;\n  undefined8 in_R8;\n  undefined8 in_R9;\n  va_list args;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  args[0].overflow_arg_area = &stack0x00000008;\n  args[0].gp_offset = 8;\n  if (first == (char *)0x0) {\n    return 0;\n  }\n  uVar3 = 0;\n  local_48[1] = in_RSI;\n  local_48[2] = in_RDX;\n  local_48[3] = in_RCX;\n  local_28 = in_R8;\n  local_20 = in_R9;\n  do {\n    while( true ) {\n      sVar1 = strlen(first);\n      uVar3 = uVar3 + sVar1;\n      uVar2 = (ulong)args[0].gp_offset;\n      if (0x2f < args[0].gp_offset) break;\n      args[0].gp_offset = args[0].gp_offset + 8;\n      first = *(char **)((long)local_48 + uVar2);\n      if (first == (char *)0x0) {\n        return uVar3;\n      }\n    }\n                    /* WARNING: Load size is inaccurate */\n    first = *args[0].overflow_arg_area;\n    args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);\n  } while (first != (char *)0x0);\n  return uVar3;\n}" type_identifier (function_declarator "concat_length(char *first,...)" identifier (parameter_list "(char *first,...)" ( (parameter_declaration "char *first" primitive_type (pointer_declarator "*first" * identifier)) , (variadic_parameter "..." ...) ))) (compound_statement "{\n  size_t sVar1;\n  ulong uVar2;\n  undefined8 in_RCX;\n  undefined8 in_RDX;\n  ulong uVar3;\n  undefined8 in_RSI;\n  undefined8 in_R8;\n  undefined8 in_R9;\n  va_list args;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  args[0].overflow_arg_area = &stack0x00000008;\n  args[0].gp_offset = 8;\n  if (first == (char *)0x0) {\n    return 0;\n  }\n  uVar3 = 0;\n  local_48[1] = in_RSI;\n  local_48[2] = in_RDX;\n  local_48[3] = in_RCX;\n  local_28 = in_R8;\n  local_20 = in_R9;\n  do {\n    while( true ) {\n      sVar1 = strlen(first);\n      uVar3 = uVar3 + sVar1;\n      uVar2 = (ulong)args[0].gp_offset;\n      if (0x2f < args[0].gp_offset) break;\n      args[0].gp_offset = args[0].gp_offset + 8;\n      first = *(char **)((long)local_48 + uVar2);\n      if (first == (char *)0x0) {\n        return uVar3;\n      }\n    }\n                    /* WARNING: Load size is inaccurate */\n    first = *args[0].overflow_arg_area;\n    args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);\n  } while (first != (char *)0x0);\n  return uVar3;\n}" { (declaration "size_t sVar1;" primitive_type identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "undefined8 in_RCX;" type_identifier identifier ;) (declaration "undefined8 in_RDX;" type_identifier identifier ;) (declaration "ulong uVar3;" type_identifier identifier ;) (declaration "undefined8 in_RSI;" type_identifier identifier ;) (declaration "undefined8 in_R8;" type_identifier identifier ;) (declaration "undefined8 in_R9;" type_identifier identifier ;) (declaration "va_list args;" type_identifier identifier ;) (declaration "long local_48 [4];" (sized_type_specifier "long" long) (array_declarator "local_48 [4]" identifier [ number_literal ]) ;) (declaration "undefined8 local_28;" type_identifier identifier ;) (declaration "undefined8 local_20;" type_identifier identifier ;) (expression_statement "args[0].overflow_arg_area = &stack0x00000008;" (assignment_expression "args[0].overflow_arg_area = &stack0x00000008" (field_expression "args[0].overflow_arg_area" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier) = (pointer_expression "&stack0x00000008" & identifier)) ;) (expression_statement "args[0].gp_offset = 8;" (assignment_expression "args[0].gp_offset = 8" (field_expression "args[0].gp_offset" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier) = number_literal) ;) (if_statement "if (first == (char *)0x0) {\n    return 0;\n  }" if (parenthesized_expression "(first == (char *)0x0)" ( (binary_expression "first == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    return 0;\n  }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "uVar3 = 0;" (assignment_expression "uVar3 = 0" identifier = number_literal) ;) (expression_statement "local_48[1] = in_RSI;" (assignment_expression "local_48[1] = in_RSI" (subscript_expression "local_48[1]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_48[2] = in_RDX;" (assignment_expression "local_48[2] = in_RDX" (subscript_expression "local_48[2]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_48[3] = in_RCX;" (assignment_expression "local_48[3] = in_RCX" (subscript_expression "local_48[3]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_28 = in_R8;" (assignment_expression "local_28 = in_R8" identifier = identifier) ;) (expression_statement "local_20 = in_R9;" (assignment_expression "local_20 = in_R9" identifier = identifier) ;) (do_statement "do {\n    while( true ) {\n      sVar1 = strlen(first);\n      uVar3 = uVar3 + sVar1;\n      uVar2 = (ulong)args[0].gp_offset;\n      if (0x2f < args[0].gp_offset) break;\n      args[0].gp_offset = args[0].gp_offset + 8;\n      first = *(char **)((long)local_48 + uVar2);\n      if (first == (char *)0x0) {\n        return uVar3;\n      }\n    }\n                    /* WARNING: Load size is inaccurate */\n    first = *args[0].overflow_arg_area;\n    args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);\n  } while (first != (char *)0x0);" do (compound_statement "{\n    while( true ) {\n      sVar1 = strlen(first);\n      uVar3 = uVar3 + sVar1;\n      uVar2 = (ulong)args[0].gp_offset;\n      if (0x2f < args[0].gp_offset) break;\n      args[0].gp_offset = args[0].gp_offset + 8;\n      first = *(char **)((long)local_48 + uVar2);\n      if (first == (char *)0x0) {\n        return uVar3;\n      }\n    }\n                    /* WARNING: Load size is inaccurate */\n    first = *args[0].overflow_arg_area;\n    args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);\n  }" { (while_statement "while( true ) {\n      sVar1 = strlen(first);\n      uVar3 = uVar3 + sVar1;\n      uVar2 = (ulong)args[0].gp_offset;\n      if (0x2f < args[0].gp_offset) break;\n      args[0].gp_offset = args[0].gp_offset + 8;\n      first = *(char **)((long)local_48 + uVar2);\n      if (first == (char *)0x0) {\n        return uVar3;\n      }\n    }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n      sVar1 = strlen(first);\n      uVar3 = uVar3 + sVar1;\n      uVar2 = (ulong)args[0].gp_offset;\n      if (0x2f < args[0].gp_offset) break;\n      args[0].gp_offset = args[0].gp_offset + 8;\n      first = *(char **)((long)local_48 + uVar2);\n      if (first == (char *)0x0) {\n        return uVar3;\n      }\n    }" { (expression_statement "sVar1 = strlen(first);" (assignment_expression "sVar1 = strlen(first)" identifier = (call_expression "strlen(first)" identifier (argument_list "(first)" ( identifier )))) ;) (expression_statement "uVar3 = uVar3 + sVar1;" (assignment_expression "uVar3 = uVar3 + sVar1" identifier = (binary_expression "uVar3 + sVar1" identifier + identifier)) ;) (expression_statement "uVar2 = (ulong)args[0].gp_offset;" (assignment_expression "uVar2 = (ulong)args[0].gp_offset" identifier = (cast_expression "(ulong)args[0].gp_offset" ( (type_descriptor "ulong" type_identifier) ) (field_expression "args[0].gp_offset" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier))) ;) (if_statement "if (0x2f < args[0].gp_offset) break;" if (parenthesized_expression "(0x2f < args[0].gp_offset)" ( (binary_expression "0x2f < args[0].gp_offset" number_literal < (field_expression "args[0].gp_offset" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier)) )) (break_statement "break;" break ;)) (expression_statement "args[0].gp_offset = args[0].gp_offset + 8;" (assignment_expression "args[0].gp_offset = args[0].gp_offset + 8" (field_expression "args[0].gp_offset" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier) = (binary_expression "args[0].gp_offset + 8" (field_expression "args[0].gp_offset" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier) + number_literal)) ;) (expression_statement "first = *(char **)((long)local_48 + uVar2);" (assignment_expression "first = *(char **)((long)local_48 + uVar2)" identifier = (pointer_expression "*(char **)((long)local_48 + uVar2)" * (cast_expression "(char **)((long)local_48 + uVar2)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "((long)local_48 + uVar2)" ( (binary_expression "(long)local_48 + uVar2" (cast_expression "(long)local_48" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + identifier) ))))) ;) (if_statement "if (first == (char *)0x0) {\n        return uVar3;\n      }" if (parenthesized_expression "(first == (char *)0x0)" ( (binary_expression "first == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n        return uVar3;\n      }" { (return_statement "return uVar3;" return identifier ;) })) })) comment (expression_statement "first = *args[0].overflow_arg_area;" (assignment_expression "first = *args[0].overflow_arg_area" identifier = (pointer_expression "*args[0].overflow_arg_area" * (field_expression "args[0].overflow_arg_area" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier))) ;) (expression_statement "args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);" (assignment_expression "args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8)" (field_expression "args[0].overflow_arg_area" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier) = (cast_expression "(void *)((long)args[0].overflow_arg_area + 8)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((long)args[0].overflow_arg_area + 8)" ( (binary_expression "(long)args[0].overflow_arg_area + 8" (cast_expression "(long)args[0].overflow_arg_area" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) (field_expression "args[0].overflow_arg_area" (subscript_expression "args[0]" identifier [ number_literal ]) . field_identifier)) + number_literal) )))) ;) }) while (parenthesized_expression "(first != (char *)0x0)" ( (binary_expression "first != (char *)0x0" identifier != (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) ;) (return_statement "return uVar3;" return identifier ;) })))
(translation_unit "long FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)\n\n{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}\n\n" (function_definition "long FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)\n\n{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}" (sized_type_specifier "long" long) (function_declarator "FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)" identifier (parameter_list "(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)" ( (parameter_declaration "char *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "undefined8 param_2" type_identifier identifier) , (parameter_declaration "undefined8 param_3" type_identifier identifier) , (parameter_declaration "undefined8 param_4" type_identifier identifier) , (parameter_declaration "undefined8 param_5" type_identifier identifier) , (parameter_declaration "undefined8 param_6" type_identifier identifier) ))) (compound_statement "{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}" { (declaration "size_t sVar1;" primitive_type identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "long lVar3;" (sized_type_specifier "long" long) identifier ;) (declaration "uint local_60;" type_identifier identifier ;) (declaration "long *local_58;" (sized_type_specifier "long" long) (pointer_declarator "*local_58" * identifier) ;) (declaration "long local_48 [4];" (sized_type_specifier "long" long) (array_declarator "local_48 [4]" identifier [ number_literal ]) ;) (declaration "undefined8 local_28;" type_identifier identifier ;) (declaration "undefined8 local_20;" type_identifier identifier ;) (expression_statement "local_58 = (long *)&stack0x00000008;" (assignment_expression "local_58 = (long *)&stack0x00000008" identifier = (cast_expression "(long *)&stack0x00000008" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "&stack0x00000008" & identifier))) ;) (expression_statement "local_60 = 8;" (assignment_expression "local_60 = 8" identifier = number_literal) ;) (if_statement "if (param_1 == (char *)0x0) {\n    return 0;\n  }" if (parenthesized_expression "(param_1 == (char *)0x0)" ( (binary_expression "param_1 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    return 0;\n  }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "lVar3 = 0;" (assignment_expression "lVar3 = 0" identifier = number_literal) ;) (expression_statement "local_48[1] = param_2;" (assignment_expression "local_48[1] = param_2" (subscript_expression "local_48[1]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_48[2] = param_3;" (assignment_expression "local_48[2] = param_3" (subscript_expression "local_48[2]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_48[3] = param_4;" (assignment_expression "local_48[3] = param_4" (subscript_expression "local_48[3]" identifier [ number_literal ]) = identifier) ;) (expression_statement "local_28 = param_5;" (assignment_expression "local_28 = param_5" identifier = identifier) ;) (expression_statement "local_20 = param_6;" (assignment_expression "local_20 = param_6" identifier = identifier) ;) (do_statement "do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);" do (compound_statement "{\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  }" { (while_statement "while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }" { (expression_statement "sVar1 = strlen(param_1);" (assignment_expression "sVar1 = strlen(param_1)" identifier = (call_expression "strlen(param_1)" identifier (argument_list "(param_1)" ( identifier )))) ;) (expression_statement "lVar3 = lVar3 + sVar1;" (assignment_expression "lVar3 = lVar3 + sVar1" identifier = (binary_expression "lVar3 + sVar1" identifier + identifier)) ;) (expression_statement "uVar2 = (ulong)local_60;" (assignment_expression "uVar2 = (ulong)local_60" identifier = (cast_expression "(ulong)local_60" ( (type_descriptor "ulong" type_identifier) ) identifier)) ;) (if_statement "if (0x2f < local_60) break;" if (parenthesized_expression "(0x2f < local_60)" ( (binary_expression "0x2f < local_60" number_literal < identifier) )) (break_statement "break;" break ;)) (expression_statement "local_60 = local_60 + 8;" (assignment_expression "local_60 = local_60 + 8" identifier = (binary_expression "local_60 + 8" identifier + number_literal)) ;) (expression_statement "param_1 = *(char **)((long)local_48 + uVar2);" (assignment_expression "param_1 = *(char **)((long)local_48 + uVar2)" identifier = (pointer_expression "*(char **)((long)local_48 + uVar2)" * (cast_expression "(char **)((long)local_48 + uVar2)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "((long)local_48 + uVar2)" ( (binary_expression "(long)local_48 + uVar2" (cast_expression "(long)local_48" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) + identifier) ))))) ;) (if_statement "if (param_1 == (char *)0x0) {\n        return lVar3;\n      }" if (parenthesized_expression "(param_1 == (char *)0x0)" ( (binary_expression "param_1 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n        return lVar3;\n      }" { (return_statement "return lVar3;" return identifier ;) })) })) (expression_statement "param_1 = (char *)*local_58;" (assignment_expression "param_1 = (char *)*local_58" identifier = (cast_expression "(char *)*local_58" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*local_58" * identifier))) ;) (expression_statement "local_58 = local_58 + 1;" (assignment_expression "local_58 = local_58 + 1" identifier = (binary_expression "local_58 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(param_1 != (char *)0x0)" ( (binary_expression "param_1 != (char *)0x0" identifier != (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) ;) (return_statement "return lVar3;" return identifier ;) })))
(translation_unit (function_definition (sized_type_specifier long) (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration (sized_type_specifier long) IDENT ;) (declaration TYPE IDENT ;) (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (declaration (sized_type_specifier long) (array_declarator IDENT [ LIT ]) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression & IDENT))) ;) (expression_statement (assignment_expression IDENT = 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 IDENT = LIT) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (do_statement do (compound_statement { (while_statement while (parenthesized_expression ( BOOL )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( IDENT )))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (break_statement break ;)) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) + IDENT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (return_statement return IDENT ;) })) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) ;) (return_statement return IDENT ;) })))
(function_definition "long FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)\n\n{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}" (sized_type_specifier "long" (long "long")) (function_declarator "FUN_001565e0(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)" (identifier "FUN_001565e0") (parameter_list "(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n                 undefined8 param_5,undefined8 param_6)" (( "(") (parameter_declaration "char *param_1" (primitive_type "char") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "undefined8 param_2" (type_identifier "undefined8") (identifier "param_2")) (, ",") (parameter_declaration "undefined8 param_3" (type_identifier "undefined8") (identifier "param_3")) (, ",") (parameter_declaration "undefined8 param_4" (type_identifier "undefined8") (identifier "param_4")) (, ",") (parameter_declaration "undefined8 param_5" (type_identifier "undefined8") (identifier "param_5")) (, ",") (parameter_declaration "undefined8 param_6" (type_identifier "undefined8") (identifier "param_6")) () ")"))) (compound_statement "{\n  size_t sVar1;\n  ulong uVar2;\n  long lVar3;\n  uint local_60;\n  long *local_58;\n  long local_48 [4];\n  undefined8 local_28;\n  undefined8 local_20;\n  \n  local_58 = (long *)&stack0x00000008;\n  local_60 = 8;\n  if (param_1 == (char *)0x0) {\n    return 0;\n  }\n  lVar3 = 0;\n  local_48[1] = param_2;\n  local_48[2] = param_3;\n  local_48[3] = param_4;\n  local_28 = param_5;\n  local_20 = param_6;\n  do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);\n  return lVar3;\n}" ({ "{") (declaration "size_t sVar1;" (primitive_type "size_t") (identifier "sVar1") (; ";")) (declaration "ulong uVar2;" (type_identifier "ulong") (identifier "uVar2") (; ";")) (declaration "long lVar3;" (sized_type_specifier "long" (long "long")) (identifier "lVar3") (; ";")) (declaration "uint local_60;" (type_identifier "uint") (identifier "local_60") (; ";")) (declaration "long *local_58;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*local_58" (* "*") (identifier "local_58")) (; ";")) (declaration "long local_48 [4];" (sized_type_specifier "long" (long "long")) (array_declarator "local_48 [4]" (identifier "local_48") ([ "[") (number_literal "4") (] "]")) (; ";")) (declaration "undefined8 local_28;" (type_identifier "undefined8") (identifier "local_28") (; ";")) (declaration "undefined8 local_20;" (type_identifier "undefined8") (identifier "local_20") (; ";")) (expression_statement "local_58 = (long *)&stack0x00000008;" (assignment_expression "local_58 = (long *)&stack0x00000008" (identifier "local_58") (= "=") (cast_expression "(long *)&stack0x00000008" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "&stack0x00000008" (& "&") (identifier "stack0x00000008")))) (; ";")) (expression_statement "local_60 = 8;" (assignment_expression "local_60 = 8" (identifier "local_60") (= "=") (number_literal "8")) (; ";")) (if_statement "if (param_1 == (char *)0x0) {\n    return 0;\n  }" (if "if") (parenthesized_expression "(param_1 == (char *)0x0)" (( "(") (binary_expression "param_1 == (char *)0x0" (identifier "param_1") (== "==") (cast_expression "(char *)0x0" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    return 0;\n  }" ({ "{") (return_statement "return 0;" (return "return") (number_literal "0") (; ";")) (} "}"))) (expression_statement "lVar3 = 0;" (assignment_expression "lVar3 = 0" (identifier "lVar3") (= "=") (number_literal "0")) (; ";")) (expression_statement "local_48[1] = param_2;" (assignment_expression "local_48[1] = param_2" (subscript_expression "local_48[1]" (identifier "local_48") ([ "[") (number_literal "1") (] "]")) (= "=") (identifier "param_2")) (; ";")) (expression_statement "local_48[2] = param_3;" (assignment_expression "local_48[2] = param_3" (subscript_expression "local_48[2]" (identifier "local_48") ([ "[") (number_literal "2") (] "]")) (= "=") (identifier "param_3")) (; ";")) (expression_statement "local_48[3] = param_4;" (assignment_expression "local_48[3] = param_4" (subscript_expression "local_48[3]" (identifier "local_48") ([ "[") (number_literal "3") (] "]")) (= "=") (identifier "param_4")) (; ";")) (expression_statement "local_28 = param_5;" (assignment_expression "local_28 = param_5" (identifier "local_28") (= "=") (identifier "param_5")) (; ";")) (expression_statement "local_20 = param_6;" (assignment_expression "local_20 = param_6" (identifier "local_20") (= "=") (identifier "param_6")) (; ";")) (do_statement "do {\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  } while (param_1 != (char *)0x0);" (do "do") (compound_statement "{\n    while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }\n    param_1 = (char *)*local_58;\n    local_58 = local_58 + 1;\n  }" ({ "{") (while_statement "while( true ) {\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }" (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (compound_statement "{\n      sVar1 = strlen(param_1);\n      lVar3 = lVar3 + sVar1;\n      uVar2 = (ulong)local_60;\n      if (0x2f < local_60) break;\n      local_60 = local_60 + 8;\n      param_1 = *(char **)((long)local_48 + uVar2);\n      if (param_1 == (char *)0x0) {\n        return lVar3;\n      }\n    }" ({ "{") (expression_statement "sVar1 = strlen(param_1);" (assignment_expression "sVar1 = strlen(param_1)" (identifier "sVar1") (= "=") (call_expression "strlen(param_1)" (identifier "strlen") (argument_list "(param_1)" (( "(") (identifier "param_1") () ")")))) (; ";")) (expression_statement "lVar3 = lVar3 + sVar1;" (assignment_expression "lVar3 = lVar3 + sVar1" (identifier "lVar3") (= "=") (binary_expression "lVar3 + sVar1" (identifier "lVar3") (+ "+") (identifier "sVar1"))) (; ";")) (expression_statement "uVar2 = (ulong)local_60;" (assignment_expression "uVar2 = (ulong)local_60" (identifier "uVar2") (= "=") (cast_expression "(ulong)local_60" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (identifier "local_60"))) (; ";")) (if_statement "if (0x2f < local_60) break;" (if "if") (parenthesized_expression "(0x2f < local_60)" (( "(") (binary_expression "0x2f < local_60" (number_literal "0x2f") (< "<") (identifier "local_60")) () ")")) (break_statement "break;" (break "break") (; ";"))) (expression_statement "local_60 = local_60 + 8;" (assignment_expression "local_60 = local_60 + 8" (identifier "local_60") (= "=") (binary_expression "local_60 + 8" (identifier "local_60") (+ "+") (number_literal "8"))) (; ";")) (expression_statement "param_1 = *(char **)((long)local_48 + uVar2);" (assignment_expression "param_1 = *(char **)((long)local_48 + uVar2)" (identifier "param_1") (= "=") (pointer_expression "*(char **)((long)local_48 + uVar2)" (* "*") (cast_expression "(char **)((long)local_48 + uVar2)" (( "(") (type_descriptor "char **" (primitive_type "char") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "((long)local_48 + uVar2)" (( "(") (binary_expression "(long)local_48 + uVar2" (cast_expression "(long)local_48" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "local_48")) (+ "+") (identifier "uVar2")) () ")"))))) (; ";")) (if_statement "if (param_1 == (char *)0x0) {\n        return lVar3;\n      }" (if "if") (parenthesized_expression "(param_1 == (char *)0x0)" (( "(") (binary_expression "param_1 == (char *)0x0" (identifier "param_1") (== "==") (cast_expression "(char *)0x0" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n        return lVar3;\n      }" ({ "{") (return_statement "return lVar3;" (return "return") (identifier "lVar3") (; ";")) (} "}"))) (} "}"))) (expression_statement "param_1 = (char *)*local_58;" (assignment_expression "param_1 = (char *)*local_58" (identifier "param_1") (= "=") (cast_expression "(char *)*local_58" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*local_58" (* "*") (identifier "local_58")))) (; ";")) (expression_statement "local_58 = local_58 + 1;" (assignment_expression "local_58 = local_58 + 1" (identifier "local_58") (= "=") (binary_expression "local_58 + 1" (identifier "local_58") (+ "+") (number_literal "1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(param_1 != (char *)0x0)" (( "(") (binary_expression "param_1 != (char *)0x0" (identifier "param_1") (!= "!=") (cast_expression "(char *)0x0" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (; ";")) (return_statement "return lVar3;" (return "return") (identifier "lVar3") (; ";")) (} "}")))

type_1 function_1(char *var_1,...)

{
  size_t var_4;
  type_1 var_5;
  type_2 in_RCX;
  type_2 in_RDX;
  type_1 var_3;
  type_2 in_RSI;
  type_2 in_R8;
  type_2 in_R9;
  type_3 args;
  long local_48 [4];
  type_2 local_28;
  type_2 local_20;
  
  args[0].overflow_arg_area = &stack0x00000008;
  args[0].gp_offset = 8;
  if (var_1 == (char *)0x0) {
    return 0;
  }
  var_3 = 0;
  local_48[1] = in_RSI;
  local_48[2] = in_RDX;
  local_48[3] = in_RCX;
  local_28 = in_R8;
  local_20 = in_R9;
  do {
    while( true ) {
      var_4 = var_2(var_1);
      var_3 = var_3 + var_4;
      var_5 = (type_1)args[0].gp_offset;
      if (0x2f < args[0].gp_offset) break;
      args[0].gp_offset = args[0].gp_offset + 8;
      var_1 = *(char **)((long)local_48 + var_5);
      if (var_1 == (char *)0x0) {
        return var_3;
      }
    }
                    /* WARNING: Load size is inaccurate */
    var_1 = *args[0].overflow_arg_area;
    args[0].overflow_arg_area = (void *)((long)args[0].overflow_arg_area + 8);
  } while (var_1 != (char *)0x0);
  return var_3;
}


(translation_unit (function_definition type: (sized_type_specifier) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (identifier)))) body: (compound_statement (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (sized_type_specifier) declarator: (array_declarator declarator: (identifier) size: (number_literal))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (return_statement (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (do_statement body: (compound_statement (while_statement condition: (parenthesized_expression (true)) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (break_statement)) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) 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 declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (identifier))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (return_statement (identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal))))) (return_statement (identifier)))))

long MASKED(char *param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,
                 undefined8 param_5,undefined8 param_6)

{
  size_t sVar1;
  ulong uVar2;
  long lVar3;
  uint local_60;
  long *local_58;
  long local_48 [4];
  undefined8 local_28;
  undefined8 local_20;
  
  local_58 = (long *)&stack0x00000008;
  local_60 = 8;
  if (param_1 == (char *)0x0) {
    return 0;
  }
  lVar3 = 0;
  local_48[1] = param_2;
  local_48[2] = param_3;
  local_48[3] = param_4;
  local_28 = param_5;
  local_20 = param_6;
  do {
    while( true ) {
      sVar1 = strlen(param_1);
      lVar3 = lVar3 + sVar1;
      uVar2 = (ulong)local_60;
      if (0x2f < local_60) break;
      local_60 = local_60 + 8;
      param_1 = *(char **)((long)local_48 + uVar2);
      if (param_1 == (char *)0x0) {
        return lVar3;
      }
    }
    param_1 = (char *)*local_58;
    local_58 = local_58 + 1;
  } while (param_1 != (char *)0x0);
  return lVar3;
}

