
/* std::string::compare(unsigned long, unsigned long, std::string const&, unsigned long, unsigned
   long) const */

ulong __thiscall
std::string::compare
          (string *this,ulong param_1,ulong param_2,string *param_3,ulong param_4,ulong param_5)

{
  uint uVar1;
  ulong uVar2;
  ulong uVar3;
  ulong uVar4;
  
  uVar2 = *(ulong *)(*(long *)this + -0x18);
  if (uVar2 < param_1) {
                    /* WARNING: Subroutine does not return */
    __throw_out_of_range_fmt
              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
               param_1,uVar2);
  }
  uVar3 = *(ulong *)(*(long *)param_3 + -0x18);
  if (param_4 <= uVar3) {
    uVar4 = uVar2 - param_1;
    if (param_2 < uVar2 - param_1) {
      uVar4 = param_2;
    }
    uVar2 = uVar3 - param_4;
    if (param_5 < uVar3 - param_4) {
      uVar2 = param_5;
    }
    uVar3 = uVar4;
    if (uVar2 <= uVar4) {
      uVar3 = uVar2;
    }
    if (uVar3 != 0) {
      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);
      if (uVar1 != 0) {
        return (ulong)uVar1;
      }
    }
    uVar4 = uVar4 - uVar2;
    uVar2 = 0x7fffffff;
    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {
      uVar2 = uVar4 & 0xffffffff;
    }
    return uVar2;
  }
                    /* WARNING: Subroutine does not return */
  __throw_out_of_range_fmt
            ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
             param_4,uVar3);
}



ulong FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,
                  ulong param_6)

{
  uint uVar1;
  ulong uVar2;
  ulong uVar3;
  ulong uVar4;
  
  uVar2 = *(ulong *)(*param_1 + -0x18);
  if (uVar2 < param_2) {
                    /* WARNING: Subroutine does not return */
    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
                 param_2,uVar2);
  }
  uVar3 = *(ulong *)(*param_4 + -0x18);
  if (param_5 <= uVar3) {
    uVar4 = uVar2 - param_2;
    if (param_3 < uVar2 - param_2) {
      uVar4 = param_3;
    }
    uVar2 = uVar3 - param_5;
    if (param_6 < uVar3 - param_5) {
      uVar2 = param_6;
    }
    uVar3 = uVar4;
    if (uVar2 <= uVar4) {
      uVar3 = uVar2;
    }
    if (uVar3 != 0) {
      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);
      if (uVar1 != 0) {
        return (ulong)uVar1;
      }
    }
    uVar4 = uVar4 - uVar2;
    uVar2 = 0x7fffffff;
    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {
      uVar2 = uVar4 & 0xffffffff;
    }
    return uVar2;
  }
                    /* WARNING: Subroutine does not return */
  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
               param_5,uVar3);
}


PUSH RBP
PUSH RBX
SUB RSP,0x8
MOV RDI,qword ptr [RDI]
MOV RBX,qword ptr [RDI + -0x18]
CMP RSI,RBX
JA 0x002a96b8
MOV RAX,qword ptr [RCX]
MOV RBP,qword ptr [RAX + -0x18]
CMP R8,RBP
JA 0x002a96d3
SUB RBX,RSI
CMP RBX,RDX
CMOVA RBX,RDX
SUB RBP,R8
CMP RBP,R9
CMOVA RBP,R9
MOV RDX,RBX
CMP RBP,RBX
CMOVBE RDX,RBP
TEST RDX,RDX
JZ 0x002a9693
ADD RAX,R8
ADD RDI,RSI
MOV RSI,RAX
CALL 0x0013e840
TEST EAX,EAX
JNZ 0x002a96b1
SUB RBX,RBP
MOV EAX,0x7fffffff
CMP RBX,0x7fffffff
JG 0x002a96b1
CMP RBX,-0x80000000
LEA EAX,[RAX + 0x1]
CMOVGE EAX,EBX
ADD RSP,0x8
POP RBX
POP RBP
RET
MOV RDX,RSI
MOV RCX,RBX
LEA RSI,[0x3292dd]
XOR EAX,EAX
LEA RDI,[0x311130]
CALL 0x002b56d0
MOV RCX,RBP
MOV RDX,R8
LEA RSI,[0x3292dd]
XOR EAX,EAX
LEA RDI,[0x311130]
CALL 0x002b56d0
(translation_unit "ulong FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    /* WARNING: Subroutine does not return */\n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}\n\n" (function_definition "ulong FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    /* WARNING: Subroutine does not return */\n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}" type_identifier (function_declarator "FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)" identifier (parameter_list "(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "ulong param_2" type_identifier identifier) , (parameter_declaration "ulong param_3" type_identifier identifier) , (parameter_declaration "long *param_4" (sized_type_specifier "long" long) (pointer_declarator "*param_4" * identifier)) , (parameter_declaration "ulong param_5" type_identifier identifier) , (parameter_declaration "ulong param_6" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    /* WARNING: Subroutine does not return */\n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "ulong uVar3;" type_identifier identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (expression_statement "uVar2 = *(ulong *)(*param_1 + -0x18);" (assignment_expression "uVar2 = *(ulong *)(*param_1 + -0x18)" identifier = (pointer_expression "*(ulong *)(*param_1 + -0x18)" * (cast_expression "(ulong *)(*param_1 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + -0x18)" ( (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" * identifier) + number_literal) ))))) ;) (if_statement "if (uVar2 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" if (parenthesized_expression "(uVar2 < param_2)" ( (binary_expression "uVar2 < param_2" identifier < identifier) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" { comment (expression_statement "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);" (call_expression "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2)" ( (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" " string_content ") , (string_literal ""basic_string::compare"" " string_content ") , identifier , identifier ))) ;) })) (expression_statement "uVar3 = *(ulong *)(*param_4 + -0x18);" (assignment_expression "uVar3 = *(ulong *)(*param_4 + -0x18)" identifier = (pointer_expression "*(ulong *)(*param_4 + -0x18)" * (cast_expression "(ulong *)(*param_4 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_4 + -0x18)" ( (binary_expression "*param_4 + -0x18" (pointer_expression "*param_4" * identifier) + number_literal) ))))) ;) (if_statement "if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" if (parenthesized_expression "(param_5 <= uVar3)" ( (binary_expression "param_5 <= uVar3" identifier <= identifier) )) (compound_statement "{\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" { (expression_statement "uVar4 = uVar2 - param_2;" (assignment_expression "uVar4 = uVar2 - param_2" identifier = (binary_expression "uVar2 - param_2" identifier - identifier)) ;) (if_statement "if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }" if (parenthesized_expression "(param_3 < uVar2 - param_2)" ( (binary_expression "param_3 < uVar2 - param_2" identifier < (binary_expression "uVar2 - param_2" identifier - identifier)) )) (compound_statement "{\n      uVar4 = param_3;\n    }" { (expression_statement "uVar4 = param_3;" (assignment_expression "uVar4 = param_3" identifier = identifier) ;) })) (expression_statement "uVar2 = uVar3 - param_5;" (assignment_expression "uVar2 = uVar3 - param_5" identifier = (binary_expression "uVar3 - param_5" identifier - identifier)) ;) (if_statement "if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }" if (parenthesized_expression "(param_6 < uVar3 - param_5)" ( (binary_expression "param_6 < uVar3 - param_5" identifier < (binary_expression "uVar3 - param_5" identifier - identifier)) )) (compound_statement "{\n      uVar2 = param_6;\n    }" { (expression_statement "uVar2 = param_6;" (assignment_expression "uVar2 = param_6" identifier = identifier) ;) })) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" identifier = identifier) ;) (if_statement "if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }" if (parenthesized_expression "(uVar2 <= uVar4)" ( (binary_expression "uVar2 <= uVar4" identifier <= identifier) )) (compound_statement "{\n      uVar3 = uVar2;\n    }" { (expression_statement "uVar3 = uVar2;" (assignment_expression "uVar3 = uVar2" identifier = identifier) ;) })) (if_statement "if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" if (parenthesized_expression "(uVar3 != 0)" ( (binary_expression "uVar3 != 0" identifier != number_literal) )) (compound_statement "{\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" { (expression_statement "uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);" (assignment_expression "uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" identifier = (call_expression "memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" identifier (argument_list "((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" ( (cast_expression "(void *)(*param_1 + param_2)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + param_2)" ( (binary_expression "*param_1 + param_2" (pointer_expression "*param_1" * identifier) + identifier) ))) , (cast_expression "(void *)(*param_4 + param_5)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_4 + param_5)" ( (binary_expression "*param_4 + param_5" (pointer_expression "*param_4" * identifier) + identifier) ))) , identifier )))) ;) (if_statement "if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }" if (parenthesized_expression "(uVar1 != 0)" ( (binary_expression "uVar1 != 0" identifier != number_literal) )) (compound_statement "{\n        return (ulong)uVar1;\n      }" { (return_statement "return (ulong)uVar1;" return (cast_expression "(ulong)uVar1" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar4 = uVar4 - uVar2;" (assignment_expression "uVar4 = uVar4 - uVar2" identifier = (binary_expression "uVar4 - uVar2" identifier - identifier)) ;) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }" if (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4))" ( (binary_expression "((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" ( (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" ( (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar2 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar4" number_literal < (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n      uVar2 = uVar4 & 0xffffffff;\n    }" { (expression_statement "uVar2 = uVar4 & 0xffffffff;" (assignment_expression "uVar2 = uVar4 & 0xffffffff" identifier = (binary_expression "uVar4 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar2;" return identifier ;) })) comment (expression_statement "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);" (call_expression "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3)" ( (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" " string_content ") , (string_literal ""basic_string::compare"" " string_content ") , identifier , identifier ))) ;) })))
(translation_unit "/* std::string::compare(unsigned long, unsigned long, std::string const&, unsigned long, unsigned\n   long) const */\n\nulong __thiscall\nstd::string::compare\n          (string *this,ulong param_1,ulong param_2,string *param_3,ulong param_4,ulong param_5)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*(long *)this + -0x18);\n  if (uVar2 < param_1) {\n                    /* WARNING: Subroutine does not return */\n    __throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2);\n  }\n  uVar3 = *(ulong *)(*(long *)param_3 + -0x18);\n  if (param_4 <= uVar3) {\n    uVar4 = uVar2 - param_1;\n    if (param_2 < uVar2 - param_1) {\n      uVar4 = param_2;\n    }\n    uVar2 = uVar3 - param_4;\n    if (param_5 < uVar3 - param_4) {\n      uVar2 = param_5;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    /* WARNING: Subroutine does not return */\n  __throw_out_of_range_fmt\n            ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n             param_4,uVar3);\n}\n\n" comment (function_definition "ulong __thiscall\nstd::string::compare\n          (string *this,ulong param_1,ulong param_2,string *param_3,ulong param_4,ulong param_5)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*(long *)this + -0x18);\n  if (uVar2 < param_1) {\n                    /* WARNING: Subroutine does not return */\n    __throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2);\n  }\n  uVar3 = *(ulong *)(*(long *)param_3 + -0x18);\n  if (param_4 <= uVar3) {\n    uVar4 = uVar2 - param_1;\n    if (param_2 < uVar2 - param_1) {\n      uVar4 = param_2;\n    }\n    uVar2 = uVar3 - param_4;\n    if (param_5 < uVar3 - param_4) {\n      uVar2 = param_5;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    /* WARNING: Subroutine does not return */\n  __throw_out_of_range_fmt\n            ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n             param_4,uVar3);\n}" type_identifier (ms_call_modifier "__thiscall" __thiscall) (ERROR "std::string::" identifier : : identifier : :) (function_declarator "compare\n          (string *this,ulong param_1,ulong param_2,string *param_3,ulong param_4,ulong param_5)" identifier (parameter_list "(string *this,ulong param_1,ulong param_2,string *param_3,ulong param_4,ulong param_5)" ( (parameter_declaration "string *this" type_identifier (pointer_declarator "*this" * identifier)) , (parameter_declaration "ulong param_1" type_identifier identifier) , (parameter_declaration "ulong param_2" type_identifier identifier) , (parameter_declaration "string *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "ulong param_4" type_identifier identifier) , (parameter_declaration "ulong param_5" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*(long *)this + -0x18);\n  if (uVar2 < param_1) {\n                    /* WARNING: Subroutine does not return */\n    __throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2);\n  }\n  uVar3 = *(ulong *)(*(long *)param_3 + -0x18);\n  if (param_4 <= uVar3) {\n    uVar4 = uVar2 - param_1;\n    if (param_2 < uVar2 - param_1) {\n      uVar4 = param_2;\n    }\n    uVar2 = uVar3 - param_4;\n    if (param_5 < uVar3 - param_4) {\n      uVar2 = param_5;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    /* WARNING: Subroutine does not return */\n  __throw_out_of_range_fmt\n            ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n             param_4,uVar3);\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "ulong uVar3;" type_identifier identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (expression_statement "uVar2 = *(ulong *)(*(long *)this + -0x18);" (assignment_expression "uVar2 = *(ulong *)(*(long *)this + -0x18)" identifier = (pointer_expression "*(ulong *)(*(long *)this + -0x18)" * (cast_expression "(ulong *)(*(long *)this + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)this + -0x18)" ( (binary_expression "*(long *)this + -0x18" (pointer_expression "*(long *)this" * (cast_expression "(long *)this" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) + number_literal) ))))) ;) (if_statement "if (uVar2 < param_1) {\n                    /* WARNING: Subroutine does not return */\n    __throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2);\n  }" if (parenthesized_expression "(uVar2 < param_1)" ( (binary_expression "uVar2 < param_1" identifier < identifier) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n    __throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2);\n  }" { comment (expression_statement "__throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2);" (call_expression "__throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar2)" ( (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" " string_content ") , (string_literal ""basic_string::compare"" " string_content ") , identifier , identifier ))) ;) })) (expression_statement "uVar3 = *(ulong *)(*(long *)param_3 + -0x18);" (assignment_expression "uVar3 = *(ulong *)(*(long *)param_3 + -0x18)" identifier = (pointer_expression "*(ulong *)(*(long *)param_3 + -0x18)" * (cast_expression "(ulong *)(*(long *)param_3 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)param_3 + -0x18)" ( (binary_expression "*(long *)param_3 + -0x18" (pointer_expression "*(long *)param_3" * (cast_expression "(long *)param_3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) + number_literal) ))))) ;) (if_statement "if (param_4 <= uVar3) {\n    uVar4 = uVar2 - param_1;\n    if (param_2 < uVar2 - param_1) {\n      uVar4 = param_2;\n    }\n    uVar2 = uVar3 - param_4;\n    if (param_5 < uVar3 - param_4) {\n      uVar2 = param_5;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" if (parenthesized_expression "(param_4 <= uVar3)" ( (binary_expression "param_4 <= uVar3" identifier <= identifier) )) (compound_statement "{\n    uVar4 = uVar2 - param_1;\n    if (param_2 < uVar2 - param_1) {\n      uVar4 = param_2;\n    }\n    uVar2 = uVar3 - param_4;\n    if (param_5 < uVar3 - param_4) {\n      uVar2 = param_5;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" { (expression_statement "uVar4 = uVar2 - param_1;" (assignment_expression "uVar4 = uVar2 - param_1" identifier = (binary_expression "uVar2 - param_1" identifier - identifier)) ;) (if_statement "if (param_2 < uVar2 - param_1) {\n      uVar4 = param_2;\n    }" if (parenthesized_expression "(param_2 < uVar2 - param_1)" ( (binary_expression "param_2 < uVar2 - param_1" identifier < (binary_expression "uVar2 - param_1" identifier - identifier)) )) (compound_statement "{\n      uVar4 = param_2;\n    }" { (expression_statement "uVar4 = param_2;" (assignment_expression "uVar4 = param_2" identifier = identifier) ;) })) (expression_statement "uVar2 = uVar3 - param_4;" (assignment_expression "uVar2 = uVar3 - param_4" identifier = (binary_expression "uVar3 - param_4" identifier - identifier)) ;) (if_statement "if (param_5 < uVar3 - param_4) {\n      uVar2 = param_5;\n    }" if (parenthesized_expression "(param_5 < uVar3 - param_4)" ( (binary_expression "param_5 < uVar3 - param_4" identifier < (binary_expression "uVar3 - param_4" identifier - identifier)) )) (compound_statement "{\n      uVar2 = param_5;\n    }" { (expression_statement "uVar2 = param_5;" (assignment_expression "uVar2 = param_5" identifier = identifier) ;) })) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" identifier = identifier) ;) (if_statement "if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }" if (parenthesized_expression "(uVar2 <= uVar4)" ( (binary_expression "uVar2 <= uVar4" identifier <= identifier) )) (compound_statement "{\n      uVar3 = uVar2;\n    }" { (expression_statement "uVar3 = uVar2;" (assignment_expression "uVar3 = uVar2" identifier = identifier) ;) })) (if_statement "if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" if (parenthesized_expression "(uVar3 != 0)" ( (binary_expression "uVar3 != 0" identifier != number_literal) )) (compound_statement "{\n      uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" { (expression_statement "uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3);" (assignment_expression "uVar1 = memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3)" identifier = (call_expression "memcmp((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3)" identifier (argument_list "((void *)(*(long *)this + param_1),(void *)(*(long *)param_3 + param_4),uVar3)" ( (cast_expression "(void *)(*(long *)this + param_1)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)this + param_1)" ( (binary_expression "*(long *)this + param_1" (pointer_expression "*(long *)this" * (cast_expression "(long *)this" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) + identifier) ))) , (cast_expression "(void *)(*(long *)param_3 + param_4)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)param_3 + param_4)" ( (binary_expression "*(long *)param_3 + param_4" (pointer_expression "*(long *)param_3" * (cast_expression "(long *)param_3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier)) + identifier) ))) , identifier )))) ;) (if_statement "if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }" if (parenthesized_expression "(uVar1 != 0)" ( (binary_expression "uVar1 != 0" identifier != number_literal) )) (compound_statement "{\n        return (ulong)uVar1;\n      }" { (return_statement "return (ulong)uVar1;" return (cast_expression "(ulong)uVar1" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar4 = uVar4 - uVar2;" (assignment_expression "uVar4 = uVar4 - uVar2" identifier = (binary_expression "uVar4 - uVar2" identifier - identifier)) ;) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }" if (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4))" ( (binary_expression "((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" ( (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" ( (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar2 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar4" number_literal < (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n      uVar2 = uVar4 & 0xffffffff;\n    }" { (expression_statement "uVar2 = uVar4 & 0xffffffff;" (assignment_expression "uVar2 = uVar4 & 0xffffffff" identifier = (binary_expression "uVar4 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar2;" return identifier ;) })) comment (expression_statement "__throw_out_of_range_fmt\n            ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n             param_4,uVar3);" (call_expression "__throw_out_of_range_fmt\n            ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n             param_4,uVar3)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n             param_4,uVar3)" ( (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" " string_content ") , (string_literal ""basic_string::compare"" " string_content ") , identifier , identifier ))) ;) })))
(translation_unit "ulong FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    \n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}\n\n" (function_definition "ulong FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    \n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}" type_identifier (function_declarator "FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)" identifier (parameter_list "(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "ulong param_2" type_identifier identifier) , (parameter_declaration "ulong param_3" type_identifier identifier) , (parameter_declaration "long *param_4" (sized_type_specifier "long" long) (pointer_declarator "*param_4" * identifier)) , (parameter_declaration "ulong param_5" type_identifier identifier) , (parameter_declaration "ulong param_6" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    \n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "ulong uVar3;" type_identifier identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (expression_statement "uVar2 = *(ulong *)(*param_1 + -0x18);" (assignment_expression "uVar2 = *(ulong *)(*param_1 + -0x18)" identifier = (pointer_expression "*(ulong *)(*param_1 + -0x18)" * (cast_expression "(ulong *)(*param_1 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + -0x18)" ( (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" * identifier) + number_literal) ))))) ;) (if_statement "if (uVar2 < param_2) {\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" if (parenthesized_expression "(uVar2 < param_2)" ( (binary_expression "uVar2 < param_2" identifier < identifier) )) (compound_statement "{\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" { (expression_statement "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);" (call_expression "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2)" ( (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" " string_content ") , (string_literal ""basic_string::compare"" " string_content ") , identifier , identifier ))) ;) })) (expression_statement "uVar3 = *(ulong *)(*param_4 + -0x18);" (assignment_expression "uVar3 = *(ulong *)(*param_4 + -0x18)" identifier = (pointer_expression "*(ulong *)(*param_4 + -0x18)" * (cast_expression "(ulong *)(*param_4 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_4 + -0x18)" ( (binary_expression "*param_4 + -0x18" (pointer_expression "*param_4" * identifier) + number_literal) ))))) ;) (if_statement "if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" if (parenthesized_expression "(param_5 <= uVar3)" ( (binary_expression "param_5 <= uVar3" identifier <= identifier) )) (compound_statement "{\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" { (expression_statement "uVar4 = uVar2 - param_2;" (assignment_expression "uVar4 = uVar2 - param_2" identifier = (binary_expression "uVar2 - param_2" identifier - identifier)) ;) (if_statement "if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }" if (parenthesized_expression "(param_3 < uVar2 - param_2)" ( (binary_expression "param_3 < uVar2 - param_2" identifier < (binary_expression "uVar2 - param_2" identifier - identifier)) )) (compound_statement "{\n      uVar4 = param_3;\n    }" { (expression_statement "uVar4 = param_3;" (assignment_expression "uVar4 = param_3" identifier = identifier) ;) })) (expression_statement "uVar2 = uVar3 - param_5;" (assignment_expression "uVar2 = uVar3 - param_5" identifier = (binary_expression "uVar3 - param_5" identifier - identifier)) ;) (if_statement "if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }" if (parenthesized_expression "(param_6 < uVar3 - param_5)" ( (binary_expression "param_6 < uVar3 - param_5" identifier < (binary_expression "uVar3 - param_5" identifier - identifier)) )) (compound_statement "{\n      uVar2 = param_6;\n    }" { (expression_statement "uVar2 = param_6;" (assignment_expression "uVar2 = param_6" identifier = identifier) ;) })) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" identifier = identifier) ;) (if_statement "if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }" if (parenthesized_expression "(uVar2 <= uVar4)" ( (binary_expression "uVar2 <= uVar4" identifier <= identifier) )) (compound_statement "{\n      uVar3 = uVar2;\n    }" { (expression_statement "uVar3 = uVar2;" (assignment_expression "uVar3 = uVar2" identifier = identifier) ;) })) (if_statement "if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" if (parenthesized_expression "(uVar3 != 0)" ( (binary_expression "uVar3 != 0" identifier != number_literal) )) (compound_statement "{\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" { (expression_statement "uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);" (assignment_expression "uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" identifier = (call_expression "memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" identifier (argument_list "((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" ( (cast_expression "(void *)(*param_1 + param_2)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_1 + param_2)" ( (binary_expression "*param_1 + param_2" (pointer_expression "*param_1" * identifier) + identifier) ))) , (cast_expression "(void *)(*param_4 + param_5)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_4 + param_5)" ( (binary_expression "*param_4 + param_5" (pointer_expression "*param_4" * identifier) + identifier) ))) , identifier )))) ;) (if_statement "if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }" if (parenthesized_expression "(uVar1 != 0)" ( (binary_expression "uVar1 != 0" identifier != number_literal) )) (compound_statement "{\n        return (ulong)uVar1;\n      }" { (return_statement "return (ulong)uVar1;" return (cast_expression "(ulong)uVar1" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar4 = uVar4 - uVar2;" (assignment_expression "uVar4 = uVar4 - uVar2" identifier = (binary_expression "uVar4 - uVar2" identifier - identifier)) ;) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }" if (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4))" ( (binary_expression "((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" ( (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" ( (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar2 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar4" number_literal < (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n      uVar2 = uVar4 & 0xffffffff;\n    }" { (expression_statement "uVar2 = uVar4 & 0xffffffff;" (assignment_expression "uVar2 = uVar4 & 0xffffffff" identifier = (binary_expression "uVar4 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar2;" return identifier ;) })) (expression_statement "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);" (call_expression "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3)" ( (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" " string_content ") , (string_literal ""basic_string::compare"" " string_content ") , identifier , identifier ))) ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < IDENT) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( (string_literal " string_content ") , (string_literal " string_content ") , IDENT , IDENT ))) ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT <= IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT - IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < (binary_expression IDENT - IDENT)) )) (compound_statement { (expression_statement (assignment_expression IDENT = IDENT) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT - IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < (binary_expression IDENT - IDENT)) )) (compound_statement { (expression_statement (assignment_expression IDENT = IDENT) ;) })) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT <= IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = IDENT) ;) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + IDENT) ))) , (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + IDENT) ))) , IDENT )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (return_statement return (cast_expression ( (type_descriptor TYPE) ) IDENT) ;) })) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT - IDENT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) < LIT) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = LIT) , (binary_expression LIT < (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT))) ))) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT & LIT)) ;) })) (return_statement return IDENT ;) })) (expression_statement (call_expression IDENT (argument_list ( (string_literal " string_content ") , (string_literal " string_content ") , IDENT , IDENT ))) ;) })))
(function_definition "ulong FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    \n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}" (type_identifier "ulong") (function_declarator "FUN_002a9640(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)" (identifier "FUN_002a9640") (parameter_list "(long *param_1,ulong param_2,ulong param_3,long *param_4,ulong param_5,\n                  ulong param_6)" (( "(") (parameter_declaration "long *param_1" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "ulong param_2" (type_identifier "ulong") (identifier "param_2")) (, ",") (parameter_declaration "ulong param_3" (type_identifier "ulong") (identifier "param_3")) (, ",") (parameter_declaration "long *param_4" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_4" (* "*") (identifier "param_4"))) (, ",") (parameter_declaration "ulong param_5" (type_identifier "ulong") (identifier "param_5")) (, ",") (parameter_declaration "ulong param_6" (type_identifier "ulong") (identifier "param_6")) () ")"))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = *(ulong *)(*param_4 + -0x18);\n  if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }\n                    \n  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);\n}" ({ "{") (declaration "uint uVar1;" (type_identifier "uint") (identifier "uVar1") (; ";")) (declaration "ulong uVar2;" (type_identifier "ulong") (identifier "uVar2") (; ";")) (declaration "ulong uVar3;" (type_identifier "ulong") (identifier "uVar3") (; ";")) (declaration "ulong uVar4;" (type_identifier "ulong") (identifier "uVar4") (; ";")) (expression_statement "uVar2 = *(ulong *)(*param_1 + -0x18);" (assignment_expression "uVar2 = *(ulong *)(*param_1 + -0x18)" (identifier "uVar2") (= "=") (pointer_expression "*(ulong *)(*param_1 + -0x18)" (* "*") (cast_expression "(ulong *)(*param_1 + -0x18)" (( "(") (type_descriptor "ulong *" (type_identifier "ulong") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*param_1 + -0x18)" (( "(") (binary_expression "*param_1 + -0x18" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (+ "+") (number_literal "-0x18")) () ")"))))) (; ";")) (if_statement "if (uVar2 < param_2) {\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" (if "if") (parenthesized_expression "(uVar2 < param_2)" (( "(") (binary_expression "uVar2 < param_2" (identifier "uVar2") (< "<") (identifier "param_2")) () ")")) (compound_statement "{\n                    \n    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" ({ "{") (expression_statement "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);" (call_expression "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2)" (identifier "FUN_002b56d0") (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2)" (( "(") (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" (" """) (string_content "%s: __pos (which is %zu) > this->size() (which is %zu)") (" """)) (, ",") (string_literal ""basic_string::compare"" (" """) (string_content "basic_string::compare") (" """)) (, ",") (identifier "param_2") (, ",") (identifier "uVar2") () ")"))) (; ";")) (} "}"))) (expression_statement "uVar3 = *(ulong *)(*param_4 + -0x18);" (assignment_expression "uVar3 = *(ulong *)(*param_4 + -0x18)" (identifier "uVar3") (= "=") (pointer_expression "*(ulong *)(*param_4 + -0x18)" (* "*") (cast_expression "(ulong *)(*param_4 + -0x18)" (( "(") (type_descriptor "ulong *" (type_identifier "ulong") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*param_4 + -0x18)" (( "(") (binary_expression "*param_4 + -0x18" (pointer_expression "*param_4" (* "*") (identifier "param_4")) (+ "+") (number_literal "-0x18")) () ")"))))) (; ";")) (if_statement "if (param_5 <= uVar3) {\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" (if "if") (parenthesized_expression "(param_5 <= uVar3)" (( "(") (binary_expression "param_5 <= uVar3" (identifier "param_5") (<= "<=") (identifier "uVar3")) () ")")) (compound_statement "{\n    uVar4 = uVar2 - param_2;\n    if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }\n    uVar2 = uVar3 - param_5;\n    if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }\n    uVar3 = uVar4;\n    if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }\n    if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }\n    uVar4 = uVar4 - uVar2;\n    uVar2 = 0x7fffffff;\n    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }\n    return uVar2;\n  }" ({ "{") (expression_statement "uVar4 = uVar2 - param_2;" (assignment_expression "uVar4 = uVar2 - param_2" (identifier "uVar4") (= "=") (binary_expression "uVar2 - param_2" (identifier "uVar2") (- "-") (identifier "param_2"))) (; ";")) (if_statement "if (param_3 < uVar2 - param_2) {\n      uVar4 = param_3;\n    }" (if "if") (parenthesized_expression "(param_3 < uVar2 - param_2)" (( "(") (binary_expression "param_3 < uVar2 - param_2" (identifier "param_3") (< "<") (binary_expression "uVar2 - param_2" (identifier "uVar2") (- "-") (identifier "param_2"))) () ")")) (compound_statement "{\n      uVar4 = param_3;\n    }" ({ "{") (expression_statement "uVar4 = param_3;" (assignment_expression "uVar4 = param_3" (identifier "uVar4") (= "=") (identifier "param_3")) (; ";")) (} "}"))) (expression_statement "uVar2 = uVar3 - param_5;" (assignment_expression "uVar2 = uVar3 - param_5" (identifier "uVar2") (= "=") (binary_expression "uVar3 - param_5" (identifier "uVar3") (- "-") (identifier "param_5"))) (; ";")) (if_statement "if (param_6 < uVar3 - param_5) {\n      uVar2 = param_6;\n    }" (if "if") (parenthesized_expression "(param_6 < uVar3 - param_5)" (( "(") (binary_expression "param_6 < uVar3 - param_5" (identifier "param_6") (< "<") (binary_expression "uVar3 - param_5" (identifier "uVar3") (- "-") (identifier "param_5"))) () ")")) (compound_statement "{\n      uVar2 = param_6;\n    }" ({ "{") (expression_statement "uVar2 = param_6;" (assignment_expression "uVar2 = param_6" (identifier "uVar2") (= "=") (identifier "param_6")) (; ";")) (} "}"))) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" (identifier "uVar3") (= "=") (identifier "uVar4")) (; ";")) (if_statement "if (uVar2 <= uVar4) {\n      uVar3 = uVar2;\n    }" (if "if") (parenthesized_expression "(uVar2 <= uVar4)" (( "(") (binary_expression "uVar2 <= uVar4" (identifier "uVar2") (<= "<=") (identifier "uVar4")) () ")")) (compound_statement "{\n      uVar3 = uVar2;\n    }" ({ "{") (expression_statement "uVar3 = uVar2;" (assignment_expression "uVar3 = uVar2" (identifier "uVar3") (= "=") (identifier "uVar2")) (; ";")) (} "}"))) (if_statement "if (uVar3 != 0) {\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" (if "if") (parenthesized_expression "(uVar3 != 0)" (( "(") (binary_expression "uVar3 != 0" (identifier "uVar3") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);\n      if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }\n    }" ({ "{") (expression_statement "uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);" (assignment_expression "uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" (identifier "uVar1") (= "=") (call_expression "memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" (identifier "memcmp") (argument_list "((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3)" (( "(") (cast_expression "(void *)(*param_1 + param_2)" (( "(") (type_descriptor "void *" (primitive_type "void") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*param_1 + param_2)" (( "(") (binary_expression "*param_1 + param_2" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (+ "+") (identifier "param_2")) () ")"))) (, ",") (cast_expression "(void *)(*param_4 + param_5)" (( "(") (type_descriptor "void *" (primitive_type "void") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*param_4 + param_5)" (( "(") (binary_expression "*param_4 + param_5" (pointer_expression "*param_4" (* "*") (identifier "param_4")) (+ "+") (identifier "param_5")) () ")"))) (, ",") (identifier "uVar3") () ")")))) (; ";")) (if_statement "if (uVar1 != 0) {\n        return (ulong)uVar1;\n      }" (if "if") (parenthesized_expression "(uVar1 != 0)" (( "(") (binary_expression "uVar1 != 0" (identifier "uVar1") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n        return (ulong)uVar1;\n      }" ({ "{") (return_statement "return (ulong)uVar1;" (return "return") (cast_expression "(ulong)uVar1" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (identifier "uVar1")) (; ";")) (} "}"))) (} "}"))) (expression_statement "uVar4 = uVar4 - uVar2;" (assignment_expression "uVar4 = uVar4 - uVar2" (identifier "uVar4") (= "=") (binary_expression "uVar4 - uVar2" (identifier "uVar4") (- "-") (identifier "uVar2"))) (; ";")) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" (identifier "uVar2") (= "=") (number_literal "0x7fffffff")) (; ";")) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {\n      uVar2 = uVar4 & 0xffffffff;\n    }" (if "if") (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4))" (( "(") (binary_expression "((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" (( "(") (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar4")) (< "<") (number_literal "0x80000000")) () ")")) (&& "&&") (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar4)" (( "(") (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar2 = 0x80000000" (identifier "uVar2") (= "=") (number_literal "0x80000000")) (, ",") (binary_expression "-0x80000001 < (long)uVar4" (number_literal "-0x80000001") (< "<") (cast_expression "(long)uVar4" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar4")))) () ")"))) () ")")) (compound_statement "{\n      uVar2 = uVar4 & 0xffffffff;\n    }" ({ "{") (expression_statement "uVar2 = uVar4 & 0xffffffff;" (assignment_expression "uVar2 = uVar4 & 0xffffffff" (identifier "uVar2") (= "=") (binary_expression "uVar4 & 0xffffffff" (identifier "uVar4") (& "&") (number_literal "0xffffffff"))) (; ";")) (} "}"))) (return_statement "return uVar2;" (return "return") (identifier "uVar2") (; ";")) (} "}"))) (expression_statement "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3);" (call_expression "FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3)" (identifier "FUN_002b56d0") (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_5,uVar3)" (( "(") (string_literal ""%s: __pos (which is %zu) > this->size() (which is %zu)"" (" """) (string_content "%s: __pos (which is %zu) > this->size() (which is %zu)") (" """)) (, ",") (string_literal ""basic_string::compare"" (" """) (string_content "basic_string::compare") (" """)) (, ",") (identifier "param_5") (, ",") (identifier "uVar3") () ")"))) (; ";")) (} "}")))

/* std::string::compare(unsigned long, unsigned long, std::string const&, unsigned long, unsigned
   long) const */

type_1 __thiscall
std::type_2::function_1
          (type_2 *this,type_1 var_2,type_1 var_6,type_2 *param_3,type_1 var_4,type_1 var_7)

{
  type_3 var_10;
  type_1 var_1;
  type_1 var_5;
  type_1 var_8;
  
  var_1 = *(type_1 *)(*(long *)this + -0x18);
  if (var_1 < var_2) {
                    /* WARNING: Subroutine does not return */
    var_3
              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
               var_2,var_1);
  }
  var_5 = *(type_1 *)(*(long *)param_3 + -0x18);
  if (var_4 <= var_5) {
    var_8 = var_1 - var_2;
    if (var_6 < var_1 - var_2) {
      var_8 = var_6;
    }
    var_1 = var_5 - var_4;
    if (var_7 < var_5 - var_4) {
      var_1 = var_7;
    }
    var_5 = var_8;
    if (var_1 <= var_8) {
      var_5 = var_1;
    }
    if (var_5 != 0) {
      var_10 = var_9((void *)(*(long *)this + var_2),(void *)(*(long *)param_3 + var_4),var_5);
      if (var_10 != 0) {
        return (type_1)var_10;
      }
    }
    var_8 = var_8 - var_1;
    var_1 = 0x7fffffff;
    if (((long)var_8 < 0x80000000) && (var_1 = 0x80000000, -0x80000001 < (long)var_8)) {
      var_1 = var_8 & 0xffffffff;
    }
    return var_1;
  }
                    /* WARNING: Subroutine does not return */
  var_3
            ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
             var_4,var_5);
}


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

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

{
  uint uVar1;
  ulong uVar2;
  ulong uVar3;
  ulong uVar4;
  
  uVar2 = *(ulong *)(*param_1 + -0x18);
  if (uVar2 < param_2) {
                    /* WARNING: Subroutine does not return */
    FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
                 param_2,uVar2);
  }
  uVar3 = *(ulong *)(*param_4 + -0x18);
  if (param_5 <= uVar3) {
    uVar4 = uVar2 - param_2;
    if (param_3 < uVar2 - param_2) {
      uVar4 = param_3;
    }
    uVar2 = uVar3 - param_5;
    if (param_6 < uVar3 - param_5) {
      uVar2 = param_6;
    }
    uVar3 = uVar4;
    if (uVar2 <= uVar4) {
      uVar3 = uVar2;
    }
    if (uVar3 != 0) {
      uVar1 = memcmp((void *)(*param_1 + param_2),(void *)(*param_4 + param_5),uVar3);
      if (uVar1 != 0) {
        return (ulong)uVar1;
      }
    }
    uVar4 = uVar4 - uVar2;
    uVar2 = 0x7fffffff;
    if (((long)uVar4 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar4)) {
      uVar2 = uVar4 & 0xffffffff;
    }
    return uVar2;
  }
                    /* WARNING: Subroutine does not return */
  FUN_002b56d0("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
               param_5,uVar3);
}

