
/* std::wstring::compare(unsigned long, unsigned long, wchar_t const*) const */

ulong __thiscall std::wstring::compare(wstring *this,ulong param_1,ulong param_2,wchar_t *param_3)

{
  long lVar1;
  uint uVar2;
  size_t sVar3;
  ulong uVar4;
  ulong uVar5;
  
  lVar1 = *(long *)this;
  uVar4 = *(ulong *)(lVar1 + -0x18);
  if (uVar4 < 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,uVar4);
  }
  uVar5 = uVar4 - param_1;
  if (param_2 < uVar4 - param_1) {
    uVar5 = param_2;
  }
  sVar3 = wcslen(param_3);
  uVar4 = uVar5;
  if (sVar3 <= uVar5) {
    uVar4 = sVar3;
  }
  if (uVar4 != 0) {
    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4);
    if (uVar2 != 0) {
      return (ulong)uVar2;
    }
  }
  uVar5 = uVar5 - sVar3;
  uVar4 = 0x7fffffff;
  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {
    uVar4 = uVar5 & 0xffffffff;
  }
  return uVar4;
}



ulong FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)

{
  long lVar1;
  uint uVar2;
  size_t sVar3;
  ulong uVar4;
  ulong uVar5;
  
  lVar1 = *param_1;
  uVar4 = *(ulong *)(lVar1 + -0x18);
  if (uVar4 < param_2) {
                    /* WARNING: Subroutine does not return */
    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
                 param_2,uVar4);
  }
  uVar5 = uVar4 - param_2;
  if (param_3 < uVar4 - param_2) {
    uVar5 = param_3;
  }
  sVar3 = wcslen(param_4);
  uVar4 = uVar5;
  if (sVar3 <= uVar5) {
    uVar4 = sVar3;
  }
  if (uVar4 != 0) {
    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);
    if (uVar2 != 0) {
      return (ulong)uVar2;
    }
  }
  uVar5 = uVar5 - sVar3;
  uVar4 = 0x7fffffff;
  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {
    uVar4 = uVar5 & 0xffffffff;
  }
  return uVar4;
}


PUSH R14
PUSH R13
PUSH R12
MOV R12,RSI
PUSH RBP
PUSH RBX
MOV R13,qword ptr [RDI]
MOV RBX,qword ptr [R13 + -0x18]
CMP RSI,RBX
JA 0x003b36b2
SUB RBX,RSI
MOV RDI,RCX
MOV R14,RCX
CMP RBX,RDX
CMOVA RBX,RDX
CALL 0x00150150
CMP RAX,RBX
MOV RDX,RBX
MOV RBP,RAX
CMOVBE RDX,RAX
TEST RDX,RDX
JNZ 0x003b3698
SUB RBX,RBP
MOV EAX,0x7fffffff
CMP RBX,0x7fffffff
JG 0x003b368c
CMP RBX,-0x80000000
LEA EAX,[RAX + 0x1]
CMOVGE EAX,EBX
POP RBX
POP RBP
POP R12
POP R13
POP R14
RET
LEA RDI,[R13 + R12*0x4]
MOV RSI,R14
CALL 0x00150260
TEST EAX,EAX
JZ 0x003b366e
POP RBX
POP RBP
POP R12
POP R13
POP R14
RET
MOV RDX,RSI
MOV RCX,RBX
LEA RSI,[0x3ff6dd]
XOR EAX,EAX
LEA RDI,[0x3e0c68]
CALL 0x00377400
(translation_unit "ulong FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)\n\n{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}\n\n" (function_definition "ulong FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)\n\n{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" type_identifier (function_declarator "FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)" identifier (parameter_list "(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)" ( (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 "wchar_t *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) ))) (compound_statement "{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "size_t sVar3;" primitive_type identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (declaration "ulong uVar5;" type_identifier identifier ;) (expression_statement "lVar1 = *param_1;" (assignment_expression "lVar1 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "uVar4 = *(ulong *)(lVar1 + -0x18);" (assignment_expression "uVar4 = *(ulong *)(lVar1 + -0x18)" identifier = (pointer_expression "*(ulong *)(lVar1 + -0x18)" * (cast_expression "(ulong *)(lVar1 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -0x18)" ( (binary_expression "lVar1 + -0x18" identifier + number_literal) ))))) ;) (if_statement "if (uVar4 < param_2) {\n                    /* WARNING: Subroutine does not return */\n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }" if (parenthesized_expression "(uVar4 < param_2)" ( (binary_expression "uVar4 < param_2" identifier < identifier) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }" { comment (expression_statement "FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);" (call_expression "FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4)" ( (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 "uVar5 = uVar4 - param_2;" (assignment_expression "uVar5 = uVar4 - param_2" identifier = (binary_expression "uVar4 - param_2" identifier - identifier)) ;) (if_statement "if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }" if (parenthesized_expression "(param_3 < uVar4 - param_2)" ( (binary_expression "param_3 < uVar4 - param_2" identifier < (binary_expression "uVar4 - param_2" identifier - identifier)) )) (compound_statement "{\n    uVar5 = param_3;\n  }" { (expression_statement "uVar5 = param_3;" (assignment_expression "uVar5 = param_3" identifier = identifier) ;) })) (expression_statement "sVar3 = wcslen(param_4);" (assignment_expression "sVar3 = wcslen(param_4)" identifier = (call_expression "wcslen(param_4)" identifier (argument_list "(param_4)" ( identifier )))) ;) (expression_statement "uVar4 = uVar5;" (assignment_expression "uVar4 = uVar5" identifier = identifier) ;) (if_statement "if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }" if (parenthesized_expression "(sVar3 <= uVar5)" ( (binary_expression "sVar3 <= uVar5" identifier <= identifier) )) (compound_statement "{\n    uVar4 = sVar3;\n  }" { (expression_statement "uVar4 = sVar3;" (assignment_expression "uVar4 = sVar3" identifier = identifier) ;) })) (if_statement "if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" if (parenthesized_expression "(uVar4 != 0)" ( (binary_expression "uVar4 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" { (expression_statement "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);" (assignment_expression "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" identifier = (call_expression "wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" identifier (argument_list "((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" ( (cast_expression "(wchar_t *)(lVar1 + param_2 * 4)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + param_2 * 4)" ( (binary_expression "lVar1 + param_2 * 4" identifier + (binary_expression "param_2 * 4" identifier * number_literal)) ))) , identifier , identifier )))) ;) (if_statement "if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }" if (parenthesized_expression "(uVar2 != 0)" ( (binary_expression "uVar2 != 0" identifier != number_literal) )) (compound_statement "{\n      return (ulong)uVar2;\n    }" { (return_statement "return (ulong)uVar2;" return (cast_expression "(ulong)uVar2" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar5 = uVar5 - sVar3;" (assignment_expression "uVar5 = uVar5 - sVar3" identifier = (binary_expression "uVar5 - sVar3" identifier - identifier)) ;) (expression_statement "uVar4 = 0x7fffffff;" (assignment_expression "uVar4 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5))" ( (binary_expression "((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" (parenthesized_expression "((long)uVar5 < 0x80000000)" ( (binary_expression "(long)uVar5 < 0x80000000" (cast_expression "(long)uVar5" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" ( (comma_expression "uVar4 = 0x80000000, -0x80000001 < (long)uVar5" (assignment_expression "uVar4 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar5" number_literal < (cast_expression "(long)uVar5" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar4 = uVar5 & 0xffffffff;\n  }" { (expression_statement "uVar4 = uVar5 & 0xffffffff;" (assignment_expression "uVar4 = uVar5 & 0xffffffff" identifier = (binary_expression "uVar5 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar4;" return identifier ;) })))
(translation_unit "/* std::wstring::compare(unsigned long, unsigned long, wchar_t const*) const */\n\nulong __thiscall std::wstring::compare(wstring *this,ulong param_1,ulong param_2,wchar_t *param_3)\n\n{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *(long *)this;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < 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,uVar4);\n  }\n  uVar5 = uVar4 - param_1;\n  if (param_2 < uVar4 - param_1) {\n    uVar5 = param_2;\n  }\n  sVar3 = wcslen(param_3);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}\n\n" comment (function_definition "ulong __thiscall std::wstring::compare(wstring *this,ulong param_1,ulong param_2,wchar_t *param_3)\n\n{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *(long *)this;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < 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,uVar4);\n  }\n  uVar5 = uVar4 - param_1;\n  if (param_2 < uVar4 - param_1) {\n    uVar5 = param_2;\n  }\n  sVar3 = wcslen(param_3);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" type_identifier (ms_call_modifier "__thiscall" __thiscall) (ERROR "std::wstring::" identifier : : identifier : :) (function_declarator "compare(wstring *this,ulong param_1,ulong param_2,wchar_t *param_3)" identifier (parameter_list "(wstring *this,ulong param_1,ulong param_2,wchar_t *param_3)" ( (parameter_declaration "wstring *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 "wchar_t *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) ))) (compound_statement "{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *(long *)this;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < 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,uVar4);\n  }\n  uVar5 = uVar4 - param_1;\n  if (param_2 < uVar4 - param_1) {\n    uVar5 = param_2;\n  }\n  sVar3 = wcslen(param_3);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "size_t sVar3;" primitive_type identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (declaration "ulong uVar5;" type_identifier identifier ;) (expression_statement "lVar1 = *(long *)this;" (assignment_expression "lVar1 = *(long *)this" identifier = (pointer_expression "*(long *)this" * (cast_expression "(long *)this" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier))) ;) (expression_statement "uVar4 = *(ulong *)(lVar1 + -0x18);" (assignment_expression "uVar4 = *(ulong *)(lVar1 + -0x18)" identifier = (pointer_expression "*(ulong *)(lVar1 + -0x18)" * (cast_expression "(ulong *)(lVar1 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -0x18)" ( (binary_expression "lVar1 + -0x18" identifier + number_literal) ))))) ;) (if_statement "if (uVar4 < 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,uVar4);\n  }" if (parenthesized_expression "(uVar4 < param_1)" ( (binary_expression "uVar4 < 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,uVar4);\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,uVar4);" (call_expression "__throw_out_of_range_fmt\n              ("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar4)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n               param_1,uVar4)" ( (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 "uVar5 = uVar4 - param_1;" (assignment_expression "uVar5 = uVar4 - param_1" identifier = (binary_expression "uVar4 - param_1" identifier - identifier)) ;) (if_statement "if (param_2 < uVar4 - param_1) {\n    uVar5 = param_2;\n  }" if (parenthesized_expression "(param_2 < uVar4 - param_1)" ( (binary_expression "param_2 < uVar4 - param_1" identifier < (binary_expression "uVar4 - param_1" identifier - identifier)) )) (compound_statement "{\n    uVar5 = param_2;\n  }" { (expression_statement "uVar5 = param_2;" (assignment_expression "uVar5 = param_2" identifier = identifier) ;) })) (expression_statement "sVar3 = wcslen(param_3);" (assignment_expression "sVar3 = wcslen(param_3)" identifier = (call_expression "wcslen(param_3)" identifier (argument_list "(param_3)" ( identifier )))) ;) (expression_statement "uVar4 = uVar5;" (assignment_expression "uVar4 = uVar5" identifier = identifier) ;) (if_statement "if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }" if (parenthesized_expression "(sVar3 <= uVar5)" ( (binary_expression "sVar3 <= uVar5" identifier <= identifier) )) (compound_statement "{\n    uVar4 = sVar3;\n  }" { (expression_statement "uVar4 = sVar3;" (assignment_expression "uVar4 = sVar3" identifier = identifier) ;) })) (if_statement "if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" if (parenthesized_expression "(uVar4 != 0)" ( (binary_expression "uVar4 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" { (expression_statement "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4);" (assignment_expression "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4)" identifier = (call_expression "wmemcmp((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4)" identifier (argument_list "((wchar_t *)(lVar1 + param_1 * 4),param_3,uVar4)" ( (cast_expression "(wchar_t *)(lVar1 + param_1 * 4)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + param_1 * 4)" ( (binary_expression "lVar1 + param_1 * 4" identifier + (binary_expression "param_1 * 4" identifier * number_literal)) ))) , identifier , identifier )))) ;) (if_statement "if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }" if (parenthesized_expression "(uVar2 != 0)" ( (binary_expression "uVar2 != 0" identifier != number_literal) )) (compound_statement "{\n      return (ulong)uVar2;\n    }" { (return_statement "return (ulong)uVar2;" return (cast_expression "(ulong)uVar2" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar5 = uVar5 - sVar3;" (assignment_expression "uVar5 = uVar5 - sVar3" identifier = (binary_expression "uVar5 - sVar3" identifier - identifier)) ;) (expression_statement "uVar4 = 0x7fffffff;" (assignment_expression "uVar4 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5))" ( (binary_expression "((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" (parenthesized_expression "((long)uVar5 < 0x80000000)" ( (binary_expression "(long)uVar5 < 0x80000000" (cast_expression "(long)uVar5" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" ( (comma_expression "uVar4 = 0x80000000, -0x80000001 < (long)uVar5" (assignment_expression "uVar4 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar5" number_literal < (cast_expression "(long)uVar5" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar4 = uVar5 & 0xffffffff;\n  }" { (expression_statement "uVar4 = uVar5 & 0xffffffff;" (assignment_expression "uVar4 = uVar5 & 0xffffffff" identifier = (binary_expression "uVar5 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar4;" return identifier ;) })))
(translation_unit "ulong FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)\n\n{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}\n\n" (function_definition "ulong FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)\n\n{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" type_identifier (function_declarator "FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)" identifier (parameter_list "(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)" ( (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 "wchar_t *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) ))) (compound_statement "{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "size_t sVar3;" primitive_type identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (declaration "ulong uVar5;" type_identifier identifier ;) (expression_statement "lVar1 = *param_1;" (assignment_expression "lVar1 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "uVar4 = *(ulong *)(lVar1 + -0x18);" (assignment_expression "uVar4 = *(ulong *)(lVar1 + -0x18)" identifier = (pointer_expression "*(ulong *)(lVar1 + -0x18)" * (cast_expression "(ulong *)(lVar1 + -0x18)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -0x18)" ( (binary_expression "lVar1 + -0x18" identifier + number_literal) ))))) ;) (if_statement "if (uVar4 < param_2) {\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }" if (parenthesized_expression "(uVar4 < param_2)" ( (binary_expression "uVar4 < param_2" identifier < identifier) )) (compound_statement "{\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }" { (expression_statement "FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);" (call_expression "FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4)" identifier (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4)" ( (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 "uVar5 = uVar4 - param_2;" (assignment_expression "uVar5 = uVar4 - param_2" identifier = (binary_expression "uVar4 - param_2" identifier - identifier)) ;) (if_statement "if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }" if (parenthesized_expression "(param_3 < uVar4 - param_2)" ( (binary_expression "param_3 < uVar4 - param_2" identifier < (binary_expression "uVar4 - param_2" identifier - identifier)) )) (compound_statement "{\n    uVar5 = param_3;\n  }" { (expression_statement "uVar5 = param_3;" (assignment_expression "uVar5 = param_3" identifier = identifier) ;) })) (expression_statement "sVar3 = wcslen(param_4);" (assignment_expression "sVar3 = wcslen(param_4)" identifier = (call_expression "wcslen(param_4)" identifier (argument_list "(param_4)" ( identifier )))) ;) (expression_statement "uVar4 = uVar5;" (assignment_expression "uVar4 = uVar5" identifier = identifier) ;) (if_statement "if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }" if (parenthesized_expression "(sVar3 <= uVar5)" ( (binary_expression "sVar3 <= uVar5" identifier <= identifier) )) (compound_statement "{\n    uVar4 = sVar3;\n  }" { (expression_statement "uVar4 = sVar3;" (assignment_expression "uVar4 = sVar3" identifier = identifier) ;) })) (if_statement "if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" if (parenthesized_expression "(uVar4 != 0)" ( (binary_expression "uVar4 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" { (expression_statement "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);" (assignment_expression "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" identifier = (call_expression "wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" identifier (argument_list "((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" ( (cast_expression "(wchar_t *)(lVar1 + param_2 * 4)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + param_2 * 4)" ( (binary_expression "lVar1 + param_2 * 4" identifier + (binary_expression "param_2 * 4" identifier * number_literal)) ))) , identifier , identifier )))) ;) (if_statement "if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }" if (parenthesized_expression "(uVar2 != 0)" ( (binary_expression "uVar2 != 0" identifier != number_literal) )) (compound_statement "{\n      return (ulong)uVar2;\n    }" { (return_statement "return (ulong)uVar2;" return (cast_expression "(ulong)uVar2" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar5 = uVar5 - sVar3;" (assignment_expression "uVar5 = uVar5 - sVar3" identifier = (binary_expression "uVar5 - sVar3" identifier - identifier)) ;) (expression_statement "uVar4 = 0x7fffffff;" (assignment_expression "uVar4 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5))" ( (binary_expression "((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" (parenthesized_expression "((long)uVar5 < 0x80000000)" ( (binary_expression "(long)uVar5 < 0x80000000" (cast_expression "(long)uVar5" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" ( (comma_expression "uVar4 = 0x80000000, -0x80000001 < (long)uVar5" (assignment_expression "uVar4 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar5" number_literal < (cast_expression "(long)uVar5" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar4 = uVar5 & 0xffffffff;\n  }" { (expression_statement "uVar4 = uVar5 & 0xffffffff;" (assignment_expression "uVar4 = uVar5 & 0xffffffff" identifier = (binary_expression "uVar5 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar4;" 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)) ))) (compound_statement { (declaration (sized_type_specifier long) IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_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 = (call_expression IDENT (argument_list ( 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 IDENT + (binary_expression IDENT * LIT)) ))) , 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_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)\n\n{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" (type_identifier "ulong") (function_declarator "FUN_003b3630(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)" (identifier "FUN_003b3630") (parameter_list "(long *param_1,ulong param_2,ulong param_3,wchar_t *param_4)" (( "(") (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 "wchar_t *param_4" (type_identifier "wchar_t") (pointer_declarator "*param_4" (* "*") (identifier "param_4"))) () ")"))) (compound_statement "{\n  long lVar1;\n  uint uVar2;\n  size_t sVar3;\n  ulong uVar4;\n  ulong uVar5;\n  \n  lVar1 = *param_1;\n  uVar4 = *(ulong *)(lVar1 + -0x18);\n  if (uVar4 < param_2) {\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }\n  uVar5 = uVar4 - param_2;\n  if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }\n  sVar3 = wcslen(param_4);\n  uVar4 = uVar5;\n  if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }\n  if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }\n  uVar5 = uVar5 - sVar3;\n  uVar4 = 0x7fffffff;\n  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }\n  return uVar4;\n}" ({ "{") (declaration "long lVar1;" (sized_type_specifier "long" (long "long")) (identifier "lVar1") (; ";")) (declaration "uint uVar2;" (type_identifier "uint") (identifier "uVar2") (; ";")) (declaration "size_t sVar3;" (primitive_type "size_t") (identifier "sVar3") (; ";")) (declaration "ulong uVar4;" (type_identifier "ulong") (identifier "uVar4") (; ";")) (declaration "ulong uVar5;" (type_identifier "ulong") (identifier "uVar5") (; ";")) (expression_statement "lVar1 = *param_1;" (assignment_expression "lVar1 = *param_1" (identifier "lVar1") (= "=") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) (; ";")) (expression_statement "uVar4 = *(ulong *)(lVar1 + -0x18);" (assignment_expression "uVar4 = *(ulong *)(lVar1 + -0x18)" (identifier "uVar4") (= "=") (pointer_expression "*(ulong *)(lVar1 + -0x18)" (* "*") (cast_expression "(ulong *)(lVar1 + -0x18)" (( "(") (type_descriptor "ulong *" (type_identifier "ulong") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar1 + -0x18)" (( "(") (binary_expression "lVar1 + -0x18" (identifier "lVar1") (+ "+") (number_literal "-0x18")) () ")"))))) (; ";")) (if_statement "if (uVar4 < param_2) {\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }" (if "if") (parenthesized_expression "(uVar4 < param_2)" (( "(") (binary_expression "uVar4 < param_2" (identifier "uVar4") (< "<") (identifier "param_2")) () ")")) (compound_statement "{\n                    \n    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);\n  }" ({ "{") (expression_statement "FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4);" (call_expression "FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4)" (identifier "FUN_00377400") (argument_list "("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",\n                 param_2,uVar4)" (( "(") (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 "uVar4") () ")"))) (; ";")) (} "}"))) (expression_statement "uVar5 = uVar4 - param_2;" (assignment_expression "uVar5 = uVar4 - param_2" (identifier "uVar5") (= "=") (binary_expression "uVar4 - param_2" (identifier "uVar4") (- "-") (identifier "param_2"))) (; ";")) (if_statement "if (param_3 < uVar4 - param_2) {\n    uVar5 = param_3;\n  }" (if "if") (parenthesized_expression "(param_3 < uVar4 - param_2)" (( "(") (binary_expression "param_3 < uVar4 - param_2" (identifier "param_3") (< "<") (binary_expression "uVar4 - param_2" (identifier "uVar4") (- "-") (identifier "param_2"))) () ")")) (compound_statement "{\n    uVar5 = param_3;\n  }" ({ "{") (expression_statement "uVar5 = param_3;" (assignment_expression "uVar5 = param_3" (identifier "uVar5") (= "=") (identifier "param_3")) (; ";")) (} "}"))) (expression_statement "sVar3 = wcslen(param_4);" (assignment_expression "sVar3 = wcslen(param_4)" (identifier "sVar3") (= "=") (call_expression "wcslen(param_4)" (identifier "wcslen") (argument_list "(param_4)" (( "(") (identifier "param_4") () ")")))) (; ";")) (expression_statement "uVar4 = uVar5;" (assignment_expression "uVar4 = uVar5" (identifier "uVar4") (= "=") (identifier "uVar5")) (; ";")) (if_statement "if (sVar3 <= uVar5) {\n    uVar4 = sVar3;\n  }" (if "if") (parenthesized_expression "(sVar3 <= uVar5)" (( "(") (binary_expression "sVar3 <= uVar5" (identifier "sVar3") (<= "<=") (identifier "uVar5")) () ")")) (compound_statement "{\n    uVar4 = sVar3;\n  }" ({ "{") (expression_statement "uVar4 = sVar3;" (assignment_expression "uVar4 = sVar3" (identifier "uVar4") (= "=") (identifier "sVar3")) (; ";")) (} "}"))) (if_statement "if (uVar4 != 0) {\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" (if "if") (parenthesized_expression "(uVar4 != 0)" (( "(") (binary_expression "uVar4 != 0" (identifier "uVar4") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);\n    if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }\n  }" ({ "{") (expression_statement "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);" (assignment_expression "uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" (identifier "uVar2") (= "=") (call_expression "wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" (identifier "wmemcmp") (argument_list "((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4)" (( "(") (cast_expression "(wchar_t *)(lVar1 + param_2 * 4)" (( "(") (type_descriptor "wchar_t *" (type_identifier "wchar_t") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar1 + param_2 * 4)" (( "(") (binary_expression "lVar1 + param_2 * 4" (identifier "lVar1") (+ "+") (binary_expression "param_2 * 4" (identifier "param_2") (* "*") (number_literal "4"))) () ")"))) (, ",") (identifier "param_4") (, ",") (identifier "uVar4") () ")")))) (; ";")) (if_statement "if (uVar2 != 0) {\n      return (ulong)uVar2;\n    }" (if "if") (parenthesized_expression "(uVar2 != 0)" (( "(") (binary_expression "uVar2 != 0" (identifier "uVar2") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      return (ulong)uVar2;\n    }" ({ "{") (return_statement "return (ulong)uVar2;" (return "return") (cast_expression "(ulong)uVar2" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (identifier "uVar2")) (; ";")) (} "}"))) (} "}"))) (expression_statement "uVar5 = uVar5 - sVar3;" (assignment_expression "uVar5 = uVar5 - sVar3" (identifier "uVar5") (= "=") (binary_expression "uVar5 - sVar3" (identifier "uVar5") (- "-") (identifier "sVar3"))) (; ";")) (expression_statement "uVar4 = 0x7fffffff;" (assignment_expression "uVar4 = 0x7fffffff" (identifier "uVar4") (= "=") (number_literal "0x7fffffff")) (; ";")) (if_statement "if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {\n    uVar4 = uVar5 & 0xffffffff;\n  }" (if "if") (parenthesized_expression "(((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5))" (( "(") (binary_expression "((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" (parenthesized_expression "((long)uVar5 < 0x80000000)" (( "(") (binary_expression "(long)uVar5 < 0x80000000" (cast_expression "(long)uVar5" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar5")) (< "<") (number_literal "0x80000000")) () ")")) (&& "&&") (parenthesized_expression "(uVar4 = 0x80000000, -0x80000001 < (long)uVar5)" (( "(") (comma_expression "uVar4 = 0x80000000, -0x80000001 < (long)uVar5" (assignment_expression "uVar4 = 0x80000000" (identifier "uVar4") (= "=") (number_literal "0x80000000")) (, ",") (binary_expression "-0x80000001 < (long)uVar5" (number_literal "-0x80000001") (< "<") (cast_expression "(long)uVar5" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar5")))) () ")"))) () ")")) (compound_statement "{\n    uVar4 = uVar5 & 0xffffffff;\n  }" ({ "{") (expression_statement "uVar4 = uVar5 & 0xffffffff;" (assignment_expression "uVar4 = uVar5 & 0xffffffff" (identifier "uVar4") (= "=") (binary_expression "uVar5 & 0xffffffff" (identifier "uVar5") (& "&") (number_literal "0xffffffff"))) (; ";")) (} "}"))) (return_statement "return uVar4;" (return "return") (identifier "uVar4") (; ";")) (} "}")))

/* std::wstring::compare(unsigned long, unsigned long, wchar_t const*) const */

type_1 __thiscall std::type_2::function_1(type_2 *this,type_1 var_3,type_1 var_5,type_3 *param_3)

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


(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: (type_identifier) declarator: (pointer_declarator declarator: (identifier))))) body: (compound_statement (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (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: (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: (call_expression function: (identifier) arguments: (argument_list (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: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) (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,wchar_t *param_4)

{
  long lVar1;
  uint uVar2;
  size_t sVar3;
  ulong uVar4;
  ulong uVar5;
  
  lVar1 = *param_1;
  uVar4 = *(ulong *)(lVar1 + -0x18);
  if (uVar4 < param_2) {
                    /* WARNING: Subroutine does not return */
    FUN_00377400("%s: __pos (which is %zu) > this->size() (which is %zu)","basic_string::compare",
                 param_2,uVar4);
  }
  uVar5 = uVar4 - param_2;
  if (param_3 < uVar4 - param_2) {
    uVar5 = param_3;
  }
  sVar3 = wcslen(param_4);
  uVar4 = uVar5;
  if (sVar3 <= uVar5) {
    uVar4 = sVar3;
  }
  if (uVar4 != 0) {
    uVar2 = wmemcmp((wchar_t *)(lVar1 + param_2 * 4),param_4,uVar4);
    if (uVar2 != 0) {
      return (ulong)uVar2;
    }
  }
  uVar5 = uVar5 - sVar3;
  uVar4 = 0x7fffffff;
  if (((long)uVar5 < 0x80000000) && (uVar4 = 0x80000000, -0x80000001 < (long)uVar5)) {
    uVar4 = uVar5 & 0xffffffff;
  }
  return uVar4;
}

