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

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

{
  uint uVar1;
  ulong uVar2;
  ulong uVar3;
  
  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 = uVar2 - param_1;
  if (param_2 < uVar2 - param_1) {
    uVar3 = param_2;
  }
  uVar2 = param_4;
  if (uVar3 <= param_4) {
    uVar2 = uVar3;
  }
  if (uVar2 != 0) {
    uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2);
    if (uVar1 != 0) {
      return (ulong)uVar1;
    }
  }
  uVar3 = uVar3 - param_4;
  uVar2 = 0x7fffffff;
  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {
    uVar2 = uVar3 & 0xffffffff;
  }
  return uVar2;
}



ulong FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)

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


PUSH RBP
PUSH RBX
SUB RSP,0x8
MOV RDI,qword ptr [RDI]
MOV RBX,qword ptr [RDI + -0x18]
CMP RSI,RBX
JA 0x002d54c2
SUB RBX,RSI
MOV RBP,R8
CMP RBX,RDX
CMOVA RBX,RDX
MOV RDX,R8
CMP RBX,R8
CMOVBE RDX,RBX
TEST RDX,RDX
JZ 0x002d549d
ADD RDI,RSI
MOV RSI,RCX
CALL 0x00144830
TEST EAX,EAX
JNZ 0x002d54bb
SUB RBX,RBP
MOV EAX,0x7fffffff
CMP RBX,0x7fffffff
JG 0x002d54bb
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,[0x35b13d]
XOR EAX,EAX
LEA RDI,[0x342ff0]
CALL 0x002e1330
(translation_unit "ulong FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}\n\n" (function_definition "ulong FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}" type_identifier (function_declarator "FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)" identifier (parameter_list "(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)" ( (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 "void *param_4" primitive_type (pointer_declarator "*param_4" * identifier)) , (parameter_declaration "ulong param_5" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "ulong uVar3;" 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_002e1330("%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_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" { comment (expression_statement "FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);" (call_expression "FUN_002e1330("%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 = uVar2 - param_2;" (assignment_expression "uVar3 = uVar2 - param_2" identifier = (binary_expression "uVar2 - param_2" identifier - identifier)) ;) (if_statement "if (param_3 < uVar2 - param_2) {\n    uVar3 = 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    uVar3 = param_3;\n  }" { (expression_statement "uVar3 = param_3;" (assignment_expression "uVar3 = param_3" identifier = identifier) ;) })) (expression_statement "uVar2 = param_5;" (assignment_expression "uVar2 = param_5" identifier = identifier) ;) (if_statement "if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }" if (parenthesized_expression "(uVar3 <= param_5)" ( (binary_expression "uVar3 <= param_5" identifier <= identifier) )) (compound_statement "{\n    uVar2 = uVar3;\n  }" { (expression_statement "uVar2 = uVar3;" (assignment_expression "uVar2 = uVar3" identifier = identifier) ;) })) (if_statement "if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" if (parenthesized_expression "(uVar2 != 0)" ( (binary_expression "uVar2 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" { (expression_statement "uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);" (assignment_expression "uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2)" identifier = (call_expression "memcmp((void *)(*param_1 + param_2),param_4,uVar2)" identifier (argument_list "((void *)(*param_1 + param_2),param_4,uVar2)" ( (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) ))) , 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 "uVar3 = uVar3 - param_5;" (assignment_expression "uVar3 = uVar3 - param_5" identifier = (binary_expression "uVar3 - param_5" identifier - identifier)) ;) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3))" ( (binary_expression "((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" (parenthesized_expression "((long)uVar3 < 0x80000000)" ( (binary_expression "(long)uVar3 < 0x80000000" (cast_expression "(long)uVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" ( (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar3" (assignment_expression "uVar2 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar3" number_literal < (cast_expression "(long)uVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar2 = uVar3 & 0xffffffff;\n  }" { (expression_statement "uVar2 = uVar3 & 0xffffffff;" (assignment_expression "uVar2 = uVar3 & 0xffffffff" identifier = (binary_expression "uVar3 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar2;" return identifier ;) })))
(translation_unit "/* std::string::compare(unsigned long, unsigned long, char const*, unsigned long) const */\n\nulong __thiscall\nstd::string::compare(string *this,ulong param_1,ulong param_2,char *param_3,ulong param_4)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\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 = uVar2 - param_1;\n  if (param_2 < uVar2 - param_1) {\n    uVar3 = param_2;\n  }\n  uVar2 = param_4;\n  if (uVar3 <= param_4) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_4;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}\n\n" comment (function_definition "ulong __thiscall\nstd::string::compare(string *this,ulong param_1,ulong param_2,char *param_3,ulong param_4)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\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 = uVar2 - param_1;\n  if (param_2 < uVar2 - param_1) {\n    uVar3 = param_2;\n  }\n  uVar2 = param_4;\n  if (uVar3 <= param_4) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_4;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}" type_identifier (ms_call_modifier "__thiscall" __thiscall) (ERROR "std::string::" identifier : : identifier : :) (function_declarator "compare(string *this,ulong param_1,ulong param_2,char *param_3,ulong param_4)" identifier (parameter_list "(string *this,ulong param_1,ulong param_2,char *param_3,ulong param_4)" ( (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 "char *param_3" primitive_type (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "ulong param_4" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\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 = uVar2 - param_1;\n  if (param_2 < uVar2 - param_1) {\n    uVar3 = param_2;\n  }\n  uVar2 = param_4;\n  if (uVar3 <= param_4) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_4;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "ulong uVar3;" 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 = uVar2 - param_1;" (assignment_expression "uVar3 = uVar2 - param_1" identifier = (binary_expression "uVar2 - param_1" identifier - identifier)) ;) (if_statement "if (param_2 < uVar2 - param_1) {\n    uVar3 = 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    uVar3 = param_2;\n  }" { (expression_statement "uVar3 = param_2;" (assignment_expression "uVar3 = param_2" identifier = identifier) ;) })) (expression_statement "uVar2 = param_4;" (assignment_expression "uVar2 = param_4" identifier = identifier) ;) (if_statement "if (uVar3 <= param_4) {\n    uVar2 = uVar3;\n  }" if (parenthesized_expression "(uVar3 <= param_4)" ( (binary_expression "uVar3 <= param_4" identifier <= identifier) )) (compound_statement "{\n    uVar2 = uVar3;\n  }" { (expression_statement "uVar2 = uVar3;" (assignment_expression "uVar2 = uVar3" identifier = identifier) ;) })) (if_statement "if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" if (parenthesized_expression "(uVar2 != 0)" ( (binary_expression "uVar2 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" { (expression_statement "uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2);" (assignment_expression "uVar1 = memcmp((void *)(*(long *)this + param_1),param_3,uVar2)" identifier = (call_expression "memcmp((void *)(*(long *)this + param_1),param_3,uVar2)" identifier (argument_list "((void *)(*(long *)this + param_1),param_3,uVar2)" ( (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) ))) , 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 "uVar3 = uVar3 - param_4;" (assignment_expression "uVar3 = uVar3 - param_4" identifier = (binary_expression "uVar3 - param_4" identifier - identifier)) ;) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3))" ( (binary_expression "((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" (parenthesized_expression "((long)uVar3 < 0x80000000)" ( (binary_expression "(long)uVar3 < 0x80000000" (cast_expression "(long)uVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" ( (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar3" (assignment_expression "uVar2 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar3" number_literal < (cast_expression "(long)uVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar2 = uVar3 & 0xffffffff;\n  }" { (expression_statement "uVar2 = uVar3 & 0xffffffff;" (assignment_expression "uVar2 = uVar3 & 0xffffffff" identifier = (binary_expression "uVar3 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar2;" return identifier ;) })))
(translation_unit "ulong FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}\n\n" (function_definition "ulong FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}" type_identifier (function_declarator "FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)" identifier (parameter_list "(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)" ( (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 "void *param_4" primitive_type (pointer_declarator "*param_4" * identifier)) , (parameter_declaration "ulong param_5" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "ulong uVar3;" 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_002e1330("%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_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" { (expression_statement "FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);" (call_expression "FUN_002e1330("%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 = uVar2 - param_2;" (assignment_expression "uVar3 = uVar2 - param_2" identifier = (binary_expression "uVar2 - param_2" identifier - identifier)) ;) (if_statement "if (param_3 < uVar2 - param_2) {\n    uVar3 = 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    uVar3 = param_3;\n  }" { (expression_statement "uVar3 = param_3;" (assignment_expression "uVar3 = param_3" identifier = identifier) ;) })) (expression_statement "uVar2 = param_5;" (assignment_expression "uVar2 = param_5" identifier = identifier) ;) (if_statement "if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }" if (parenthesized_expression "(uVar3 <= param_5)" ( (binary_expression "uVar3 <= param_5" identifier <= identifier) )) (compound_statement "{\n    uVar2 = uVar3;\n  }" { (expression_statement "uVar2 = uVar3;" (assignment_expression "uVar2 = uVar3" identifier = identifier) ;) })) (if_statement "if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" if (parenthesized_expression "(uVar2 != 0)" ( (binary_expression "uVar2 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" { (expression_statement "uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);" (assignment_expression "uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2)" identifier = (call_expression "memcmp((void *)(*param_1 + param_2),param_4,uVar2)" identifier (argument_list "((void *)(*param_1 + param_2),param_4,uVar2)" ( (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) ))) , 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 "uVar3 = uVar3 - param_5;" (assignment_expression "uVar3 = uVar3 - param_5" identifier = (binary_expression "uVar3 - param_5" identifier - identifier)) ;) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3))" ( (binary_expression "((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" (parenthesized_expression "((long)uVar3 < 0x80000000)" ( (binary_expression "(long)uVar3 < 0x80000000" (cast_expression "(long)uVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" ( (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar3" (assignment_expression "uVar2 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar3" number_literal < (cast_expression "(long)uVar3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar2 = uVar3 & 0xffffffff;\n  }" { (expression_statement "uVar2 = uVar3 & 0xffffffff;" (assignment_expression "uVar2 = uVar3 & 0xffffffff" identifier = (binary_expression "uVar3 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar2;" return 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 TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (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 = (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) ))) , 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 ;) })))
(function_definition "ulong FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)\n\n{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\n}" (type_identifier "ulong") (function_declarator "FUN_002d5460(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)" (identifier "FUN_002d5460") (parameter_list "(long *param_1,ulong param_2,ulong param_3,void *param_4,ulong param_5)" (( "(") (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 "void *param_4" (primitive_type "void") (pointer_declarator "*param_4" (* "*") (identifier "param_4"))) (, ",") (parameter_declaration "ulong param_5" (type_identifier "ulong") (identifier "param_5")) () ")"))) (compound_statement "{\n  uint uVar1;\n  ulong uVar2;\n  ulong uVar3;\n  \n  uVar2 = *(ulong *)(*param_1 + -0x18);\n  if (uVar2 < param_2) {\n                    \n    FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }\n  uVar3 = uVar2 - param_2;\n  if (param_3 < uVar2 - param_2) {\n    uVar3 = param_3;\n  }\n  uVar2 = param_5;\n  if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }\n  if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar3 = uVar3 - param_5;\n  uVar2 = 0x7fffffff;\n  if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }\n  return uVar2;\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") (; ";")) (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_002e1330("%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_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);\n  }" ({ "{") (expression_statement "FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2);" (call_expression "FUN_002e1330("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar2)" (identifier "FUN_002e1330") (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 = uVar2 - param_2;" (assignment_expression "uVar3 = uVar2 - param_2" (identifier "uVar3") (= "=") (binary_expression "uVar2 - param_2" (identifier "uVar2") (- "-") (identifier "param_2"))) (; ";")) (if_statement "if (param_3 < uVar2 - param_2) {\n    uVar3 = 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    uVar3 = param_3;\n  }" ({ "{") (expression_statement "uVar3 = param_3;" (assignment_expression "uVar3 = param_3" (identifier "uVar3") (= "=") (identifier "param_3")) (; ";")) (} "}"))) (expression_statement "uVar2 = param_5;" (assignment_expression "uVar2 = param_5" (identifier "uVar2") (= "=") (identifier "param_5")) (; ";")) (if_statement "if (uVar3 <= param_5) {\n    uVar2 = uVar3;\n  }" (if "if") (parenthesized_expression "(uVar3 <= param_5)" (( "(") (binary_expression "uVar3 <= param_5" (identifier "uVar3") (<= "<=") (identifier "param_5")) () ")")) (compound_statement "{\n    uVar2 = uVar3;\n  }" ({ "{") (expression_statement "uVar2 = uVar3;" (assignment_expression "uVar2 = uVar3" (identifier "uVar2") (= "=") (identifier "uVar3")) (; ";")) (} "}"))) (if_statement "if (uVar2 != 0) {\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" (if "if") (parenthesized_expression "(uVar2 != 0)" (( "(") (binary_expression "uVar2 != 0" (identifier "uVar2") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" ({ "{") (expression_statement "uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2);" (assignment_expression "uVar1 = memcmp((void *)(*param_1 + param_2),param_4,uVar2)" (identifier "uVar1") (= "=") (call_expression "memcmp((void *)(*param_1 + param_2),param_4,uVar2)" (identifier "memcmp") (argument_list "((void *)(*param_1 + param_2),param_4,uVar2)" (( "(") (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")) () ")"))) (, ",") (identifier "param_4") (, ",") (identifier "uVar2") () ")")))) (; ";")) (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 "uVar3 = uVar3 - param_5;" (assignment_expression "uVar3 = uVar3 - param_5" (identifier "uVar3") (= "=") (binary_expression "uVar3 - param_5" (identifier "uVar3") (- "-") (identifier "param_5"))) (; ";")) (expression_statement "uVar2 = 0x7fffffff;" (assignment_expression "uVar2 = 0x7fffffff" (identifier "uVar2") (= "=") (number_literal "0x7fffffff")) (; ";")) (if_statement "if (((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)) {\n    uVar2 = uVar3 & 0xffffffff;\n  }" (if "if") (parenthesized_expression "(((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3))" (( "(") (binary_expression "((long)uVar3 < 0x80000000) && (uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" (parenthesized_expression "((long)uVar3 < 0x80000000)" (( "(") (binary_expression "(long)uVar3 < 0x80000000" (cast_expression "(long)uVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar3")) (< "<") (number_literal "0x80000000")) () ")")) (&& "&&") (parenthesized_expression "(uVar2 = 0x80000000, -0x80000001 < (long)uVar3)" (( "(") (comma_expression "uVar2 = 0x80000000, -0x80000001 < (long)uVar3" (assignment_expression "uVar2 = 0x80000000" (identifier "uVar2") (= "=") (number_literal "0x80000000")) (, ",") (binary_expression "-0x80000001 < (long)uVar3" (number_literal "-0x80000001") (< "<") (cast_expression "(long)uVar3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar3")))) () ")"))) () ")")) (compound_statement "{\n    uVar2 = uVar3 & 0xffffffff;\n  }" ({ "{") (expression_statement "uVar2 = uVar3 & 0xffffffff;" (assignment_expression "uVar2 = uVar3 & 0xffffffff" (identifier "uVar2") (= "=") (binary_expression "uVar3 & 0xffffffff" (identifier "uVar3") (& "&") (number_literal "0xffffffff"))) (; ";")) (} "}"))) (return_statement "return uVar2;" (return "return") (identifier "uVar2") (; ";")) (} "}")))

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

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

{
  type_3 var_8;
  type_1 var_1;
  type_1 var_5;
  
  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 = var_1 - var_2;
  if (var_4 < var_1 - var_2) {
    var_5 = var_4;
  }
  var_1 = var_6;
  if (var_5 <= var_6) {
    var_1 = var_5;
  }
  if (var_1 != 0) {
    var_8 = var_7((void *)(*(long *)this + var_2),param_3,var_1);
    if (var_8 != 0) {
      return (type_1)var_8;
    }
  }
  var_5 = var_5 - var_6;
  var_1 = 0x7fffffff;
  if (((long)var_5 < 0x80000000) && (var_1 = 0x80000000, -0x80000001 < (long)var_5)) {
    var_1 = var_5 & 0xffffffff;
  }
  return var_1;
}


(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: (primitive_type) declarator: (pointer_declarator 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)) (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: (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)))) (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)))))

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

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

