
debug_type_s * debug_get_real_type(void *handle,debug_type_conflict type,debug_type_real_list *list)

{
  debug_name *type_00;
  debug_type_real_list *pdVar1;
  char *__format;
  debug_type_conflict pdVar2;
  debug_type_s *pdVar3;
  debug_type_kind dVar4;
  debug_type pdVar5;
  bool bVar6;
  debug_type_real_list rl;
  
  dVar4 = type->kind;
  if ((DEBUG_KIND_TAGGED < dVar4) || ((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0)) {
    return type;
  }
  if (list == (debug_type_real_list *)0x0) {
LAB_0010d066:
    rl.next = list;
    rl.t = type;
    if (dVar4 - DEBUG_KIND_NAMED < 2) {
      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);
    }
    else {
      type_00 = ((type->u).knamed)->name->next;
      if (type_00 == (debug_name *)0x0) {
        return type;
      }
      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);
    }
  }
  else {
    if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {
      do {
        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;
      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)
              );
    }
    while (dVar4 == DEBUG_KIND_INDIRECT) {
      pdVar2 = (debug_type_conflict)(type->u).kindirect;
      type = **(debug_type_conflict **)&pdVar2->kind;
      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;
      dVar4 = type->kind;
    }
    pdVar5 = (debug_type)0x0;
    if (dVar4 - DEBUG_KIND_NAMED < 2) {
      pdVar2 = ((type->u).kfunction)->return_type;
LAB_0010d0f7:
      pdVar5 = pdVar2->pointer;
    }
    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);
    fprintf(stderr,__format,pdVar5);
    pdVar3 = (debug_type_s *)0x0;
  }
  return pdVar3;
}



uint * FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)

{
  long lVar1;
  long *plVar2;
  char *__format;
  undefined8 *puVar3;
  uint *puVar4;
  uint uVar5;
  undefined8 uVar6;
  bool bVar7;
  long *local_18;
  uint *local_10;
  
  uVar5 = *param_2;
  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {
    return param_2;
  }
  if (param_3 == (long *)0x0) {
LAB_0010d066:
    local_18 = param_3;
    local_10 = param_2;
    if (uVar5 - 0x16 < 2) {
      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);
    }
    else {
      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);
      if (lVar1 == 0) {
        return param_2;
      }
      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);
    }
  }
  else {
    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))
    {
      do {
        if (plVar2 == (long *)0x0) goto LAB_0010d066;
      } while (((uint *)plVar2[1] != param_2) &&
              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));
    }
    while (uVar5 == 1) {
      puVar3 = *(undefined8 **)(param_2 + 4);
      param_2 = *(uint **)*puVar3;
      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;
      uVar5 = *param_2;
    }
    uVar6 = 0;
    if (uVar5 - 0x16 < 2) {
      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);
LAB_0010d0f7:
      uVar6 = puVar3[1];
    }
    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);
    fprintf(stderr,__format,uVar6);
    puVar4 = (uint *)0x0;
  }
  return puVar4;
}


MOV ECX,dword ptr [RSI]
CMP ECX,0x17
JBE 0x0010d020
MOV RAX,RSI
RET
MOV EAX,0x1
SHL RAX,CL
TEST EAX,0xc00002
JZ 0x0010d017
PUSH RBX
SUB RSP,0x10
TEST RDX,RDX
JZ 0x0010d066
CMP RSI,qword ptr [RDX + 0x8]
JZ 0x0010d0a9
MOV RAX,qword ptr [RDX]
CMP RDX,RAX
JNZ 0x0010d061
JMP 0x0010d0a9
CMP qword ptr [RAX + 0x8],RSI
JZ 0x0010d0a9
MOV R8,qword ptr [RAX]
CMP R8,RAX
JZ 0x0010d0a9
MOV RAX,R8
TEST RAX,RAX
JNZ 0x0010d050
SUB ECX,0x16
MOV qword ptr [RSP],RDX
MOV RAX,qword ptr [RSI + 0x10]
MOV qword ptr [RSP + 0x8],RSI
CMP ECX,0x1
JBE 0x0010d10d
MOV RAX,qword ptr [RAX]
MOV RAX,qword ptr [RAX]
TEST RAX,RAX
JNZ 0x0010d100
ADD RSP,0x10
MOV RAX,RSI
POP RBX
RET
MOV RAX,qword ptr [RSI + 0x10]
MOV RDX,qword ptr [RAX]
MOV RSI,qword ptr [RDX]
TEST RSI,RSI
JZ 0x0010d0f7
MOV ECX,dword ptr [RSI]
CMP ECX,0x1
JZ 0x0010d098
SUB ECX,0x16
XOR EBX,EBX
CMP ECX,0x1
JBE 0x0010d0f0
MOV EDX,0x5
LEA RSI,[0x122900]
XOR EDI,EDI
CALL 0x00104240
MOV RDI,qword ptr [0x0012c9e0]
MOV RDX,RBX
MOV RSI,RAX
XOR EAX,EAX
CALL 0x001044a0
XOR EAX,EAX
ADD RSP,0x10
POP RBX
RET
MOV RAX,qword ptr [RSI + 0x10]
MOV RAX,qword ptr [RAX]
MOV RBX,qword ptr [RAX + 0x8]
JMP 0x0010d0b8
MOV RDX,RSP
MOV RSI,RAX
CALL 0x0010d010
JMP 0x0010d0e1
MOV RSI,qword ptr [RAX + 0x8]
MOV RDX,RSP
CALL 0x0010d010
JMP 0x0010d0e1
(translation_unit "uint * FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)\n\n{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}\n\n" (function_definition "uint * FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)\n\n{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}" type_identifier (pointer_declarator "* FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)" * (function_declarator "FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)" identifier (parameter_list "(undefined8 param_1,uint *param_2,long *param_3)" ( (parameter_declaration "undefined8 param_1" type_identifier identifier) , (parameter_declaration "uint *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) )))) (compound_statement "{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "long *plVar2;" (sized_type_specifier "long" long) (pointer_declarator "*plVar2" * identifier) ;) (declaration "char *__format;" primitive_type (pointer_declarator "*__format" * identifier) ;) (declaration "undefined8 *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (declaration "uint *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "uint uVar5;" type_identifier identifier ;) (declaration "undefined8 uVar6;" type_identifier identifier ;) (declaration "bool bVar7;" primitive_type identifier ;) (declaration "long *local_18;" (sized_type_specifier "long" long) (pointer_declarator "*local_18" * identifier) ;) (declaration "uint *local_10;" type_identifier (pointer_declarator "*local_10" * identifier) ;) (expression_statement "uVar5 = *param_2;" (assignment_expression "uVar5 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (if_statement "if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }" if (parenthesized_expression "((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0))" ( (binary_expression "(0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)" (parenthesized_expression "(0x17 < uVar5)" ( (binary_expression "0x17 < uVar5" number_literal < identifier) )) || (parenthesized_expression "((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)" ( (binary_expression "(1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0" (parenthesized_expression "(1L << ((byte)uVar5 & 0x3f) & 0xc00002U)" ( (binary_expression "1L << ((byte)uVar5 & 0x3f) & 0xc00002U" (binary_expression "1L << ((byte)uVar5 & 0x3f)" number_literal << (parenthesized_expression "((byte)uVar5 & 0x3f)" ( (binary_expression "(byte)uVar5 & 0x3f" (cast_expression "(byte)uVar5" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) & number_literal) )) == number_literal) ))) )) (compound_statement "{\n    return param_2;\n  }" { (return_statement "return param_2;" return identifier ;) })) (if_statement "if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\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 "{\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }" { (labeled_statement "LAB_0010d066:\n    local_18 = param_3;" statement_identifier : (expression_statement "local_18 = param_3;" (assignment_expression "local_18 = param_3" identifier = identifier) ;)) (expression_statement "local_10 = param_2;" (assignment_expression "local_10 = param_2" identifier = identifier) ;) (if_statement "if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" if (parenthesized_expression "(uVar5 - 0x16 < 2)" ( (binary_expression "uVar5 - 0x16 < 2" (binary_expression "uVar5 - 0x16" identifier - number_literal) < number_literal) )) (compound_statement "{\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }" { (expression_statement "puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);" (assignment_expression "puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" identifier = (cast_expression "(uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" identifier (argument_list "(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" ( identifier , (subscript_expression "(*(undefined8 **)(param_2 + 4))[1]" (parenthesized_expression "(*(undefined8 **)(param_2 + 4))" ( (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) )))) )) [ number_literal ]) , (pointer_expression "&local_18" & identifier) ))))) ;) }) (else_clause "else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" else (compound_statement "{\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" { (expression_statement "lVar1 = *(long *)**(undefined8 **)(param_2 + 4);" (assignment_expression "lVar1 = *(long *)**(undefined8 **)(param_2 + 4)" identifier = (pointer_expression "*(long *)**(undefined8 **)(param_2 + 4)" * (cast_expression "(long *)**(undefined8 **)(param_2 + 4)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "**(undefined8 **)(param_2 + 4)" * (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) )))))))) ;) (if_statement "if (lVar1 == 0) {\n        return param_2;\n      }" if (parenthesized_expression "(lVar1 == 0)" ( (binary_expression "lVar1 == 0" identifier == number_literal) )) (compound_statement "{\n        return param_2;\n      }" { (return_statement "return param_2;" return identifier ;) })) (expression_statement "puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);" (assignment_expression "puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18)" identifier = (cast_expression "(uint *)FUN_0010d010(param_1,lVar1,&local_18)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "FUN_0010d010(param_1,lVar1,&local_18)" identifier (argument_list "(param_1,lVar1,&local_18)" ( identifier , identifier , (pointer_expression "&local_18" & identifier) ))))) ;) }))) }) (else_clause "else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }" else (compound_statement "{\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }" { (if_statement "if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }" if (parenthesized_expression "((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))" ( (binary_expression "(param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3)" (parenthesized_expression "(param_2 != (uint *)param_3[1])" ( (binary_expression "param_2 != (uint *)param_3[1]" identifier != (cast_expression "(uint *)param_3[1]" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "param_3[1]" identifier [ number_literal ]))) )) && (parenthesized_expression "(plVar2 = (long *)*param_3, param_3 != (long *)*param_3)" ( (comma_expression "plVar2 = (long *)*param_3, param_3 != (long *)*param_3" (assignment_expression "plVar2 = (long *)*param_3" identifier = (cast_expression "(long *)*param_3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_3" * identifier))) , (binary_expression "param_3 != (long *)*param_3" identifier != (cast_expression "(long *)*param_3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_3" * identifier)))) ))) )) (compound_statement "{\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }" { (do_statement "do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));" do (compound_statement "{\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      }" { (if_statement "if (plVar2 == (long *)0x0) goto LAB_0010d066;" if (parenthesized_expression "(plVar2 == (long *)0x0)" ( (binary_expression "plVar2 == (long *)0x0" identifier == (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (goto_statement "goto LAB_0010d066;" goto statement_identifier ;)) }) while (parenthesized_expression "(((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7))" ( (binary_expression "((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7)" (parenthesized_expression "((uint *)plVar2[1] != param_2)" ( (binary_expression "(uint *)plVar2[1] != param_2" (cast_expression "(uint *)plVar2[1]" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar2[1]" identifier [ number_literal ])) != identifier) )) && (parenthesized_expression "(bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7)" ( (comma_expression "bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7" (assignment_expression "bVar7 = (long *)*plVar2 != plVar2" identifier = (binary_expression "(long *)*plVar2 != plVar2" (cast_expression "(long *)*plVar2" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar2" * identifier)) != identifier)) , (comma_expression "plVar2 = (long *)*plVar2, bVar7" (assignment_expression "plVar2 = (long *)*plVar2" identifier = (cast_expression "(long *)*plVar2" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar2" * identifier))) , identifier)) ))) )) ;) })) (while_statement "while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }" while (parenthesized_expression "(uVar5 == 1)" ( (binary_expression "uVar5 == 1" identifier == number_literal) )) (compound_statement "{\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }" { (expression_statement "puVar3 = *(undefined8 **)(param_2 + 4);" (assignment_expression "puVar3 = *(undefined8 **)(param_2 + 4)" identifier = (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) ))))) ;) (expression_statement "param_2 = *(uint **)*puVar3;" (assignment_expression "param_2 = *(uint **)*puVar3" identifier = (pointer_expression "*(uint **)*puVar3" * (cast_expression "(uint **)*puVar3" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (pointer_expression "*puVar3" * identifier)))) ;) (if_statement "if (param_2 == (uint *)0x0) goto LAB_0010d0f7;" if (parenthesized_expression "(param_2 == (uint *)0x0)" ( (binary_expression "param_2 == (uint *)0x0" identifier == (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (goto_statement "goto LAB_0010d0f7;" goto statement_identifier ;)) (expression_statement "uVar5 = *param_2;" (assignment_expression "uVar5 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) })) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" identifier = number_literal) ;) (if_statement "if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }" if (parenthesized_expression "(uVar5 - 0x16 < 2)" ( (binary_expression "uVar5 - 0x16 < 2" (binary_expression "uVar5 - 0x16" identifier - number_literal) < number_literal) )) (compound_statement "{\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }" { (expression_statement "puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);" (assignment_expression "puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4)" identifier = (cast_expression "(undefined8 *)**(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "**(undefined8 **)(param_2 + 4)" * (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) ))))))) ;) (labeled_statement "LAB_0010d0f7:\n      uVar6 = puVar3[1];" statement_identifier : (expression_statement "uVar6 = puVar3[1];" (assignment_expression "uVar6 = puVar3[1]" identifier = (subscript_expression "puVar3[1]" identifier [ number_literal ])) ;)) })) (expression_statement "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);" (assignment_expression "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" identifier = (cast_expression "(char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (call_expression "dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" identifier (argument_list "(0,"debug_get_real_type: circular debug information for %s\n",5)" ( number_literal , (string_literal ""debug_get_real_type: circular debug information for %s\n"" " string_content escape_sequence ") , number_literal ))))) ;) (expression_statement "fprintf(stderr,__format,uVar6);" (call_expression "fprintf(stderr,__format,uVar6)" identifier (argument_list "(stderr,__format,uVar6)" ( identifier , identifier , identifier ))) ;) (expression_statement "puVar4 = (uint *)0x0;" (assignment_expression "puVar4 = (uint *)0x0" identifier = (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) }))) (return_statement "return puVar4;" return identifier ;) })))
(translation_unit "debug_type_s * debug_get_real_type(void *handle,debug_type_conflict type,debug_type_real_list *list)\n\n{\n  debug_name *type_00;\n  debug_type_real_list *pdVar1;\n  char *__format;\n  debug_type_conflict pdVar2;\n  debug_type_s *pdVar3;\n  debug_type_kind dVar4;\n  debug_type pdVar5;\n  bool bVar6;\n  debug_type_real_list rl;\n  \n  dVar4 = type->kind;\n  if ((DEBUG_KIND_TAGGED < dVar4) || ((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0)) {\n    return type;\n  }\n  if (list == (debug_type_real_list *)0x0) {\nLAB_0010d066:\n    rl.next = list;\n    rl.t = type;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);\n    }\n    else {\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }\n  }\n  else {\n    if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }\n    while (dVar4 == DEBUG_KIND_INDIRECT) {\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }\n    pdVar5 = (debug_type)0x0;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,pdVar5);\n    pdVar3 = (debug_type_s *)0x0;\n  }\n  return pdVar3;\n}\n\n" (function_definition "debug_type_s * debug_get_real_type(void *handle,debug_type_conflict type,debug_type_real_list *list)\n\n{\n  debug_name *type_00;\n  debug_type_real_list *pdVar1;\n  char *__format;\n  debug_type_conflict pdVar2;\n  debug_type_s *pdVar3;\n  debug_type_kind dVar4;\n  debug_type pdVar5;\n  bool bVar6;\n  debug_type_real_list rl;\n  \n  dVar4 = type->kind;\n  if ((DEBUG_KIND_TAGGED < dVar4) || ((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0)) {\n    return type;\n  }\n  if (list == (debug_type_real_list *)0x0) {\nLAB_0010d066:\n    rl.next = list;\n    rl.t = type;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);\n    }\n    else {\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }\n  }\n  else {\n    if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }\n    while (dVar4 == DEBUG_KIND_INDIRECT) {\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }\n    pdVar5 = (debug_type)0x0;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,pdVar5);\n    pdVar3 = (debug_type_s *)0x0;\n  }\n  return pdVar3;\n}" type_identifier (pointer_declarator "* debug_get_real_type(void *handle,debug_type_conflict type,debug_type_real_list *list)" * (function_declarator "debug_get_real_type(void *handle,debug_type_conflict type,debug_type_real_list *list)" identifier (parameter_list "(void *handle,debug_type_conflict type,debug_type_real_list *list)" ( (parameter_declaration "void *handle" primitive_type (pointer_declarator "*handle" * identifier)) , (parameter_declaration "debug_type_conflict type" type_identifier identifier) , (parameter_declaration "debug_type_real_list *list" type_identifier (pointer_declarator "*list" * identifier)) )))) (compound_statement "{\n  debug_name *type_00;\n  debug_type_real_list *pdVar1;\n  char *__format;\n  debug_type_conflict pdVar2;\n  debug_type_s *pdVar3;\n  debug_type_kind dVar4;\n  debug_type pdVar5;\n  bool bVar6;\n  debug_type_real_list rl;\n  \n  dVar4 = type->kind;\n  if ((DEBUG_KIND_TAGGED < dVar4) || ((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0)) {\n    return type;\n  }\n  if (list == (debug_type_real_list *)0x0) {\nLAB_0010d066:\n    rl.next = list;\n    rl.t = type;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);\n    }\n    else {\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }\n  }\n  else {\n    if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }\n    while (dVar4 == DEBUG_KIND_INDIRECT) {\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }\n    pdVar5 = (debug_type)0x0;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,pdVar5);\n    pdVar3 = (debug_type_s *)0x0;\n  }\n  return pdVar3;\n}" { (declaration "debug_name *type_00;" type_identifier (pointer_declarator "*type_00" * identifier) ;) (declaration "debug_type_real_list *pdVar1;" type_identifier (pointer_declarator "*pdVar1" * identifier) ;) (declaration "char *__format;" primitive_type (pointer_declarator "*__format" * identifier) ;) (declaration "debug_type_conflict pdVar2;" type_identifier identifier ;) (declaration "debug_type_s *pdVar3;" type_identifier (pointer_declarator "*pdVar3" * identifier) ;) (declaration "debug_type_kind dVar4;" type_identifier identifier ;) (declaration "debug_type pdVar5;" type_identifier identifier ;) (declaration "bool bVar6;" primitive_type identifier ;) (declaration "debug_type_real_list rl;" type_identifier identifier ;) (expression_statement "dVar4 = type->kind;" (assignment_expression "dVar4 = type->kind" identifier = (field_expression "type->kind" identifier -> field_identifier)) ;) (if_statement "if ((DEBUG_KIND_TAGGED < dVar4) || ((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0)) {\n    return type;\n  }" if (parenthesized_expression "((DEBUG_KIND_TAGGED < dVar4) || ((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0))" ( (binary_expression "(DEBUG_KIND_TAGGED < dVar4) || ((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0)" (parenthesized_expression "(DEBUG_KIND_TAGGED < dVar4)" ( (binary_expression "DEBUG_KIND_TAGGED < dVar4" identifier < identifier) )) || (parenthesized_expression "((1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0)" ( (binary_expression "(1L << ((byte)dVar4 & 0x3f) & 0xc00002U) == 0" (parenthesized_expression "(1L << ((byte)dVar4 & 0x3f) & 0xc00002U)" ( (binary_expression "1L << ((byte)dVar4 & 0x3f) & 0xc00002U" (binary_expression "1L << ((byte)dVar4 & 0x3f)" number_literal << (parenthesized_expression "((byte)dVar4 & 0x3f)" ( (binary_expression "(byte)dVar4 & 0x3f" (cast_expression "(byte)dVar4" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) & number_literal) )) == number_literal) ))) )) (compound_statement "{\n    return type;\n  }" { (return_statement "return type;" return identifier ;) })) (if_statement "if (list == (debug_type_real_list *)0x0) {\nLAB_0010d066:\n    rl.next = list;\n    rl.t = type;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);\n    }\n    else {\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }\n  }\n  else {\n    if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }\n    while (dVar4 == DEBUG_KIND_INDIRECT) {\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }\n    pdVar5 = (debug_type)0x0;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,pdVar5);\n    pdVar3 = (debug_type_s *)0x0;\n  }" if (parenthesized_expression "(list == (debug_type_real_list *)0x0)" ( (binary_expression "list == (debug_type_real_list *)0x0" identifier == (cast_expression "(debug_type_real_list *)0x0" ( (type_descriptor "debug_type_real_list *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\nLAB_0010d066:\n    rl.next = list;\n    rl.t = type;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);\n    }\n    else {\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }\n  }" { (labeled_statement "LAB_0010d066:\n    rl.next = list;" statement_identifier : (expression_statement "rl.next = list;" (assignment_expression "rl.next = list" (field_expression "rl.next" identifier . field_identifier) = identifier) ;)) (expression_statement "rl.t = type;" (assignment_expression "rl.t = type" (field_expression "rl.t" identifier . field_identifier) = identifier) ;) (if_statement "if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);\n    }\n    else {\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }" if (parenthesized_expression "(dVar4 - DEBUG_KIND_NAMED < 2)" ( (binary_expression "dVar4 - DEBUG_KIND_NAMED < 2" (binary_expression "dVar4 - DEBUG_KIND_NAMED" identifier - identifier) < number_literal) )) (compound_statement "{\n      pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);\n    }" { (expression_statement "pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl);" (assignment_expression "pdVar3 = debug_get_real_type(handle,((type->u).knamed)->type,&rl)" identifier = (call_expression "debug_get_real_type(handle,((type->u).knamed)->type,&rl)" identifier (argument_list "(handle,((type->u).knamed)->type,&rl)" ( identifier , (field_expression "((type->u).knamed)->type" (parenthesized_expression "((type->u).knamed)" ( (field_expression "(type->u).knamed" (parenthesized_expression "(type->u)" ( (field_expression "type->u" identifier -> field_identifier) )) . field_identifier) )) -> field_identifier) , (pointer_expression "&rl" & identifier) )))) ;) }) (else_clause "else {\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }" else (compound_statement "{\n      type_00 = ((type->u).knamed)->name->next;\n      if (type_00 == (debug_name *)0x0) {\n        return type;\n      }\n      pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);\n    }" { (expression_statement "type_00 = ((type->u).knamed)->name->next;" (assignment_expression "type_00 = ((type->u).knamed)->name->next" identifier = (field_expression "((type->u).knamed)->name->next" (field_expression "((type->u).knamed)->name" (parenthesized_expression "((type->u).knamed)" ( (field_expression "(type->u).knamed" (parenthesized_expression "(type->u)" ( (field_expression "type->u" identifier -> field_identifier) )) . field_identifier) )) -> field_identifier) -> field_identifier)) ;) (if_statement "if (type_00 == (debug_name *)0x0) {\n        return type;\n      }" if (parenthesized_expression "(type_00 == (debug_name *)0x0)" ( (binary_expression "type_00 == (debug_name *)0x0" identifier == (cast_expression "(debug_name *)0x0" ( (type_descriptor "debug_name *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n        return type;\n      }" { (return_statement "return type;" return identifier ;) })) (expression_statement "pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl);" (assignment_expression "pdVar3 = debug_get_real_type(handle,(debug_type_conflict)type_00,&rl)" identifier = (call_expression "debug_get_real_type(handle,(debug_type_conflict)type_00,&rl)" identifier (argument_list "(handle,(debug_type_conflict)type_00,&rl)" ( identifier , (cast_expression "(debug_type_conflict)type_00" ( (type_descriptor "debug_type_conflict" type_identifier) ) identifier) , (pointer_expression "&rl" & identifier) )))) ;) }))) }) (else_clause "else {\n    if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }\n    while (dVar4 == DEBUG_KIND_INDIRECT) {\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }\n    pdVar5 = (debug_type)0x0;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,pdVar5);\n    pdVar3 = (debug_type_s *)0x0;\n  }" else (compound_statement "{\n    if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }\n    while (dVar4 == DEBUG_KIND_INDIRECT) {\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }\n    pdVar5 = (debug_type)0x0;\n    if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,pdVar5);\n    pdVar3 = (debug_type_s *)0x0;\n  }" { (if_statement "if ((type != list->t) && (pdVar1 = list->next, list != list->next)) {\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }" if (parenthesized_expression "((type != list->t) && (pdVar1 = list->next, list != list->next))" ( (binary_expression "(type != list->t) && (pdVar1 = list->next, list != list->next)" (parenthesized_expression "(type != list->t)" ( (binary_expression "type != list->t" identifier != (field_expression "list->t" identifier -> field_identifier)) )) && (parenthesized_expression "(pdVar1 = list->next, list != list->next)" ( (comma_expression "pdVar1 = list->next, list != list->next" (assignment_expression "pdVar1 = list->next" identifier = (field_expression "list->next" identifier -> field_identifier)) , (binary_expression "list != list->next" identifier != (field_expression "list->next" identifier -> field_identifier))) ))) )) (compound_statement "{\n      do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );\n    }" { (do_statement "do {\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      } while ((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              );" do (compound_statement "{\n        if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;\n      }" { (if_statement "if (pdVar1 == (debug_type_real_list *)0x0) goto LAB_0010d066;" if (parenthesized_expression "(pdVar1 == (debug_type_real_list *)0x0)" ( (binary_expression "pdVar1 == (debug_type_real_list *)0x0" identifier == (cast_expression "(debug_type_real_list *)0x0" ( (type_descriptor "debug_type_real_list *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (goto_statement "goto LAB_0010d066;" goto statement_identifier ;)) }) while (parenthesized_expression "((pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)\n              )" ( (binary_expression "(pdVar1->t != type) && (bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)" (parenthesized_expression "(pdVar1->t != type)" ( (binary_expression "pdVar1->t != type" (field_expression "pdVar1->t" identifier -> field_identifier) != identifier) )) && (parenthesized_expression "(bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6)" ( (comma_expression "bVar6 = pdVar1->next != pdVar1, pdVar1 = pdVar1->next, bVar6" (assignment_expression "bVar6 = pdVar1->next != pdVar1" identifier = (binary_expression "pdVar1->next != pdVar1" (field_expression "pdVar1->next" identifier -> field_identifier) != identifier)) , (comma_expression "pdVar1 = pdVar1->next, bVar6" (assignment_expression "pdVar1 = pdVar1->next" identifier = (field_expression "pdVar1->next" identifier -> field_identifier)) , identifier)) ))) )) ;) })) (while_statement "while (dVar4 == DEBUG_KIND_INDIRECT) {\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }" while (parenthesized_expression "(dVar4 == DEBUG_KIND_INDIRECT)" ( (binary_expression "dVar4 == DEBUG_KIND_INDIRECT" identifier == identifier) )) (compound_statement "{\n      pdVar2 = (debug_type_conflict)(type->u).kindirect;\n      type = **(debug_type_conflict **)&pdVar2->kind;\n      if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;\n      dVar4 = type->kind;\n    }" { (expression_statement "pdVar2 = (debug_type_conflict)(type->u).kindirect;" (assignment_expression "pdVar2 = (debug_type_conflict)(type->u).kindirect" identifier = (field_expression "(debug_type_conflict)(type->u).kindirect" (call_expression "(debug_type_conflict)(type->u)" (parenthesized_expression "(debug_type_conflict)" ( identifier )) (argument_list "(type->u)" ( (field_expression "type->u" identifier -> field_identifier) ))) . field_identifier)) ;) (expression_statement "type = **(debug_type_conflict **)&pdVar2->kind;" (assignment_expression "type = **(debug_type_conflict **)&pdVar2->kind" identifier = (pointer_expression "**(debug_type_conflict **)&pdVar2->kind" * (pointer_expression "*(debug_type_conflict **)&pdVar2->kind" * (cast_expression "(debug_type_conflict **)&pdVar2->kind" ( (type_descriptor "debug_type_conflict **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (pointer_expression "&pdVar2->kind" & (field_expression "pdVar2->kind" identifier -> field_identifier)))))) ;) (if_statement "if (type == (debug_type_conflict)0x0) goto LAB_0010d0f7;" if (parenthesized_expression "(type == (debug_type_conflict)0x0)" ( (binary_expression "type == (debug_type_conflict)0x0" identifier == (cast_expression "(debug_type_conflict)0x0" ( (type_descriptor "debug_type_conflict" type_identifier) ) number_literal)) )) (goto_statement "goto LAB_0010d0f7;" goto statement_identifier ;)) (expression_statement "dVar4 = type->kind;" (assignment_expression "dVar4 = type->kind" identifier = (field_expression "type->kind" identifier -> field_identifier)) ;) })) (expression_statement "pdVar5 = (debug_type)0x0;" (assignment_expression "pdVar5 = (debug_type)0x0" identifier = (cast_expression "(debug_type)0x0" ( (type_descriptor "debug_type" type_identifier) ) number_literal)) ;) (if_statement "if (dVar4 - DEBUG_KIND_NAMED < 2) {\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }" if (parenthesized_expression "(dVar4 - DEBUG_KIND_NAMED < 2)" ( (binary_expression "dVar4 - DEBUG_KIND_NAMED < 2" (binary_expression "dVar4 - DEBUG_KIND_NAMED" identifier - identifier) < number_literal) )) (compound_statement "{\n      pdVar2 = ((type->u).kfunction)->return_type;\nLAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;\n    }" { (expression_statement "pdVar2 = ((type->u).kfunction)->return_type;" (assignment_expression "pdVar2 = ((type->u).kfunction)->return_type" identifier = (field_expression "((type->u).kfunction)->return_type" (parenthesized_expression "((type->u).kfunction)" ( (field_expression "(type->u).kfunction" (parenthesized_expression "(type->u)" ( (field_expression "type->u" identifier -> field_identifier) )) . field_identifier) )) -> field_identifier)) ;) (labeled_statement "LAB_0010d0f7:\n      pdVar5 = pdVar2->pointer;" statement_identifier : (expression_statement "pdVar5 = pdVar2->pointer;" (assignment_expression "pdVar5 = pdVar2->pointer" identifier = (field_expression "pdVar2->pointer" identifier -> field_identifier)) ;)) })) (expression_statement "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);" (assignment_expression "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" identifier = (cast_expression "(char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (call_expression "dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" identifier (argument_list "(0,"debug_get_real_type: circular debug information for %s\n",5)" ( number_literal , (string_literal ""debug_get_real_type: circular debug information for %s\n"" " string_content escape_sequence ") , number_literal ))))) ;) (expression_statement "fprintf(stderr,__format,pdVar5);" (call_expression "fprintf(stderr,__format,pdVar5)" identifier (argument_list "(stderr,__format,pdVar5)" ( identifier , identifier , identifier ))) ;) (expression_statement "pdVar3 = (debug_type_s *)0x0;" (assignment_expression "pdVar3 = (debug_type_s *)0x0" identifier = (cast_expression "(debug_type_s *)0x0" ( (type_descriptor "debug_type_s *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) }))) (return_statement "return pdVar3;" return identifier ;) })))
(translation_unit "uint * FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)\n\n{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}\n\n" (function_definition "uint * FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)\n\n{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}" type_identifier (pointer_declarator "* FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)" * (function_declarator "FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)" identifier (parameter_list "(undefined8 param_1,uint *param_2,long *param_3)" ( (parameter_declaration "undefined8 param_1" type_identifier identifier) , (parameter_declaration "uint *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) )))) (compound_statement "{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "long *plVar2;" (sized_type_specifier "long" long) (pointer_declarator "*plVar2" * identifier) ;) (declaration "char *__format;" primitive_type (pointer_declarator "*__format" * identifier) ;) (declaration "undefined8 *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (declaration "uint *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "uint uVar5;" type_identifier identifier ;) (declaration "undefined8 uVar6;" type_identifier identifier ;) (declaration "bool bVar7;" primitive_type identifier ;) (declaration "long *local_18;" (sized_type_specifier "long" long) (pointer_declarator "*local_18" * identifier) ;) (declaration "uint *local_10;" type_identifier (pointer_declarator "*local_10" * identifier) ;) (expression_statement "uVar5 = *param_2;" (assignment_expression "uVar5 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (if_statement "if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }" if (parenthesized_expression "((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0))" ( (binary_expression "(0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)" (parenthesized_expression "(0x17 < uVar5)" ( (binary_expression "0x17 < uVar5" number_literal < identifier) )) || (parenthesized_expression "((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)" ( (binary_expression "(1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0" (parenthesized_expression "(1L << ((byte)uVar5 & 0x3f) & 0xc00002U)" ( (binary_expression "1L << ((byte)uVar5 & 0x3f) & 0xc00002U" (binary_expression "1L << ((byte)uVar5 & 0x3f)" number_literal << (parenthesized_expression "((byte)uVar5 & 0x3f)" ( (binary_expression "(byte)uVar5 & 0x3f" (cast_expression "(byte)uVar5" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) & number_literal) )) == number_literal) ))) )) (compound_statement "{\n    return param_2;\n  }" { (return_statement "return param_2;" return identifier ;) })) (if_statement "if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\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 "{\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }" { (labeled_statement "LAB_0010d066:\n    local_18 = param_3;" statement_identifier : (expression_statement "local_18 = param_3;" (assignment_expression "local_18 = param_3" identifier = identifier) ;)) (expression_statement "local_10 = param_2;" (assignment_expression "local_10 = param_2" identifier = identifier) ;) (if_statement "if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" if (parenthesized_expression "(uVar5 - 0x16 < 2)" ( (binary_expression "uVar5 - 0x16 < 2" (binary_expression "uVar5 - 0x16" identifier - number_literal) < number_literal) )) (compound_statement "{\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }" { (expression_statement "puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);" (assignment_expression "puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" identifier = (cast_expression "(uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" identifier (argument_list "(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" ( identifier , (subscript_expression "(*(undefined8 **)(param_2 + 4))[1]" (parenthesized_expression "(*(undefined8 **)(param_2 + 4))" ( (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) )))) )) [ number_literal ]) , (pointer_expression "&local_18" & identifier) ))))) ;) }) (else_clause "else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" else (compound_statement "{\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" { (expression_statement "lVar1 = *(long *)**(undefined8 **)(param_2 + 4);" (assignment_expression "lVar1 = *(long *)**(undefined8 **)(param_2 + 4)" identifier = (pointer_expression "*(long *)**(undefined8 **)(param_2 + 4)" * (cast_expression "(long *)**(undefined8 **)(param_2 + 4)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "**(undefined8 **)(param_2 + 4)" * (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) )))))))) ;) (if_statement "if (lVar1 == 0) {\n        return param_2;\n      }" if (parenthesized_expression "(lVar1 == 0)" ( (binary_expression "lVar1 == 0" identifier == number_literal) )) (compound_statement "{\n        return param_2;\n      }" { (return_statement "return param_2;" return identifier ;) })) (expression_statement "puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);" (assignment_expression "puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18)" identifier = (cast_expression "(uint *)FUN_0010d010(param_1,lVar1,&local_18)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "FUN_0010d010(param_1,lVar1,&local_18)" identifier (argument_list "(param_1,lVar1,&local_18)" ( identifier , identifier , (pointer_expression "&local_18" & identifier) ))))) ;) }))) }) (else_clause "else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }" else (compound_statement "{\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }" { (if_statement "if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }" if (parenthesized_expression "((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))" ( (binary_expression "(param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3)" (parenthesized_expression "(param_2 != (uint *)param_3[1])" ( (binary_expression "param_2 != (uint *)param_3[1]" identifier != (cast_expression "(uint *)param_3[1]" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "param_3[1]" identifier [ number_literal ]))) )) && (parenthesized_expression "(plVar2 = (long *)*param_3, param_3 != (long *)*param_3)" ( (comma_expression "plVar2 = (long *)*param_3, param_3 != (long *)*param_3" (assignment_expression "plVar2 = (long *)*param_3" identifier = (cast_expression "(long *)*param_3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_3" * identifier))) , (binary_expression "param_3 != (long *)*param_3" identifier != (cast_expression "(long *)*param_3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_3" * identifier)))) ))) )) (compound_statement "{\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }" { (do_statement "do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));" do (compound_statement "{\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      }" { (if_statement "if (plVar2 == (long *)0x0) goto LAB_0010d066;" if (parenthesized_expression "(plVar2 == (long *)0x0)" ( (binary_expression "plVar2 == (long *)0x0" identifier == (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (goto_statement "goto LAB_0010d066;" goto statement_identifier ;)) }) while (parenthesized_expression "(((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7))" ( (binary_expression "((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7)" (parenthesized_expression "((uint *)plVar2[1] != param_2)" ( (binary_expression "(uint *)plVar2[1] != param_2" (cast_expression "(uint *)plVar2[1]" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar2[1]" identifier [ number_literal ])) != identifier) )) && (parenthesized_expression "(bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7)" ( (comma_expression "bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7" (assignment_expression "bVar7 = (long *)*plVar2 != plVar2" identifier = (binary_expression "(long *)*plVar2 != plVar2" (cast_expression "(long *)*plVar2" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar2" * identifier)) != identifier)) , (comma_expression "plVar2 = (long *)*plVar2, bVar7" (assignment_expression "plVar2 = (long *)*plVar2" identifier = (cast_expression "(long *)*plVar2" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar2" * identifier))) , identifier)) ))) )) ;) })) (while_statement "while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }" while (parenthesized_expression "(uVar5 == 1)" ( (binary_expression "uVar5 == 1" identifier == number_literal) )) (compound_statement "{\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }" { (expression_statement "puVar3 = *(undefined8 **)(param_2 + 4);" (assignment_expression "puVar3 = *(undefined8 **)(param_2 + 4)" identifier = (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) ))))) ;) (expression_statement "param_2 = *(uint **)*puVar3;" (assignment_expression "param_2 = *(uint **)*puVar3" identifier = (pointer_expression "*(uint **)*puVar3" * (cast_expression "(uint **)*puVar3" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (pointer_expression "*puVar3" * identifier)))) ;) (if_statement "if (param_2 == (uint *)0x0) goto LAB_0010d0f7;" if (parenthesized_expression "(param_2 == (uint *)0x0)" ( (binary_expression "param_2 == (uint *)0x0" identifier == (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (goto_statement "goto LAB_0010d0f7;" goto statement_identifier ;)) (expression_statement "uVar5 = *param_2;" (assignment_expression "uVar5 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) })) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" identifier = number_literal) ;) (if_statement "if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }" if (parenthesized_expression "(uVar5 - 0x16 < 2)" ( (binary_expression "uVar5 - 0x16 < 2" (binary_expression "uVar5 - 0x16" identifier - number_literal) < number_literal) )) (compound_statement "{\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }" { (expression_statement "puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);" (assignment_expression "puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4)" identifier = (cast_expression "(undefined8 *)**(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "**(undefined8 **)(param_2 + 4)" * (pointer_expression "*(undefined8 **)(param_2 + 4)" * (cast_expression "(undefined8 **)(param_2 + 4)" ( (type_descriptor "undefined8 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 4)" ( (binary_expression "param_2 + 4" identifier + number_literal) ))))))) ;) (labeled_statement "LAB_0010d0f7:\n      uVar6 = puVar3[1];" statement_identifier : (expression_statement "uVar6 = puVar3[1];" (assignment_expression "uVar6 = puVar3[1]" identifier = (subscript_expression "puVar3[1]" identifier [ number_literal ])) ;)) })) (expression_statement "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);" (assignment_expression "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" identifier = (cast_expression "(char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (call_expression "dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" identifier (argument_list "(0,"debug_get_real_type: circular debug information for %s\n",5)" ( number_literal , (string_literal ""debug_get_real_type: circular debug information for %s\n"" " string_content escape_sequence ") , number_literal ))))) ;) (expression_statement "fprintf(stderr,__format,uVar6);" (call_expression "fprintf(stderr,__format,uVar6)" identifier (argument_list "(stderr,__format,uVar6)" ( identifier , identifier , identifier ))) ;) (expression_statement "puVar4 = (uint *)0x0;" (assignment_expression "puVar4 = (uint *)0x0" identifier = (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ;) }))) (return_statement "return puVar4;" return identifier ;) })))
(translation_unit (function_definition TYPE (pointer_declarator * (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) )))) (compound_statement { (declaration (sized_type_specifier long) IDENT ;) (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression LIT < IDENT) )) || (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (binary_expression LIT << (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) & LIT) ))) & LIT) )) == LIT) ))) )) (compound_statement { (return_statement return IDENT ;) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (labeled_statement statement_identifier : (expression_statement (assignment_expression IDENT = IDENT) ;)) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_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 ( IDENT , (subscript_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) )) [ LIT ]) , (pointer_expression & IDENT) ))))) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (return_statement return IDENT ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression IDENT (argument_list ( IDENT , IDENT , (pointer_expression & IDENT) ))))) ;) }))) }) (else_clause else (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) , (binary_expression IDENT != (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT)))) ))) )) (compound_statement { (do_statement do (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT)) )) (goto_statement goto statement_identifier ;)) }) while (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ])) != IDENT) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT)) != IDENT)) , (comma_expression (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) , IDENT)) ))) )) ;) })) (while_statement while (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (pointer_expression * IDENT)))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (goto_statement goto statement_identifier ;)) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) })) (expression_statement (assignment_expression IDENT = LIT) ;) (if_statement if (parenthesized_expression ( (binary_expression (binary_expression IDENT - LIT) < LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))))) ;) (labeled_statement statement_identifier : (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;)) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression IDENT (argument_list ( LIT , (string_literal " string_content escape_sequence ") , LIT ))))) ;) (expression_statement (call_expression IDENT (argument_list ( IDENT , IDENT , IDENT ))) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) ;) }))) (return_statement return IDENT ;) })))
(function_definition "uint * FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)\n\n{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}" (type_identifier "uint") (pointer_declarator "* FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)" (* "*") (function_declarator "FUN_0010d010(undefined8 param_1,uint *param_2,long *param_3)" (identifier "FUN_0010d010") (parameter_list "(undefined8 param_1,uint *param_2,long *param_3)" (( "(") (parameter_declaration "undefined8 param_1" (type_identifier "undefined8") (identifier "param_1")) (, ",") (parameter_declaration "uint *param_2" (type_identifier "uint") (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"))) () ")")))) (compound_statement "{\n  long lVar1;\n  long *plVar2;\n  char *__format;\n  undefined8 *puVar3;\n  uint *puVar4;\n  uint uVar5;\n  undefined8 uVar6;\n  bool bVar7;\n  long *local_18;\n  uint *local_10;\n  \n  uVar5 = *param_2;\n  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }\n  if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }\n  return puVar4;\n}" ({ "{") (declaration "long lVar1;" (sized_type_specifier "long" (long "long")) (identifier "lVar1") (; ";")) (declaration "long *plVar2;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*plVar2" (* "*") (identifier "plVar2")) (; ";")) (declaration "char *__format;" (primitive_type "char") (pointer_declarator "*__format" (* "*") (identifier "__format")) (; ";")) (declaration "undefined8 *puVar3;" (type_identifier "undefined8") (pointer_declarator "*puVar3" (* "*") (identifier "puVar3")) (; ";")) (declaration "uint *puVar4;" (type_identifier "uint") (pointer_declarator "*puVar4" (* "*") (identifier "puVar4")) (; ";")) (declaration "uint uVar5;" (type_identifier "uint") (identifier "uVar5") (; ";")) (declaration "undefined8 uVar6;" (type_identifier "undefined8") (identifier "uVar6") (; ";")) (declaration "bool bVar7;" (primitive_type "bool") (identifier "bVar7") (; ";")) (declaration "long *local_18;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*local_18" (* "*") (identifier "local_18")) (; ";")) (declaration "uint *local_10;" (type_identifier "uint") (pointer_declarator "*local_10" (* "*") (identifier "local_10")) (; ";")) (expression_statement "uVar5 = *param_2;" (assignment_expression "uVar5 = *param_2" (identifier "uVar5") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (if_statement "if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {\n    return param_2;\n  }" (if "if") (parenthesized_expression "((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0))" (( "(") (binary_expression "(0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)" (parenthesized_expression "(0x17 < uVar5)" (( "(") (binary_expression "0x17 < uVar5" (number_literal "0x17") (< "<") (identifier "uVar5")) () ")")) (|| "||") (parenthesized_expression "((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)" (( "(") (binary_expression "(1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0" (parenthesized_expression "(1L << ((byte)uVar5 & 0x3f) & 0xc00002U)" (( "(") (binary_expression "1L << ((byte)uVar5 & 0x3f) & 0xc00002U" (binary_expression "1L << ((byte)uVar5 & 0x3f)" (number_literal "1L") (<< "<<") (parenthesized_expression "((byte)uVar5 & 0x3f)" (( "(") (binary_expression "(byte)uVar5 & 0x3f" (cast_expression "(byte)uVar5" (( "(") (type_descriptor "byte" (type_identifier "byte")) () ")") (identifier "uVar5")) (& "&") (number_literal "0x3f")) () ")"))) (& "&") (number_literal "0xc00002U")) () ")")) (== "==") (number_literal "0")) () ")"))) () ")")) (compound_statement "{\n    return param_2;\n  }" ({ "{") (return_statement "return param_2;" (return "return") (identifier "param_2") (; ";")) (} "}"))) (if_statement "if (param_3 == (long *)0x0) {\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }\n  else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\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 "{\nLAB_0010d066:\n    local_18 = param_3;\n    local_10 = param_2;\n    if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }\n  }" ({ "{") (labeled_statement "LAB_0010d066:\n    local_18 = param_3;" (statement_identifier "LAB_0010d066") (: ":") (expression_statement "local_18 = param_3;" (assignment_expression "local_18 = param_3" (identifier "local_18") (= "=") (identifier "param_3")) (; ";"))) (expression_statement "local_10 = param_2;" (assignment_expression "local_10 = param_2" (identifier "local_10") (= "=") (identifier "param_2")) (; ";")) (if_statement "if (uVar5 - 0x16 < 2) {\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }\n    else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" (if "if") (parenthesized_expression "(uVar5 - 0x16 < 2)" (( "(") (binary_expression "uVar5 - 0x16 < 2" (binary_expression "uVar5 - 0x16" (identifier "uVar5") (- "-") (number_literal "0x16")) (< "<") (number_literal "2")) () ")")) (compound_statement "{\n      puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);\n    }" ({ "{") (expression_statement "puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);" (assignment_expression "puVar4 = (uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" (identifier "puVar4") (= "=") (cast_expression "(uint *)FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "FUN_0010d010(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" (identifier "FUN_0010d010") (argument_list "(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18)" (( "(") (identifier "param_1") (, ",") (subscript_expression "(*(undefined8 **)(param_2 + 4))[1]" (parenthesized_expression "(*(undefined8 **)(param_2 + 4))" (( "(") (pointer_expression "*(undefined8 **)(param_2 + 4)" (* "*") (cast_expression "(undefined8 **)(param_2 + 4)" (( "(") (type_descriptor "undefined8 **" (type_identifier "undefined8") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_2 + 4)" (( "(") (binary_expression "param_2 + 4" (identifier "param_2") (+ "+") (number_literal "4")) () ")")))) () ")")) ([ "[") (number_literal "1") (] "]")) (, ",") (pointer_expression "&local_18" (& "&") (identifier "local_18")) () ")"))))) (; ";")) (} "}")) (else_clause "else {\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" (else "else") (compound_statement "{\n      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);\n      if (lVar1 == 0) {\n        return param_2;\n      }\n      puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);\n    }" ({ "{") (expression_statement "lVar1 = *(long *)**(undefined8 **)(param_2 + 4);" (assignment_expression "lVar1 = *(long *)**(undefined8 **)(param_2 + 4)" (identifier "lVar1") (= "=") (pointer_expression "*(long *)**(undefined8 **)(param_2 + 4)" (* "*") (cast_expression "(long *)**(undefined8 **)(param_2 + 4)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "**(undefined8 **)(param_2 + 4)" (* "*") (pointer_expression "*(undefined8 **)(param_2 + 4)" (* "*") (cast_expression "(undefined8 **)(param_2 + 4)" (( "(") (type_descriptor "undefined8 **" (type_identifier "undefined8") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_2 + 4)" (( "(") (binary_expression "param_2 + 4" (identifier "param_2") (+ "+") (number_literal "4")) () ")")))))))) (; ";")) (if_statement "if (lVar1 == 0) {\n        return param_2;\n      }" (if "if") (parenthesized_expression "(lVar1 == 0)" (( "(") (binary_expression "lVar1 == 0" (identifier "lVar1") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n        return param_2;\n      }" ({ "{") (return_statement "return param_2;" (return "return") (identifier "param_2") (; ";")) (} "}"))) (expression_statement "puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18);" (assignment_expression "puVar4 = (uint *)FUN_0010d010(param_1,lVar1,&local_18)" (identifier "puVar4") (= "=") (cast_expression "(uint *)FUN_0010d010(param_1,lVar1,&local_18)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "FUN_0010d010(param_1,lVar1,&local_18)" (identifier "FUN_0010d010") (argument_list "(param_1,lVar1,&local_18)" (( "(") (identifier "param_1") (, ",") (identifier "lVar1") (, ",") (pointer_expression "&local_18" (& "&") (identifier "local_18")) () ")"))))) (; ";")) (} "}")))) (} "}")) (else_clause "else {\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }" (else "else") (compound_statement "{\n    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }\n    while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }\n    uVar6 = 0;\n    if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }\n    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);\n    fprintf(stderr,__format,uVar6);\n    puVar4 = (uint *)0x0;\n  }" ({ "{") (if_statement "if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))\n    {\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }" (if "if") (parenthesized_expression "((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))" (( "(") (binary_expression "(param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3)" (parenthesized_expression "(param_2 != (uint *)param_3[1])" (( "(") (binary_expression "param_2 != (uint *)param_3[1]" (identifier "param_2") (!= "!=") (cast_expression "(uint *)param_3[1]" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "param_3[1]" (identifier "param_3") ([ "[") (number_literal "1") (] "]")))) () ")")) (&& "&&") (parenthesized_expression "(plVar2 = (long *)*param_3, param_3 != (long *)*param_3)" (( "(") (comma_expression "plVar2 = (long *)*param_3, param_3 != (long *)*param_3" (assignment_expression "plVar2 = (long *)*param_3" (identifier "plVar2") (= "=") (cast_expression "(long *)*param_3" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_3" (* "*") (identifier "param_3")))) (, ",") (binary_expression "param_3 != (long *)*param_3" (identifier "param_3") (!= "!=") (cast_expression "(long *)*param_3" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_3" (* "*") (identifier "param_3"))))) () ")"))) () ")")) (compound_statement "{\n      do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));\n    }" ({ "{") (do_statement "do {\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      } while (((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));" (do "do") (compound_statement "{\n        if (plVar2 == (long *)0x0) goto LAB_0010d066;\n      }" ({ "{") (if_statement "if (plVar2 == (long *)0x0) goto LAB_0010d066;" (if "if") (parenthesized_expression "(plVar2 == (long *)0x0)" (( "(") (binary_expression "plVar2 == (long *)0x0" (identifier "plVar2") (== "==") (cast_expression "(long *)0x0" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (goto_statement "goto LAB_0010d066;" (goto "goto") (statement_identifier "LAB_0010d066") (; ";"))) (} "}")) (while "while") (parenthesized_expression "(((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7))" (( "(") (binary_expression "((uint *)plVar2[1] != param_2) &&\n              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7)" (parenthesized_expression "((uint *)plVar2[1] != param_2)" (( "(") (binary_expression "(uint *)plVar2[1] != param_2" (cast_expression "(uint *)plVar2[1]" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar2[1]" (identifier "plVar2") ([ "[") (number_literal "1") (] "]"))) (!= "!=") (identifier "param_2")) () ")")) (&& "&&") (parenthesized_expression "(bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7)" (( "(") (comma_expression "bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7" (assignment_expression "bVar7 = (long *)*plVar2 != plVar2" (identifier "bVar7") (= "=") (binary_expression "(long *)*plVar2 != plVar2" (cast_expression "(long *)*plVar2" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*plVar2" (* "*") (identifier "plVar2"))) (!= "!=") (identifier "plVar2"))) (, ",") (comma_expression "plVar2 = (long *)*plVar2, bVar7" (assignment_expression "plVar2 = (long *)*plVar2" (identifier "plVar2") (= "=") (cast_expression "(long *)*plVar2" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*plVar2" (* "*") (identifier "plVar2")))) (, ",") (identifier "bVar7"))) () ")"))) () ")")) (; ";")) (} "}"))) (while_statement "while (uVar5 == 1) {\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }" (while "while") (parenthesized_expression "(uVar5 == 1)" (( "(") (binary_expression "uVar5 == 1" (identifier "uVar5") (== "==") (number_literal "1")) () ")")) (compound_statement "{\n      puVar3 = *(undefined8 **)(param_2 + 4);\n      param_2 = *(uint **)*puVar3;\n      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;\n      uVar5 = *param_2;\n    }" ({ "{") (expression_statement "puVar3 = *(undefined8 **)(param_2 + 4);" (assignment_expression "puVar3 = *(undefined8 **)(param_2 + 4)" (identifier "puVar3") (= "=") (pointer_expression "*(undefined8 **)(param_2 + 4)" (* "*") (cast_expression "(undefined8 **)(param_2 + 4)" (( "(") (type_descriptor "undefined8 **" (type_identifier "undefined8") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_2 + 4)" (( "(") (binary_expression "param_2 + 4" (identifier "param_2") (+ "+") (number_literal "4")) () ")"))))) (; ";")) (expression_statement "param_2 = *(uint **)*puVar3;" (assignment_expression "param_2 = *(uint **)*puVar3" (identifier "param_2") (= "=") (pointer_expression "*(uint **)*puVar3" (* "*") (cast_expression "(uint **)*puVar3" (( "(") (type_descriptor "uint **" (type_identifier "uint") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (pointer_expression "*puVar3" (* "*") (identifier "puVar3"))))) (; ";")) (if_statement "if (param_2 == (uint *)0x0) goto LAB_0010d0f7;" (if "if") (parenthesized_expression "(param_2 == (uint *)0x0)" (( "(") (binary_expression "param_2 == (uint *)0x0" (identifier "param_2") (== "==") (cast_expression "(uint *)0x0" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (goto_statement "goto LAB_0010d0f7;" (goto "goto") (statement_identifier "LAB_0010d0f7") (; ";"))) (expression_statement "uVar5 = *param_2;" (assignment_expression "uVar5 = *param_2" (identifier "uVar5") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (} "}"))) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" (identifier "uVar6") (= "=") (number_literal "0")) (; ";")) (if_statement "if (uVar5 - 0x16 < 2) {\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }" (if "if") (parenthesized_expression "(uVar5 - 0x16 < 2)" (( "(") (binary_expression "uVar5 - 0x16 < 2" (binary_expression "uVar5 - 0x16" (identifier "uVar5") (- "-") (number_literal "0x16")) (< "<") (number_literal "2")) () ")")) (compound_statement "{\n      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);\nLAB_0010d0f7:\n      uVar6 = puVar3[1];\n    }" ({ "{") (expression_statement "puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);" (assignment_expression "puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4)" (identifier "puVar3") (= "=") (cast_expression "(undefined8 *)**(undefined8 **)(param_2 + 4)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "**(undefined8 **)(param_2 + 4)" (* "*") (pointer_expression "*(undefined8 **)(param_2 + 4)" (* "*") (cast_expression "(undefined8 **)(param_2 + 4)" (( "(") (type_descriptor "undefined8 **" (type_identifier "undefined8") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_2 + 4)" (( "(") (binary_expression "param_2 + 4" (identifier "param_2") (+ "+") (number_literal "4")) () ")"))))))) (; ";")) (labeled_statement "LAB_0010d0f7:\n      uVar6 = puVar3[1];" (statement_identifier "LAB_0010d0f7") (: ":") (expression_statement "uVar6 = puVar3[1];" (assignment_expression "uVar6 = puVar3[1]" (identifier "uVar6") (= "=") (subscript_expression "puVar3[1]" (identifier "puVar3") ([ "[") (number_literal "1") (] "]"))) (; ";"))) (} "}"))) (expression_statement "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);" (assignment_expression "__format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" (identifier "__format") (= "=") (cast_expression "(char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5)" (identifier "dcgettext") (argument_list "(0,"debug_get_real_type: circular debug information for %s\n",5)" (( "(") (number_literal "0") (, ",") (string_literal ""debug_get_real_type: circular debug information for %s\n"" (" """) (string_content "debug_get_real_type: circular debug information for %s") (escape_sequence "\n") (" """)) (, ",") (number_literal "5") () ")"))))) (; ";")) (expression_statement "fprintf(stderr,__format,uVar6);" (call_expression "fprintf(stderr,__format,uVar6)" (identifier "fprintf") (argument_list "(stderr,__format,uVar6)" (( "(") (identifier "stderr") (, ",") (identifier "__format") (, ",") (identifier "uVar6") () ")"))) (; ";")) (expression_statement "puVar4 = (uint *)0x0;" (assignment_expression "puVar4 = (uint *)0x0" (identifier "puVar4") (= "=") (cast_expression "(uint *)0x0" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) (; ";")) (} "}")))) (return_statement "return puVar4;" (return "return") (identifier "puVar4") (; ";")) (} "}")))

type_1 * function_1(void *handle,type_2 var_6,type_3 *var_3)

{
  type_4 *var_5;
  type_3 *var_7;
  char *__format;
  type_2 pdVar2;
  type_1 *pdVar3;
  type_5 var_2;
  type_6 pdVar5;
  bool bVar6;
  type_3 rl;
  
  var_2 = var_6->kind;
  if ((var_1 < var_2) || ((1L << ((type_7)var_2 & 0x3f) & 0xc00002U) == 0)) {
    return var_6;
  }
  if (var_3 == (type_3 *)0x0) {
LAB_0010d066:
    rl.next = var_3;
    rl.t = var_6;
    if (var_2 - var_4 < 2) {
      pdVar3 = function_1(handle,((var_6->u).knamed)->var_6,&rl);
    }
    else {
      var_5 = ((var_6->u).knamed)->name->next;
      if (var_5 == (type_4 *)0x0) {
        return var_6;
      }
      pdVar3 = function_1(handle,(type_2)var_5,&rl);
    }
  }
  else {
    if ((var_6 != var_3->t) && (var_7 = var_3->next, var_3 != var_3->next)) {
      do {
        if (var_7 == (type_3 *)0x0) goto LAB_0010d066;
      } while ((var_7->t != var_6) && (bVar6 = var_7->next != var_7, var_7 = var_7->next, bVar6)
              );
    }
    while (var_2 == var_8) {
      pdVar2 = (type_2)(var_6->u).kindirect;
      var_6 = **(type_2 **)&pdVar2->kind;
      if (var_6 == (type_2)0x0) goto LAB_0010d0f7;
      var_2 = var_6->kind;
    }
    pdVar5 = (type_6)0x0;
    if (var_2 - var_4 < 2) {
      pdVar2 = ((var_6->u).kfunction)->return_type;
LAB_0010d0f7:
      pdVar5 = pdVar2->pointer;
    }
    __format = (char *)var_9(0,"debug_get_real_type: circular debug information for %s\n",5);
    var_10(stderr,__format,pdVar5);
    pdVar3 = (type_1 *)0x0;
  }
  return pdVar3;
}


(translation_unit (function_definition type: (type_identifier) declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier)))))) body: (compound_statement (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) right: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (binary_expression left: (number_literal) right: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))) right: (number_literal))) right: (number_literal))))) consequence: (compound_statement (return_statement (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 (labeled_statement label: (statement_identifier) (expression_statement (assignment_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (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 (identifier) (subscript_expression argument: (parenthesized_expression (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)))))) index: (number_literal)) (pointer_expression argument: (identifier)))))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (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)))))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (return_statement (identifier)))) (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 (identifier) (identifier) (pointer_expression argument: (identifier))))))))))) alternative: (else_clause (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier)))) right: (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier)))))))) consequence: (compound_statement (do_statement body: (compound_statement (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: (goto_statement label: (statement_identifier)))) condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))) right: (identifier))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))) right: (identifier))) right: (comma_expression left: (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier)))) right: (identifier))))))))) (while_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (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))))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (pointer_expression argument: (identifier)))))) (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: (goto_statement label: (statement_identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (if_statement condition: (parenthesized_expression (binary_expression left: (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: (pointer_expression argument: (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))))))))) (labeled_statement label: (statement_identifier) (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal))))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (call_expression function: (identifier) arguments: (argument_list (number_literal) (string_literal (string_content) (escape_sequence)) (number_literal)))))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (identifier) (identifier) (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal))))))) (return_statement (identifier)))))

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

{
  long lVar1;
  long *plVar2;
  char *__format;
  undefined8 *puVar3;
  uint *puVar4;
  uint uVar5;
  undefined8 uVar6;
  bool bVar7;
  long *local_18;
  uint *local_10;
  
  uVar5 = *param_2;
  if ((0x17 < uVar5) || ((1L << ((byte)uVar5 & 0x3f) & 0xc00002U) == 0)) {
    return param_2;
  }
  if (param_3 == (long *)0x0) {
LAB_0010d066:
    local_18 = param_3;
    local_10 = param_2;
    if (uVar5 - 0x16 < 2) {
      puVar4 = (uint *)MASKED(param_1,(*(undefined8 **)(param_2 + 4))[1],&local_18);
    }
    else {
      lVar1 = *(long *)**(undefined8 **)(param_2 + 4);
      if (lVar1 == 0) {
        return param_2;
      }
      puVar4 = (uint *)MASKED(param_1,lVar1,&local_18);
    }
  }
  else {
    if ((param_2 != (uint *)param_3[1]) && (plVar2 = (long *)*param_3, param_3 != (long *)*param_3))
    {
      do {
        if (plVar2 == (long *)0x0) goto LAB_0010d066;
      } while (((uint *)plVar2[1] != param_2) &&
              (bVar7 = (long *)*plVar2 != plVar2, plVar2 = (long *)*plVar2, bVar7));
    }
    while (uVar5 == 1) {
      puVar3 = *(undefined8 **)(param_2 + 4);
      param_2 = *(uint **)*puVar3;
      if (param_2 == (uint *)0x0) goto LAB_0010d0f7;
      uVar5 = *param_2;
    }
    uVar6 = 0;
    if (uVar5 - 0x16 < 2) {
      puVar3 = (undefined8 *)**(undefined8 **)(param_2 + 4);
LAB_0010d0f7:
      uVar6 = puVar3[1];
    }
    __format = (char *)dcgettext(0,"debug_get_real_type: circular debug information for %s\n",5);
    fprintf(stderr,__format,uVar6);
    puVar4 = (uint *)0x0;
  }
  return puVar4;
}

