
void fts5MultiIterAdvanced(Fts5Index *p,Fts5Iter *pIter,int iChanged,int iMinset)

{
  int iVar1;
  int iOut;
  
  iOut = (iChanged + pIter->nSeg) / 2;
  if (iOut < iMinset) {
    return;
  }
  iVar1 = p->rc;
  while( true ) {
    if (iVar1 != 0) {
      return;
    }
    iVar1 = fts5MultiIterDoCompare(pIter,iOut);
    if (iVar1 != 0) {
      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);
      iOut = iVar1 + pIter->nSeg;
    }
    iOut = iOut / 2;
    if (iOut < iMinset) break;
    iVar1 = p->rc;
  }
  return;
}



void FUN_0013b386(long param_1,long param_2,int param_3,int param_4)

{
  int iVar1;
  int iVar2;
  
  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;
  if (iVar2 < param_4) {
    return;
  }
  iVar1 = *(int *)(param_1 + 0x34);
  while( true ) {
    if (iVar1 != 0) {
      return;
    }
    iVar1 = FUN_0013b1e8(param_2,iVar2);
    if (iVar1 != 0) {
      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))
                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);
      iVar2 = iVar1 + *(int *)(param_2 + 0x40);
    }
    iVar2 = iVar2 / 2;
    if (iVar2 < param_4) break;
    iVar1 = *(int *)(param_1 + 0x34);
  }
  return;
}


MOV EAX,EDX
ADD EAX,dword ptr [RSI + 0x40]
MOV EDX,EAX
SHR EDX,0x1f
ADD EDX,EAX
SAR EDX,0x1
CMP EDX,ECX
JL 0x0013b413
PUSH R14
PUSH R13
PUSH R12
PUSH RBP
PUSH RBX
MOV R13D,EDX
MOV R12D,ECX
MOV RBX,RSI
MOV RBP,RDI
CMP dword ptr [RDI + 0x34],0x0
JZ 0x0013b3d4
POP RBX
POP RBP
POP R12
POP R13
POP R14
RET
MOV EAX,R13D
SHR EAX,0x1f
ADD EAX,R13D
SAR EAX,0x1
MOV R13D,EAX
CMP R12D,EAX
JG 0x0013b3b2
CMP dword ptr [RBP + 0x34],0x0
JNZ 0x0013b3b2
MOV ESI,R13D
MOV RDI,RBX
CALL 0x0013b1e8
MOV R14D,EAX
TEST EAX,EAX
JZ 0x0013b3bb
MOVSXD RDX,EAX
MOV RAX,RDX
SHL RAX,0x4
MOV RCX,RAX
SUB RCX,RDX
LEA RSI,[RBX + RCX*0x8 + 0x60]
MOV EDX,0x0
MOV RDI,RBP
CALL qword ptr [RBX + RCX*0x8 + 0x88]
ADD R14D,dword ptr [RBX + 0x40]
MOV R13D,R14D
JMP 0x0013b3bb
RET
(translation_unit "void FUN_0013b386(long param_1,long param_2,int param_3,int param_4)\n\n{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}\n\n" (function_definition "void FUN_0013b386(long param_1,long param_2,int param_3,int param_4)\n\n{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}" primitive_type (function_declarator "FUN_0013b386(long param_1,long param_2,int param_3,int param_4)" identifier (parameter_list "(long param_1,long param_2,int param_3,int param_4)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long param_2" (sized_type_specifier "long" long) identifier) , (parameter_declaration "int param_3" primitive_type identifier) , (parameter_declaration "int param_4" primitive_type identifier) ))) (compound_statement "{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (expression_statement "iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;" (assignment_expression "iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2" identifier = (binary_expression "(param_3 + *(int *)(param_2 + 0x40)) / 2" (parenthesized_expression "(param_3 + *(int *)(param_2 + 0x40))" ( (binary_expression "param_3 + *(int *)(param_2 + 0x40)" identifier + (pointer_expression "*(int *)(param_2 + 0x40)" * (cast_expression "(int *)(param_2 + 0x40)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 0x40)" ( (binary_expression "param_2 + 0x40" identifier + number_literal) ))))) )) / number_literal)) ;) (if_statement "if (iVar2 < param_4) {\n    return;\n  }" if (parenthesized_expression "(iVar2 < param_4)" ( (binary_expression "iVar2 < param_4" identifier < identifier) )) (compound_statement "{\n    return;\n  }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = *(int *)(param_1 + 0x34);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x34)" identifier = (pointer_expression "*(int *)(param_1 + 0x34)" * (cast_expression "(int *)(param_1 + 0x34)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x34)" ( (binary_expression "param_1 + 0x34" identifier + number_literal) ))))) ;) (while_statement "while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }" { (if_statement "if (iVar1 != 0) {\n      return;\n    }" if (parenthesized_expression "(iVar1 != 0)" ( (binary_expression "iVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      return;\n    }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = FUN_0013b1e8(param_2,iVar2);" (assignment_expression "iVar1 = FUN_0013b1e8(param_2,iVar2)" identifier = (call_expression "FUN_0013b1e8(param_2,iVar2)" identifier (argument_list "(param_2,iVar2)" ( identifier , identifier )))) ;) (if_statement "if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }" if (parenthesized_expression "(iVar1 != 0)" ( (binary_expression "iVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }" { (expression_statement "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);" (call_expression "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0)" (parenthesized_expression "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))" ( (pointer_expression "**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" * (pointer_expression "*(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" * (cast_expression "(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 0x88 + (long)iVar1 * 0x78)" ( (binary_expression "param_2 + 0x88 + (long)iVar1 * 0x78" (binary_expression "param_2 + 0x88" identifier + number_literal) + (binary_expression "(long)iVar1 * 0x78" (cast_expression "(long)iVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) * number_literal)) ))))) )) (argument_list "(param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0)" ( identifier , (binary_expression "param_2 + 0x60 + (long)iVar1 * 0x78" (binary_expression "param_2 + 0x60" identifier + number_literal) + (binary_expression "(long)iVar1 * 0x78" (cast_expression "(long)iVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) * number_literal)) , number_literal ))) ;) (expression_statement "iVar2 = iVar1 + *(int *)(param_2 + 0x40);" (assignment_expression "iVar2 = iVar1 + *(int *)(param_2 + 0x40)" identifier = (binary_expression "iVar1 + *(int *)(param_2 + 0x40)" identifier + (pointer_expression "*(int *)(param_2 + 0x40)" * (cast_expression "(int *)(param_2 + 0x40)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 0x40)" ( (binary_expression "param_2 + 0x40" identifier + number_literal) )))))) ;) })) (expression_statement "iVar2 = iVar2 / 2;" (assignment_expression "iVar2 = iVar2 / 2" identifier = (binary_expression "iVar2 / 2" identifier / number_literal)) ;) (if_statement "if (iVar2 < param_4) break;" if (parenthesized_expression "(iVar2 < param_4)" ( (binary_expression "iVar2 < param_4" identifier < identifier) )) (break_statement "break;" break ;)) (expression_statement "iVar1 = *(int *)(param_1 + 0x34);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x34)" identifier = (pointer_expression "*(int *)(param_1 + 0x34)" * (cast_expression "(int *)(param_1 + 0x34)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x34)" ( (binary_expression "param_1 + 0x34" identifier + number_literal) ))))) ;) })) (return_statement "return;" return ;) })))
(translation_unit "void fts5MultiIterAdvanced(Fts5Index *p,Fts5Iter *pIter,int iChanged,int iMinset)\n\n{\n  int iVar1;\n  int iOut;\n  \n  iOut = (iChanged + pIter->nSeg) / 2;\n  if (iOut < iMinset) {\n    return;\n  }\n  iVar1 = p->rc;\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = fts5MultiIterDoCompare(pIter,iOut);\n    if (iVar1 != 0) {\n      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);\n      iOut = iVar1 + pIter->nSeg;\n    }\n    iOut = iOut / 2;\n    if (iOut < iMinset) break;\n    iVar1 = p->rc;\n  }\n  return;\n}\n\n" (function_definition "void fts5MultiIterAdvanced(Fts5Index *p,Fts5Iter *pIter,int iChanged,int iMinset)\n\n{\n  int iVar1;\n  int iOut;\n  \n  iOut = (iChanged + pIter->nSeg) / 2;\n  if (iOut < iMinset) {\n    return;\n  }\n  iVar1 = p->rc;\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = fts5MultiIterDoCompare(pIter,iOut);\n    if (iVar1 != 0) {\n      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);\n      iOut = iVar1 + pIter->nSeg;\n    }\n    iOut = iOut / 2;\n    if (iOut < iMinset) break;\n    iVar1 = p->rc;\n  }\n  return;\n}" primitive_type (function_declarator "fts5MultiIterAdvanced(Fts5Index *p,Fts5Iter *pIter,int iChanged,int iMinset)" identifier (parameter_list "(Fts5Index *p,Fts5Iter *pIter,int iChanged,int iMinset)" ( (parameter_declaration "Fts5Index *p" type_identifier (pointer_declarator "*p" * identifier)) , (parameter_declaration "Fts5Iter *pIter" type_identifier (pointer_declarator "*pIter" * identifier)) , (parameter_declaration "int iChanged" primitive_type identifier) , (parameter_declaration "int iMinset" primitive_type identifier) ))) (compound_statement "{\n  int iVar1;\n  int iOut;\n  \n  iOut = (iChanged + pIter->nSeg) / 2;\n  if (iOut < iMinset) {\n    return;\n  }\n  iVar1 = p->rc;\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = fts5MultiIterDoCompare(pIter,iOut);\n    if (iVar1 != 0) {\n      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);\n      iOut = iVar1 + pIter->nSeg;\n    }\n    iOut = iOut / 2;\n    if (iOut < iMinset) break;\n    iVar1 = p->rc;\n  }\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "int iOut;" primitive_type identifier ;) (expression_statement "iOut = (iChanged + pIter->nSeg) / 2;" (assignment_expression "iOut = (iChanged + pIter->nSeg) / 2" identifier = (binary_expression "(iChanged + pIter->nSeg) / 2" (parenthesized_expression "(iChanged + pIter->nSeg)" ( (binary_expression "iChanged + pIter->nSeg" identifier + (field_expression "pIter->nSeg" identifier -> field_identifier)) )) / number_literal)) ;) (if_statement "if (iOut < iMinset) {\n    return;\n  }" if (parenthesized_expression "(iOut < iMinset)" ( (binary_expression "iOut < iMinset" identifier < identifier) )) (compound_statement "{\n    return;\n  }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = p->rc;" (assignment_expression "iVar1 = p->rc" identifier = (field_expression "p->rc" identifier -> field_identifier)) ;) (while_statement "while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = fts5MultiIterDoCompare(pIter,iOut);\n    if (iVar1 != 0) {\n      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);\n      iOut = iVar1 + pIter->nSeg;\n    }\n    iOut = iOut / 2;\n    if (iOut < iMinset) break;\n    iVar1 = p->rc;\n  }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = fts5MultiIterDoCompare(pIter,iOut);\n    if (iVar1 != 0) {\n      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);\n      iOut = iVar1 + pIter->nSeg;\n    }\n    iOut = iOut / 2;\n    if (iOut < iMinset) break;\n    iVar1 = p->rc;\n  }" { (if_statement "if (iVar1 != 0) {\n      return;\n    }" if (parenthesized_expression "(iVar1 != 0)" ( (binary_expression "iVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      return;\n    }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = fts5MultiIterDoCompare(pIter,iOut);" (assignment_expression "iVar1 = fts5MultiIterDoCompare(pIter,iOut)" identifier = (call_expression "fts5MultiIterDoCompare(pIter,iOut)" identifier (argument_list "(pIter,iOut)" ( identifier , identifier )))) ;) (if_statement "if (iVar1 != 0) {\n      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);\n      iOut = iVar1 + pIter->nSeg;\n    }" if (parenthesized_expression "(iVar1 != 0)" ( (binary_expression "iVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      (*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);\n      iOut = iVar1 + pIter->nSeg;\n    }" { (expression_statement "(*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0);" (call_expression "(*pIter->aSeg[iVar1].xNext)(p,pIter->aSeg + iVar1,(int *)0x0)" (parenthesized_expression "(*pIter->aSeg[iVar1].xNext)" ( (pointer_expression "*pIter->aSeg[iVar1].xNext" * (field_expression "pIter->aSeg[iVar1].xNext" (subscript_expression "pIter->aSeg[iVar1]" (field_expression "pIter->aSeg" identifier -> field_identifier) [ identifier ]) . field_identifier)) )) (argument_list "(p,pIter->aSeg + iVar1,(int *)0x0)" ( identifier , (binary_expression "pIter->aSeg + iVar1" (field_expression "pIter->aSeg" identifier -> field_identifier) + identifier) , (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal) ))) ;) (expression_statement "iOut = iVar1 + pIter->nSeg;" (assignment_expression "iOut = iVar1 + pIter->nSeg" identifier = (binary_expression "iVar1 + pIter->nSeg" identifier + (field_expression "pIter->nSeg" identifier -> field_identifier))) ;) })) (expression_statement "iOut = iOut / 2;" (assignment_expression "iOut = iOut / 2" identifier = (binary_expression "iOut / 2" identifier / number_literal)) ;) (if_statement "if (iOut < iMinset) break;" if (parenthesized_expression "(iOut < iMinset)" ( (binary_expression "iOut < iMinset" identifier < identifier) )) (break_statement "break;" break ;)) (expression_statement "iVar1 = p->rc;" (assignment_expression "iVar1 = p->rc" identifier = (field_expression "p->rc" identifier -> field_identifier)) ;) })) (return_statement "return;" return ;) })))
(translation_unit "void FUN_0013b386(long param_1,long param_2,int param_3,int param_4)\n\n{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}\n\n" (function_definition "void FUN_0013b386(long param_1,long param_2,int param_3,int param_4)\n\n{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}" primitive_type (function_declarator "FUN_0013b386(long param_1,long param_2,int param_3,int param_4)" identifier (parameter_list "(long param_1,long param_2,int param_3,int param_4)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long param_2" (sized_type_specifier "long" long) identifier) , (parameter_declaration "int param_3" primitive_type identifier) , (parameter_declaration "int param_4" primitive_type identifier) ))) (compound_statement "{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (expression_statement "iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;" (assignment_expression "iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2" identifier = (binary_expression "(param_3 + *(int *)(param_2 + 0x40)) / 2" (parenthesized_expression "(param_3 + *(int *)(param_2 + 0x40))" ( (binary_expression "param_3 + *(int *)(param_2 + 0x40)" identifier + (pointer_expression "*(int *)(param_2 + 0x40)" * (cast_expression "(int *)(param_2 + 0x40)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 0x40)" ( (binary_expression "param_2 + 0x40" identifier + number_literal) ))))) )) / number_literal)) ;) (if_statement "if (iVar2 < param_4) {\n    return;\n  }" if (parenthesized_expression "(iVar2 < param_4)" ( (binary_expression "iVar2 < param_4" identifier < identifier) )) (compound_statement "{\n    return;\n  }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = *(int *)(param_1 + 0x34);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x34)" identifier = (pointer_expression "*(int *)(param_1 + 0x34)" * (cast_expression "(int *)(param_1 + 0x34)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x34)" ( (binary_expression "param_1 + 0x34" identifier + number_literal) ))))) ;) (while_statement "while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }" { (if_statement "if (iVar1 != 0) {\n      return;\n    }" if (parenthesized_expression "(iVar1 != 0)" ( (binary_expression "iVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      return;\n    }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = FUN_0013b1e8(param_2,iVar2);" (assignment_expression "iVar1 = FUN_0013b1e8(param_2,iVar2)" identifier = (call_expression "FUN_0013b1e8(param_2,iVar2)" identifier (argument_list "(param_2,iVar2)" ( identifier , identifier )))) ;) (if_statement "if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }" if (parenthesized_expression "(iVar1 != 0)" ( (binary_expression "iVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }" { (expression_statement "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);" (call_expression "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0)" (parenthesized_expression "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))" ( (pointer_expression "**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" * (pointer_expression "*(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" * (cast_expression "(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_2 + 0x88 + (long)iVar1 * 0x78)" ( (binary_expression "param_2 + 0x88 + (long)iVar1 * 0x78" (binary_expression "param_2 + 0x88" identifier + number_literal) + (binary_expression "(long)iVar1 * 0x78" (cast_expression "(long)iVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) * number_literal)) ))))) )) (argument_list "(param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0)" ( identifier , (binary_expression "param_2 + 0x60 + (long)iVar1 * 0x78" (binary_expression "param_2 + 0x60" identifier + number_literal) + (binary_expression "(long)iVar1 * 0x78" (cast_expression "(long)iVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) * number_literal)) , number_literal ))) ;) (expression_statement "iVar2 = iVar1 + *(int *)(param_2 + 0x40);" (assignment_expression "iVar2 = iVar1 + *(int *)(param_2 + 0x40)" identifier = (binary_expression "iVar1 + *(int *)(param_2 + 0x40)" identifier + (pointer_expression "*(int *)(param_2 + 0x40)" * (cast_expression "(int *)(param_2 + 0x40)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 0x40)" ( (binary_expression "param_2 + 0x40" identifier + number_literal) )))))) ;) })) (expression_statement "iVar2 = iVar2 / 2;" (assignment_expression "iVar2 = iVar2 / 2" identifier = (binary_expression "iVar2 / 2" identifier / number_literal)) ;) (if_statement "if (iVar2 < param_4) break;" if (parenthesized_expression "(iVar2 < param_4)" ( (binary_expression "iVar2 < param_4" identifier < identifier) )) (break_statement "break;" break ;)) (expression_statement "iVar1 = *(int *)(param_1 + 0x34);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x34)" identifier = (pointer_expression "*(int *)(param_1 + 0x34)" * (cast_expression "(int *)(param_1 + 0x34)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x34)" ( (binary_expression "param_1 + 0x34" identifier + number_literal) ))))) ;) })) (return_statement "return;" return ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) IDENT) , (parameter_declaration (sized_type_specifier long) IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( (binary_expression IDENT + (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) )) / LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < IDENT) )) (compound_statement { (return_statement return ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (while_statement while (parenthesized_expression ( BOOL )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (return_statement return ;) })) (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( IDENT , IDENT )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (binary_expression IDENT + LIT) + (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) * LIT)) ))))) )) (argument_list ( IDENT , (binary_expression (binary_expression IDENT + LIT) + (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) * LIT)) , LIT ))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))))) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT / LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < IDENT) )) (break_statement break ;)) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) })) (return_statement return ;) })))
(function_definition "void FUN_0013b386(long param_1,long param_2,int param_3,int param_4)\n\n{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}" (primitive_type "void") (function_declarator "FUN_0013b386(long param_1,long param_2,int param_3,int param_4)" (identifier "FUN_0013b386") (parameter_list "(long param_1,long param_2,int param_3,int param_4)" (( "(") (parameter_declaration "long param_1" (sized_type_specifier "long" (long "long")) (identifier "param_1")) (, ",") (parameter_declaration "long param_2" (sized_type_specifier "long" (long "long")) (identifier "param_2")) (, ",") (parameter_declaration "int param_3" (primitive_type "int") (identifier "param_3")) (, ",") (parameter_declaration "int param_4" (primitive_type "int") (identifier "param_4")) () ")"))) (compound_statement "{\n  int iVar1;\n  int iVar2;\n  \n  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;\n  if (iVar2 < param_4) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x34);\n  while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }\n  return;\n}" ({ "{") (declaration "int iVar1;" (primitive_type "int") (identifier "iVar1") (; ";")) (declaration "int iVar2;" (primitive_type "int") (identifier "iVar2") (; ";")) (expression_statement "iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;" (assignment_expression "iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2" (identifier "iVar2") (= "=") (binary_expression "(param_3 + *(int *)(param_2 + 0x40)) / 2" (parenthesized_expression "(param_3 + *(int *)(param_2 + 0x40))" (( "(") (binary_expression "param_3 + *(int *)(param_2 + 0x40)" (identifier "param_3") (+ "+") (pointer_expression "*(int *)(param_2 + 0x40)" (* "*") (cast_expression "(int *)(param_2 + 0x40)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_2 + 0x40)" (( "(") (binary_expression "param_2 + 0x40" (identifier "param_2") (+ "+") (number_literal "0x40")) () ")"))))) () ")")) (/ "/") (number_literal "2"))) (; ";")) (if_statement "if (iVar2 < param_4) {\n    return;\n  }" (if "if") (parenthesized_expression "(iVar2 < param_4)" (( "(") (binary_expression "iVar2 < param_4" (identifier "iVar2") (< "<") (identifier "param_4")) () ")")) (compound_statement "{\n    return;\n  }" ({ "{") (return_statement "return;" (return "return") (; ";")) (} "}"))) (expression_statement "iVar1 = *(int *)(param_1 + 0x34);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x34)" (identifier "iVar1") (= "=") (pointer_expression "*(int *)(param_1 + 0x34)" (* "*") (cast_expression "(int *)(param_1 + 0x34)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x34)" (( "(") (binary_expression "param_1 + 0x34" (identifier "param_1") (+ "+") (number_literal "0x34")) () ")"))))) (; ";")) (while_statement "while( true ) {\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }" (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (compound_statement "{\n    if (iVar1 != 0) {\n      return;\n    }\n    iVar1 = FUN_0013b1e8(param_2,iVar2);\n    if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }\n    iVar2 = iVar2 / 2;\n    if (iVar2 < param_4) break;\n    iVar1 = *(int *)(param_1 + 0x34);\n  }" ({ "{") (if_statement "if (iVar1 != 0) {\n      return;\n    }" (if "if") (parenthesized_expression "(iVar1 != 0)" (( "(") (binary_expression "iVar1 != 0" (identifier "iVar1") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      return;\n    }" ({ "{") (return_statement "return;" (return "return") (; ";")) (} "}"))) (expression_statement "iVar1 = FUN_0013b1e8(param_2,iVar2);" (assignment_expression "iVar1 = FUN_0013b1e8(param_2,iVar2)" (identifier "iVar1") (= "=") (call_expression "FUN_0013b1e8(param_2,iVar2)" (identifier "FUN_0013b1e8") (argument_list "(param_2,iVar2)" (( "(") (identifier "param_2") (, ",") (identifier "iVar2") () ")")))) (; ";")) (if_statement "if (iVar1 != 0) {\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }" (if "if") (parenthesized_expression "(iVar1 != 0)" (( "(") (binary_expression "iVar1 != 0" (identifier "iVar1") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);\n      iVar2 = iVar1 + *(int *)(param_2 + 0x40);\n    }" ({ "{") (expression_statement "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);" (call_expression "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))\n                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0)" (parenthesized_expression "(**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))" (( "(") (pointer_expression "**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" (* "*") (pointer_expression "*(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" (* "*") (cast_expression "(code **)(param_2 + 0x88 + (long)iVar1 * 0x78)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_2 + 0x88 + (long)iVar1 * 0x78)" (( "(") (binary_expression "param_2 + 0x88 + (long)iVar1 * 0x78" (binary_expression "param_2 + 0x88" (identifier "param_2") (+ "+") (number_literal "0x88")) (+ "+") (binary_expression "(long)iVar1 * 0x78" (cast_expression "(long)iVar1" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "iVar1")) (* "*") (number_literal "0x78"))) () ")"))))) () ")")) (argument_list "(param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0)" (( "(") (identifier "param_1") (, ",") (binary_expression "param_2 + 0x60 + (long)iVar1 * 0x78" (binary_expression "param_2 + 0x60" (identifier "param_2") (+ "+") (number_literal "0x60")) (+ "+") (binary_expression "(long)iVar1 * 0x78" (cast_expression "(long)iVar1" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "iVar1")) (* "*") (number_literal "0x78"))) (, ",") (number_literal "0") () ")"))) (; ";")) (expression_statement "iVar2 = iVar1 + *(int *)(param_2 + 0x40);" (assignment_expression "iVar2 = iVar1 + *(int *)(param_2 + 0x40)" (identifier "iVar2") (= "=") (binary_expression "iVar1 + *(int *)(param_2 + 0x40)" (identifier "iVar1") (+ "+") (pointer_expression "*(int *)(param_2 + 0x40)" (* "*") (cast_expression "(int *)(param_2 + 0x40)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_2 + 0x40)" (( "(") (binary_expression "param_2 + 0x40" (identifier "param_2") (+ "+") (number_literal "0x40")) () ")")))))) (; ";")) (} "}"))) (expression_statement "iVar2 = iVar2 / 2;" (assignment_expression "iVar2 = iVar2 / 2" (identifier "iVar2") (= "=") (binary_expression "iVar2 / 2" (identifier "iVar2") (/ "/") (number_literal "2"))) (; ";")) (if_statement "if (iVar2 < param_4) break;" (if "if") (parenthesized_expression "(iVar2 < param_4)" (( "(") (binary_expression "iVar2 < param_4" (identifier "iVar2") (< "<") (identifier "param_4")) () ")")) (break_statement "break;" (break "break") (; ";"))) (expression_statement "iVar1 = *(int *)(param_1 + 0x34);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x34)" (identifier "iVar1") (= "=") (pointer_expression "*(int *)(param_1 + 0x34)" (* "*") (cast_expression "(int *)(param_1 + 0x34)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x34)" (( "(") (binary_expression "param_1 + 0x34" (identifier "param_1") (+ "+") (number_literal "0x34")) () ")"))))) (; ";")) (} "}"))) (return_statement "return;" (return "return") (; ";")) (} "}")))

void function_1(type_1 *p,type_2 *pIter,int var_1,int var_3)

{
  int var_4;
  int var_2;
  
  var_2 = (var_1 + pIter->nSeg) / 2;
  if (var_2 < var_3) {
    return;
  }
  var_4 = p->rc;
  while( true ) {
    if (var_4 != 0) {
      return;
    }
    var_4 = var_5(pIter,var_2);
    if (var_4 != 0) {
      (*pIter->aSeg[var_4].xNext)(p,pIter->aSeg + var_4,(int *)0x0);
      var_2 = var_4 + pIter->nSeg;
    }
    var_2 = var_2 / 2;
    if (var_2 < var_3) break;
    var_4 = p->rc;
  }
  return;
}


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

void MASKED(long param_1,long param_2,int param_3,int param_4)

{
  int iVar1;
  int iVar2;
  
  iVar2 = (param_3 + *(int *)(param_2 + 0x40)) / 2;
  if (iVar2 < param_4) {
    return;
  }
  iVar1 = *(int *)(param_1 + 0x34);
  while( true ) {
    if (iVar1 != 0) {
      return;
    }
    iVar1 = FUN_0013b1e8(param_2,iVar2);
    if (iVar1 != 0) {
      (**(code **)(param_2 + 0x88 + (long)iVar1 * 0x78))
                (param_1,param_2 + 0x60 + (long)iVar1 * 0x78,0);
      iVar2 = iVar1 + *(int *)(param_2 + 0x40);
    }
    iVar2 = iVar2 / 2;
    if (iVar2 < param_4) break;
    iVar1 = *(int *)(param_1 + 0x34);
  }
  return;
}

