
/* WARNING: Unknown calling convention -- yet parameter storage is locked */

void xatexit_cleanup(void)

{
  xatexit **ppxVar1;
  int iVar2;
  long lVar3;
  xatexit *pxVar4;
  
  pxVar4 = xatexit_head;
  if (xatexit_head != (xatexit *)0x0) {
    do {
      iVar2 = pxVar4->ind + -1;
      if (-1 < iVar2) {
        lVar3 = (long)iVar2;
        do {
          (*pxVar4->fns[lVar3])();
          lVar3 = lVar3 + -1;
        } while (-1 < (int)lVar3);
      }
      ppxVar1 = &pxVar4->next;
      pxVar4 = *ppxVar1;
    } while (*ppxVar1 != (xatexit *)0x0);
  }
  return;
}



void FUN_0014b120(void)

{
  int iVar1;
  long lVar2;
  long *plVar3;
  
  plVar3 = (long *)PTR_DAT_0016c750;
  if (PTR_DAT_0016c750 != (undefined *)0x0) {
    do {
      iVar1 = (int)plVar3[1] + -1;
      if (-1 < iVar1) {
        lVar2 = (long)iVar1;
        do {
          (*(code *)plVar3[lVar2 + 2])();
          lVar2 = lVar2 + -1;
        } while (-1 < (int)lVar2);
      }
      plVar3 = (long *)*plVar3;
    } while (plVar3 != (long *)0x0);
  }
  return;
}


PUSH RBP
PUSH RBX
SUB RSP,0x8
MOV RBP,qword ptr [0x0016c750]
TEST RBP,RBP
JZ 0x0014b15d
NOP word ptr [RAX + RAX*0x1]
MOV EBX,dword ptr [RBP + 0x8]
SUB EBX,0x1
JS 0x0014b154
MOVSXD RBX,EBX
NOP dword ptr [RAX + RAX*0x1]
CALL qword ptr [RBP + RBX*0x8 + 0x10]
SUB RBX,0x1
TEST EBX,EBX
JNS 0x0014b148
MOV RBP,qword ptr [RBP]
TEST RBP,RBP
JNZ 0x0014b138
ADD RSP,0x8
POP RBX
POP RBP
RET
(translation_unit "void FUN_0014b120(void)\n\n{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}\n\n" (function_definition "void FUN_0014b120(void)\n\n{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}" primitive_type (function_declarator "FUN_0014b120(void)" identifier (parameter_list "(void)" ( (parameter_declaration "void" primitive_type) ))) (compound_statement "{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "long lVar2;" (sized_type_specifier "long" long) identifier ;) (declaration "long *plVar3;" (sized_type_specifier "long" long) (pointer_declarator "*plVar3" * identifier) ;) (expression_statement "plVar3 = (long *)PTR_DAT_0016c750;" (assignment_expression "plVar3 = (long *)PTR_DAT_0016c750" identifier = (cast_expression "(long *)PTR_DAT_0016c750" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) ;) (if_statement "if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }" if (parenthesized_expression "(PTR_DAT_0016c750 != (undefined *)0x0)" ( (binary_expression "PTR_DAT_0016c750 != (undefined *)0x0" identifier != (cast_expression "(undefined *)0x0" ( (type_descriptor "undefined *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }" { (do_statement "do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);" do (compound_statement "{\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    }" { (expression_statement "iVar1 = (int)plVar3[1] + -1;" (assignment_expression "iVar1 = (int)plVar3[1] + -1" identifier = (binary_expression "(int)plVar3[1] + -1" (cast_expression "(int)plVar3[1]" ( (type_descriptor "int" primitive_type) ) (subscript_expression "plVar3[1]" identifier [ number_literal ])) + number_literal)) ;) (if_statement "if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }" if (parenthesized_expression "(-1 < iVar1)" ( (binary_expression "-1 < iVar1" number_literal < identifier) )) (compound_statement "{\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }" { (expression_statement "lVar2 = (long)iVar1;" (assignment_expression "lVar2 = (long)iVar1" identifier = (cast_expression "(long)iVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) (do_statement "do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);" do (compound_statement "{\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        }" { (expression_statement "(*(code *)plVar3[lVar2 + 2])();" (call_expression "(*(code *)plVar3[lVar2 + 2])()" (parenthesized_expression "(*(code *)plVar3[lVar2 + 2])" ( (pointer_expression "*(code *)plVar3[lVar2 + 2]" * (cast_expression "(code *)plVar3[lVar2 + 2]" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar3[lVar2 + 2]" identifier [ (binary_expression "lVar2 + 2" identifier + number_literal) ]))) )) (argument_list "()" ( ))) ;) (expression_statement "lVar2 = lVar2 + -1;" (assignment_expression "lVar2 = lVar2 + -1" identifier = (binary_expression "lVar2 + -1" identifier + number_literal)) ;) }) while (parenthesized_expression "(-1 < (int)lVar2)" ( (binary_expression "-1 < (int)lVar2" number_literal < (cast_expression "(int)lVar2" ( (type_descriptor "int" primitive_type) ) identifier)) )) ;) })) (expression_statement "plVar3 = (long *)*plVar3;" (assignment_expression "plVar3 = (long *)*plVar3" identifier = (cast_expression "(long *)*plVar3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar3" * identifier))) ;) }) while (parenthesized_expression "(plVar3 != (long *)0x0)" ( (binary_expression "plVar3 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) ;) })) (return_statement "return;" return ;) })))
(translation_unit "/* WARNING: Unknown calling convention -- yet parameter storage is locked */\n\nvoid xatexit_cleanup(void)\n\n{\n  xatexit **ppxVar1;\n  int iVar2;\n  long lVar3;\n  xatexit *pxVar4;\n  \n  pxVar4 = xatexit_head;\n  if (xatexit_head != (xatexit *)0x0) {\n    do {\n      iVar2 = pxVar4->ind + -1;\n      if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }\n      ppxVar1 = &pxVar4->next;\n      pxVar4 = *ppxVar1;\n    } while (*ppxVar1 != (xatexit *)0x0);\n  }\n  return;\n}\n\n" comment (function_definition "void xatexit_cleanup(void)\n\n{\n  xatexit **ppxVar1;\n  int iVar2;\n  long lVar3;\n  xatexit *pxVar4;\n  \n  pxVar4 = xatexit_head;\n  if (xatexit_head != (xatexit *)0x0) {\n    do {\n      iVar2 = pxVar4->ind + -1;\n      if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }\n      ppxVar1 = &pxVar4->next;\n      pxVar4 = *ppxVar1;\n    } while (*ppxVar1 != (xatexit *)0x0);\n  }\n  return;\n}" primitive_type (function_declarator "xatexit_cleanup(void)" identifier (parameter_list "(void)" ( (parameter_declaration "void" primitive_type) ))) (compound_statement "{\n  xatexit **ppxVar1;\n  int iVar2;\n  long lVar3;\n  xatexit *pxVar4;\n  \n  pxVar4 = xatexit_head;\n  if (xatexit_head != (xatexit *)0x0) {\n    do {\n      iVar2 = pxVar4->ind + -1;\n      if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }\n      ppxVar1 = &pxVar4->next;\n      pxVar4 = *ppxVar1;\n    } while (*ppxVar1 != (xatexit *)0x0);\n  }\n  return;\n}" { (declaration "xatexit **ppxVar1;" type_identifier (pointer_declarator "**ppxVar1" * (pointer_declarator "*ppxVar1" * identifier)) ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "long lVar3;" (sized_type_specifier "long" long) identifier ;) (declaration "xatexit *pxVar4;" type_identifier (pointer_declarator "*pxVar4" * identifier) ;) (expression_statement "pxVar4 = xatexit_head;" (assignment_expression "pxVar4 = xatexit_head" identifier = identifier) ;) (if_statement "if (xatexit_head != (xatexit *)0x0) {\n    do {\n      iVar2 = pxVar4->ind + -1;\n      if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }\n      ppxVar1 = &pxVar4->next;\n      pxVar4 = *ppxVar1;\n    } while (*ppxVar1 != (xatexit *)0x0);\n  }" if (parenthesized_expression "(xatexit_head != (xatexit *)0x0)" ( (binary_expression "xatexit_head != (xatexit *)0x0" identifier != (cast_expression "(xatexit *)0x0" ( (type_descriptor "xatexit *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    do {\n      iVar2 = pxVar4->ind + -1;\n      if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }\n      ppxVar1 = &pxVar4->next;\n      pxVar4 = *ppxVar1;\n    } while (*ppxVar1 != (xatexit *)0x0);\n  }" { (do_statement "do {\n      iVar2 = pxVar4->ind + -1;\n      if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }\n      ppxVar1 = &pxVar4->next;\n      pxVar4 = *ppxVar1;\n    } while (*ppxVar1 != (xatexit *)0x0);" do (compound_statement "{\n      iVar2 = pxVar4->ind + -1;\n      if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }\n      ppxVar1 = &pxVar4->next;\n      pxVar4 = *ppxVar1;\n    }" { (expression_statement "iVar2 = pxVar4->ind + -1;" (assignment_expression "iVar2 = pxVar4->ind + -1" identifier = (binary_expression "pxVar4->ind + -1" (field_expression "pxVar4->ind" identifier -> field_identifier) + number_literal)) ;) (if_statement "if (-1 < iVar2) {\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }" if (parenthesized_expression "(-1 < iVar2)" ( (binary_expression "-1 < iVar2" number_literal < identifier) )) (compound_statement "{\n        lVar3 = (long)iVar2;\n        do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);\n      }" { (expression_statement "lVar3 = (long)iVar2;" (assignment_expression "lVar3 = (long)iVar2" identifier = (cast_expression "(long)iVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) (do_statement "do {\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        } while (-1 < (int)lVar3);" do (compound_statement "{\n          (*pxVar4->fns[lVar3])();\n          lVar3 = lVar3 + -1;\n        }" { (expression_statement "(*pxVar4->fns[lVar3])();" (call_expression "(*pxVar4->fns[lVar3])()" (parenthesized_expression "(*pxVar4->fns[lVar3])" ( (pointer_expression "*pxVar4->fns[lVar3]" * (subscript_expression "pxVar4->fns[lVar3]" (field_expression "pxVar4->fns" identifier -> field_identifier) [ identifier ])) )) (argument_list "()" ( ))) ;) (expression_statement "lVar3 = lVar3 + -1;" (assignment_expression "lVar3 = lVar3 + -1" identifier = (binary_expression "lVar3 + -1" identifier + number_literal)) ;) }) while (parenthesized_expression "(-1 < (int)lVar3)" ( (binary_expression "-1 < (int)lVar3" number_literal < (cast_expression "(int)lVar3" ( (type_descriptor "int" primitive_type) ) identifier)) )) ;) })) (expression_statement "ppxVar1 = &pxVar4->next;" (assignment_expression "ppxVar1 = &pxVar4->next" identifier = (pointer_expression "&pxVar4->next" & (field_expression "pxVar4->next" identifier -> field_identifier))) ;) (expression_statement "pxVar4 = *ppxVar1;" (assignment_expression "pxVar4 = *ppxVar1" identifier = (pointer_expression "*ppxVar1" * identifier)) ;) }) while (parenthesized_expression "(*ppxVar1 != (xatexit *)0x0)" ( (binary_expression "*ppxVar1 != (xatexit *)0x0" (pointer_expression "*ppxVar1" * identifier) != (cast_expression "(xatexit *)0x0" ( (type_descriptor "xatexit *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) ;) })) (return_statement "return;" return ;) })))
(translation_unit "void FUN_0014b120(void)\n\n{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}\n\n" (function_definition "void FUN_0014b120(void)\n\n{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}" primitive_type (function_declarator "FUN_0014b120(void)" identifier (parameter_list "(void)" ( (parameter_declaration "void" primitive_type) ))) (compound_statement "{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "long lVar2;" (sized_type_specifier "long" long) identifier ;) (declaration "long *plVar3;" (sized_type_specifier "long" long) (pointer_declarator "*plVar3" * identifier) ;) (expression_statement "plVar3 = (long *)PTR_DAT_0016c750;" (assignment_expression "plVar3 = (long *)PTR_DAT_0016c750" identifier = (cast_expression "(long *)PTR_DAT_0016c750" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) ;) (if_statement "if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }" if (parenthesized_expression "(PTR_DAT_0016c750 != (undefined *)0x0)" ( (binary_expression "PTR_DAT_0016c750 != (undefined *)0x0" identifier != (cast_expression "(undefined *)0x0" ( (type_descriptor "undefined *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }" { (do_statement "do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);" do (compound_statement "{\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    }" { (expression_statement "iVar1 = (int)plVar3[1] + -1;" (assignment_expression "iVar1 = (int)plVar3[1] + -1" identifier = (binary_expression "(int)plVar3[1] + -1" (cast_expression "(int)plVar3[1]" ( (type_descriptor "int" primitive_type) ) (subscript_expression "plVar3[1]" identifier [ number_literal ])) + number_literal)) ;) (if_statement "if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }" if (parenthesized_expression "(-1 < iVar1)" ( (binary_expression "-1 < iVar1" number_literal < identifier) )) (compound_statement "{\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }" { (expression_statement "lVar2 = (long)iVar1;" (assignment_expression "lVar2 = (long)iVar1" identifier = (cast_expression "(long)iVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ;) (do_statement "do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);" do (compound_statement "{\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        }" { (expression_statement "(*(code *)plVar3[lVar2 + 2])();" (call_expression "(*(code *)plVar3[lVar2 + 2])()" (parenthesized_expression "(*(code *)plVar3[lVar2 + 2])" ( (pointer_expression "*(code *)plVar3[lVar2 + 2]" * (cast_expression "(code *)plVar3[lVar2 + 2]" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "plVar3[lVar2 + 2]" identifier [ (binary_expression "lVar2 + 2" identifier + number_literal) ]))) )) (argument_list "()" ( ))) ;) (expression_statement "lVar2 = lVar2 + -1;" (assignment_expression "lVar2 = lVar2 + -1" identifier = (binary_expression "lVar2 + -1" identifier + number_literal)) ;) }) while (parenthesized_expression "(-1 < (int)lVar2)" ( (binary_expression "-1 < (int)lVar2" number_literal < (cast_expression "(int)lVar2" ( (type_descriptor "int" primitive_type) ) identifier)) )) ;) })) (expression_statement "plVar3 = (long *)*plVar3;" (assignment_expression "plVar3 = (long *)*plVar3" identifier = (cast_expression "(long *)*plVar3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar3" * identifier))) ;) }) while (parenthesized_expression "(plVar3 != (long *)0x0)" ( (binary_expression "plVar3 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) ;) })) (return_statement "return;" return ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration (sized_type_specifier long) IDENT ;) (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor TYPE) ) (subscript_expression IDENT [ LIT ])) + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT)) ;) (do_statement do (compound_statement { (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ (binary_expression IDENT + LIT) ]))) )) (argument_list ( ))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression LIT < (cast_expression ( (type_descriptor TYPE) ) IDENT)) )) ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) }) while (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT)) )) ;) })) (return_statement return ;) })))
(function_definition "void FUN_0014b120(void)\n\n{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}" (primitive_type "void") (function_declarator "FUN_0014b120(void)" (identifier "FUN_0014b120") (parameter_list "(void)" (( "(") (parameter_declaration "void" (primitive_type "void")) () ")"))) (compound_statement "{\n  int iVar1;\n  long lVar2;\n  long *plVar3;\n  \n  plVar3 = (long *)PTR_DAT_0016c750;\n  if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }\n  return;\n}" ({ "{") (declaration "int iVar1;" (primitive_type "int") (identifier "iVar1") (; ";")) (declaration "long lVar2;" (sized_type_specifier "long" (long "long")) (identifier "lVar2") (; ";")) (declaration "long *plVar3;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*plVar3" (* "*") (identifier "plVar3")) (; ";")) (expression_statement "plVar3 = (long *)PTR_DAT_0016c750;" (assignment_expression "plVar3 = (long *)PTR_DAT_0016c750" (identifier "plVar3") (= "=") (cast_expression "(long *)PTR_DAT_0016c750" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR_DAT_0016c750"))) (; ";")) (if_statement "if (PTR_DAT_0016c750 != (undefined *)0x0) {\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }" (if "if") (parenthesized_expression "(PTR_DAT_0016c750 != (undefined *)0x0)" (( "(") (binary_expression "PTR_DAT_0016c750 != (undefined *)0x0" (identifier "PTR_DAT_0016c750") (!= "!=") (cast_expression "(undefined *)0x0" (( "(") (type_descriptor "undefined *" (type_identifier "undefined") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);\n  }" ({ "{") (do_statement "do {\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    } while (plVar3 != (long *)0x0);" (do "do") (compound_statement "{\n      iVar1 = (int)plVar3[1] + -1;\n      if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }\n      plVar3 = (long *)*plVar3;\n    }" ({ "{") (expression_statement "iVar1 = (int)plVar3[1] + -1;" (assignment_expression "iVar1 = (int)plVar3[1] + -1" (identifier "iVar1") (= "=") (binary_expression "(int)plVar3[1] + -1" (cast_expression "(int)plVar3[1]" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (subscript_expression "plVar3[1]" (identifier "plVar3") ([ "[") (number_literal "1") (] "]"))) (+ "+") (number_literal "-1"))) (; ";")) (if_statement "if (-1 < iVar1) {\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }" (if "if") (parenthesized_expression "(-1 < iVar1)" (( "(") (binary_expression "-1 < iVar1" (number_literal "-1") (< "<") (identifier "iVar1")) () ")")) (compound_statement "{\n        lVar2 = (long)iVar1;\n        do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);\n      }" ({ "{") (expression_statement "lVar2 = (long)iVar1;" (assignment_expression "lVar2 = (long)iVar1" (identifier "lVar2") (= "=") (cast_expression "(long)iVar1" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "iVar1"))) (; ";")) (do_statement "do {\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        } while (-1 < (int)lVar2);" (do "do") (compound_statement "{\n          (*(code *)plVar3[lVar2 + 2])();\n          lVar2 = lVar2 + -1;\n        }" ({ "{") (expression_statement "(*(code *)plVar3[lVar2 + 2])();" (call_expression "(*(code *)plVar3[lVar2 + 2])()" (parenthesized_expression "(*(code *)plVar3[lVar2 + 2])" (( "(") (pointer_expression "*(code *)plVar3[lVar2 + 2]" (* "*") (cast_expression "(code *)plVar3[lVar2 + 2]" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "plVar3[lVar2 + 2]" (identifier "plVar3") ([ "[") (binary_expression "lVar2 + 2" (identifier "lVar2") (+ "+") (number_literal "2")) (] "]")))) () ")")) (argument_list "()" (( "(") () ")"))) (; ";")) (expression_statement "lVar2 = lVar2 + -1;" (assignment_expression "lVar2 = lVar2 + -1" (identifier "lVar2") (= "=") (binary_expression "lVar2 + -1" (identifier "lVar2") (+ "+") (number_literal "-1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(-1 < (int)lVar2)" (( "(") (binary_expression "-1 < (int)lVar2" (number_literal "-1") (< "<") (cast_expression "(int)lVar2" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "lVar2"))) () ")")) (; ";")) (} "}"))) (expression_statement "plVar3 = (long *)*plVar3;" (assignment_expression "plVar3 = (long *)*plVar3" (identifier "plVar3") (= "=") (cast_expression "(long *)*plVar3" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*plVar3" (* "*") (identifier "plVar3")))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(plVar3 != (long *)0x0)" (( "(") (binary_expression "plVar3 != (long *)0x0" (identifier "plVar3") (!= "!=") (cast_expression "(long *)0x0" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (; ";")) (} "}"))) (return_statement "return;" (return "return") (; ";")) (} "}")))

/* WARNING: Unknown calling convention -- yet parameter storage is locked */

void function_1(void)

{
  type_1 **ppxVar1;
  int var_2;
  long var_3;
  type_1 *pxVar4;
  
  pxVar4 = var_1;
  if (var_1 != (type_1 *)0x0) {
    do {
      var_2 = pxVar4->ind + -1;
      if (-1 < var_2) {
        var_3 = (long)var_2;
        do {
          (*pxVar4->fns[var_3])();
          var_3 = var_3 + -1;
        } while (-1 < (int)var_3);
      }
      ppxVar1 = &pxVar4->next;
      pxVar4 = *ppxVar1;
    } while (*ppxVar1 != (type_1 *)0x0);
  }
  return;
}


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

void MASKED(void)

{
  int iVar1;
  long lVar2;
  long *plVar3;
  
  plVar3 = (long *)PTR_DAT_0016c750;
  if (PTR_DAT_0016c750 != (undefined *)0x0) {
    do {
      iVar1 = (int)plVar3[1] + -1;
      if (-1 < iVar1) {
        lVar2 = (long)iVar1;
        do {
          (*(code *)plVar3[lVar2 + 2])();
          lVar2 = lVar2 + -1;
        } while (-1 < (int)lVar2);
      }
      plVar3 = (long *)*plVar3;
    } while (plVar3 != (long *)0x0);
  }
  return;
}

