
/* std::wstring::compare(wchar_t const*) const */

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

{
  wchar_t *__s1;
  uint uVar1;
  size_t sVar2;
  ulong uVar3;
  ulong uVar4;
  
  __s1 = *(wchar_t **)this;
  sVar2 = wcslen(param_1);
  uVar4 = *(ulong *)(__s1 + -6);
  uVar3 = uVar4;
  if (sVar2 <= uVar4) {
    uVar3 = sVar2;
  }
  if (uVar3 != 0) {
    uVar1 = wmemcmp(__s1,param_1,uVar3);
    if (uVar1 != 0) {
      return (ulong)uVar1;
    }
  }
  uVar4 = uVar4 - sVar2;
  uVar3 = 0x7fffffff;
  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {
    uVar3 = uVar4 & 0xffffffff;
  }
  return uVar3;
}



ulong FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)

{
  wchar_t *__s1;
  uint uVar1;
  size_t sVar2;
  ulong uVar3;
  ulong uVar4;
  
  __s1 = (wchar_t *)*param_1;
  sVar2 = wcslen(param_2);
  uVar4 = *(ulong *)(__s1 + -6);
  uVar3 = uVar4;
  if (sVar2 <= uVar4) {
    uVar3 = sVar2;
  }
  if (uVar3 != 0) {
    uVar1 = wmemcmp(__s1,param_2,uVar3);
    if (uVar1 != 0) {
      return (ulong)uVar1;
    }
  }
  uVar4 = uVar4 - sVar2;
  uVar3 = 0x7fffffff;
  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {
    uVar3 = uVar4 & 0xffffffff;
  }
  return uVar3;
}


PUSH R13
MOV R13,RSI
PUSH R12
PUSH RBP
PUSH RBX
SUB RSP,0x8
MOV R12,qword ptr [RDI]
MOV RDI,RSI
CALL 0x00149150
MOV RBX,qword ptr [R12 + -0x18]
MOV RBP,RAX
CMP RAX,RBX
MOV RDX,RBX
CMOVBE RDX,RAX
TEST RDX,RDX
JZ 0x0036aafe
MOV RSI,R13
MOV RDI,R12
CALL 0x00149260
TEST EAX,EAX
JNZ 0x0036ab1c
SUB RBX,RBP
MOV EAX,0x7fffffff
CMP RBX,0x7fffffff
JG 0x0036ab1c
CMP RBX,-0x80000000
LEA EAX,[RAX + 0x1]
CMOVGE EAX,EBX
ADD RSP,0x8
POP RBX
POP RBP
POP R12
POP R13
RET
(translation_unit "ulong FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)\n\n{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}\n\n" (function_definition "ulong FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)\n\n{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" type_identifier (function_declarator "FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)" identifier (parameter_list "(undefined8 *param_1,wchar_t *param_2)" ( (parameter_declaration "undefined8 *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "wchar_t *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) ))) (compound_statement "{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" { (declaration "wchar_t *__s1;" type_identifier (pointer_declarator "*__s1" * identifier) ;) (declaration "uint uVar1;" type_identifier identifier ;) (declaration "size_t sVar2;" primitive_type identifier ;) (declaration "ulong uVar3;" type_identifier identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (expression_statement "__s1 = (wchar_t *)*param_1;" (assignment_expression "__s1 = (wchar_t *)*param_1" identifier = (cast_expression "(wchar_t *)*param_1" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier))) ;) (expression_statement "sVar2 = wcslen(param_2);" (assignment_expression "sVar2 = wcslen(param_2)" identifier = (call_expression "wcslen(param_2)" identifier (argument_list "(param_2)" ( identifier )))) ;) (expression_statement "uVar4 = *(ulong *)(__s1 + -6);" (assignment_expression "uVar4 = *(ulong *)(__s1 + -6)" identifier = (pointer_expression "*(ulong *)(__s1 + -6)" * (cast_expression "(ulong *)(__s1 + -6)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(__s1 + -6)" ( (binary_expression "__s1 + -6" identifier + number_literal) ))))) ;) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" identifier = identifier) ;) (if_statement "if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }" if (parenthesized_expression "(sVar2 <= uVar4)" ( (binary_expression "sVar2 <= uVar4" identifier <= identifier) )) (compound_statement "{\n    uVar3 = sVar2;\n  }" { (expression_statement "uVar3 = sVar2;" (assignment_expression "uVar3 = sVar2" identifier = identifier) ;) })) (if_statement "if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" if (parenthesized_expression "(uVar3 != 0)" ( (binary_expression "uVar3 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" { (expression_statement "uVar1 = wmemcmp(__s1,param_2,uVar3);" (assignment_expression "uVar1 = wmemcmp(__s1,param_2,uVar3)" identifier = (call_expression "wmemcmp(__s1,param_2,uVar3)" identifier (argument_list "(__s1,param_2,uVar3)" ( identifier , identifier , identifier )))) ;) (if_statement "if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }" if (parenthesized_expression "(uVar1 != 0)" ( (binary_expression "uVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      return (ulong)uVar1;\n    }" { (return_statement "return (ulong)uVar1;" return (cast_expression "(ulong)uVar1" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar4 = uVar4 - sVar2;" (assignment_expression "uVar4 = uVar4 - sVar2" identifier = (binary_expression "uVar4 - sVar2" identifier - identifier)) ;) (expression_statement "uVar3 = 0x7fffffff;" (assignment_expression "uVar3 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4))" ( (binary_expression "((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" ( (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" ( (comma_expression "uVar3 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar3 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar4" number_literal < (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar3 = uVar4 & 0xffffffff;\n  }" { (expression_statement "uVar3 = uVar4 & 0xffffffff;" (assignment_expression "uVar3 = uVar4 & 0xffffffff" identifier = (binary_expression "uVar4 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar3;" return identifier ;) })))
(translation_unit "/* std::wstring::compare(wchar_t const*) const */\n\nulong __thiscall std::wstring::compare(wstring *this,wchar_t *param_1)\n\n{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = *(wchar_t **)this;\n  sVar2 = wcslen(param_1);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_1,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}\n\n" comment (function_definition "ulong __thiscall std::wstring::compare(wstring *this,wchar_t *param_1)\n\n{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = *(wchar_t **)this;\n  sVar2 = wcslen(param_1);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_1,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" type_identifier (ms_call_modifier "__thiscall" __thiscall) (ERROR "std::wstring::" identifier : : identifier : :) (function_declarator "compare(wstring *this,wchar_t *param_1)" identifier (parameter_list "(wstring *this,wchar_t *param_1)" ( (parameter_declaration "wstring *this" type_identifier (pointer_declarator "*this" * identifier)) , (parameter_declaration "wchar_t *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) ))) (compound_statement "{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = *(wchar_t **)this;\n  sVar2 = wcslen(param_1);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_1,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" { (declaration "wchar_t *__s1;" type_identifier (pointer_declarator "*__s1" * identifier) ;) (declaration "uint uVar1;" type_identifier identifier ;) (declaration "size_t sVar2;" primitive_type identifier ;) (declaration "ulong uVar3;" type_identifier identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (expression_statement "__s1 = *(wchar_t **)this;" (assignment_expression "__s1 = *(wchar_t **)this" identifier = (pointer_expression "*(wchar_t **)this" * (cast_expression "(wchar_t **)this" ( (type_descriptor "wchar_t **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier))) ;) (expression_statement "sVar2 = wcslen(param_1);" (assignment_expression "sVar2 = wcslen(param_1)" identifier = (call_expression "wcslen(param_1)" identifier (argument_list "(param_1)" ( identifier )))) ;) (expression_statement "uVar4 = *(ulong *)(__s1 + -6);" (assignment_expression "uVar4 = *(ulong *)(__s1 + -6)" identifier = (pointer_expression "*(ulong *)(__s1 + -6)" * (cast_expression "(ulong *)(__s1 + -6)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(__s1 + -6)" ( (binary_expression "__s1 + -6" identifier + number_literal) ))))) ;) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" identifier = identifier) ;) (if_statement "if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }" if (parenthesized_expression "(sVar2 <= uVar4)" ( (binary_expression "sVar2 <= uVar4" identifier <= identifier) )) (compound_statement "{\n    uVar3 = sVar2;\n  }" { (expression_statement "uVar3 = sVar2;" (assignment_expression "uVar3 = sVar2" identifier = identifier) ;) })) (if_statement "if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_1,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" if (parenthesized_expression "(uVar3 != 0)" ( (binary_expression "uVar3 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar1 = wmemcmp(__s1,param_1,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" { (expression_statement "uVar1 = wmemcmp(__s1,param_1,uVar3);" (assignment_expression "uVar1 = wmemcmp(__s1,param_1,uVar3)" identifier = (call_expression "wmemcmp(__s1,param_1,uVar3)" identifier (argument_list "(__s1,param_1,uVar3)" ( identifier , identifier , identifier )))) ;) (if_statement "if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }" if (parenthesized_expression "(uVar1 != 0)" ( (binary_expression "uVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      return (ulong)uVar1;\n    }" { (return_statement "return (ulong)uVar1;" return (cast_expression "(ulong)uVar1" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar4 = uVar4 - sVar2;" (assignment_expression "uVar4 = uVar4 - sVar2" identifier = (binary_expression "uVar4 - sVar2" identifier - identifier)) ;) (expression_statement "uVar3 = 0x7fffffff;" (assignment_expression "uVar3 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4))" ( (binary_expression "((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" ( (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" ( (comma_expression "uVar3 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar3 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar4" number_literal < (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar3 = uVar4 & 0xffffffff;\n  }" { (expression_statement "uVar3 = uVar4 & 0xffffffff;" (assignment_expression "uVar3 = uVar4 & 0xffffffff" identifier = (binary_expression "uVar4 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar3;" return identifier ;) })))
(translation_unit "ulong FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)\n\n{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}\n\n" (function_definition "ulong FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)\n\n{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" type_identifier (function_declarator "FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)" identifier (parameter_list "(undefined8 *param_1,wchar_t *param_2)" ( (parameter_declaration "undefined8 *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "wchar_t *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) ))) (compound_statement "{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" { (declaration "wchar_t *__s1;" type_identifier (pointer_declarator "*__s1" * identifier) ;) (declaration "uint uVar1;" type_identifier identifier ;) (declaration "size_t sVar2;" primitive_type identifier ;) (declaration "ulong uVar3;" type_identifier identifier ;) (declaration "ulong uVar4;" type_identifier identifier ;) (expression_statement "__s1 = (wchar_t *)*param_1;" (assignment_expression "__s1 = (wchar_t *)*param_1" identifier = (cast_expression "(wchar_t *)*param_1" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier))) ;) (expression_statement "sVar2 = wcslen(param_2);" (assignment_expression "sVar2 = wcslen(param_2)" identifier = (call_expression "wcslen(param_2)" identifier (argument_list "(param_2)" ( identifier )))) ;) (expression_statement "uVar4 = *(ulong *)(__s1 + -6);" (assignment_expression "uVar4 = *(ulong *)(__s1 + -6)" identifier = (pointer_expression "*(ulong *)(__s1 + -6)" * (cast_expression "(ulong *)(__s1 + -6)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(__s1 + -6)" ( (binary_expression "__s1 + -6" identifier + number_literal) ))))) ;) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" identifier = identifier) ;) (if_statement "if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }" if (parenthesized_expression "(sVar2 <= uVar4)" ( (binary_expression "sVar2 <= uVar4" identifier <= identifier) )) (compound_statement "{\n    uVar3 = sVar2;\n  }" { (expression_statement "uVar3 = sVar2;" (assignment_expression "uVar3 = sVar2" identifier = identifier) ;) })) (if_statement "if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" if (parenthesized_expression "(uVar3 != 0)" ( (binary_expression "uVar3 != 0" identifier != number_literal) )) (compound_statement "{\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" { (expression_statement "uVar1 = wmemcmp(__s1,param_2,uVar3);" (assignment_expression "uVar1 = wmemcmp(__s1,param_2,uVar3)" identifier = (call_expression "wmemcmp(__s1,param_2,uVar3)" identifier (argument_list "(__s1,param_2,uVar3)" ( identifier , identifier , identifier )))) ;) (if_statement "if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }" if (parenthesized_expression "(uVar1 != 0)" ( (binary_expression "uVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      return (ulong)uVar1;\n    }" { (return_statement "return (ulong)uVar1;" return (cast_expression "(ulong)uVar1" ( (type_descriptor "ulong" type_identifier) ) identifier) ;) })) })) (expression_statement "uVar4 = uVar4 - sVar2;" (assignment_expression "uVar4 = uVar4 - sVar2" identifier = (binary_expression "uVar4 - sVar2" identifier - identifier)) ;) (expression_statement "uVar3 = 0x7fffffff;" (assignment_expression "uVar3 = 0x7fffffff" identifier = number_literal) ;) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }" if (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4))" ( (binary_expression "((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" ( (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) < number_literal) )) && (parenthesized_expression "(uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" ( (comma_expression "uVar3 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar3 = 0x80000000" identifier = number_literal) , (binary_expression "-0x80000001 < (long)uVar4" number_literal < (cast_expression "(long)uVar4" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier))) ))) )) (compound_statement "{\n    uVar3 = uVar4 & 0xffffffff;\n  }" { (expression_statement "uVar3 = uVar4 & 0xffffffff;" (assignment_expression "uVar3 = uVar4 & 0xffffffff" identifier = (binary_expression "uVar4 & 0xffffffff" identifier & number_literal)) ;) })) (return_statement "return uVar3;" return identifier ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) ))) (compound_statement { (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( IDENT )))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (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 ( 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_0036aac0(undefined8 *param_1,wchar_t *param_2)\n\n{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" (type_identifier "ulong") (function_declarator "FUN_0036aac0(undefined8 *param_1,wchar_t *param_2)" (identifier "FUN_0036aac0") (parameter_list "(undefined8 *param_1,wchar_t *param_2)" (( "(") (parameter_declaration "undefined8 *param_1" (type_identifier "undefined8") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "wchar_t *param_2" (type_identifier "wchar_t") (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) () ")"))) (compound_statement "{\n  wchar_t *__s1;\n  uint uVar1;\n  size_t sVar2;\n  ulong uVar3;\n  ulong uVar4;\n  \n  __s1 = (wchar_t *)*param_1;\n  sVar2 = wcslen(param_2);\n  uVar4 = *(ulong *)(__s1 + -6);\n  uVar3 = uVar4;\n  if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }\n  if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }\n  uVar4 = uVar4 - sVar2;\n  uVar3 = 0x7fffffff;\n  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }\n  return uVar3;\n}" ({ "{") (declaration "wchar_t *__s1;" (type_identifier "wchar_t") (pointer_declarator "*__s1" (* "*") (identifier "__s1")) (; ";")) (declaration "uint uVar1;" (type_identifier "uint") (identifier "uVar1") (; ";")) (declaration "size_t sVar2;" (primitive_type "size_t") (identifier "sVar2") (; ";")) (declaration "ulong uVar3;" (type_identifier "ulong") (identifier "uVar3") (; ";")) (declaration "ulong uVar4;" (type_identifier "ulong") (identifier "uVar4") (; ";")) (expression_statement "__s1 = (wchar_t *)*param_1;" (assignment_expression "__s1 = (wchar_t *)*param_1" (identifier "__s1") (= "=") (cast_expression "(wchar_t *)*param_1" (( "(") (type_descriptor "wchar_t *" (type_identifier "wchar_t") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_1" (* "*") (identifier "param_1")))) (; ";")) (expression_statement "sVar2 = wcslen(param_2);" (assignment_expression "sVar2 = wcslen(param_2)" (identifier "sVar2") (= "=") (call_expression "wcslen(param_2)" (identifier "wcslen") (argument_list "(param_2)" (( "(") (identifier "param_2") () ")")))) (; ";")) (expression_statement "uVar4 = *(ulong *)(__s1 + -6);" (assignment_expression "uVar4 = *(ulong *)(__s1 + -6)" (identifier "uVar4") (= "=") (pointer_expression "*(ulong *)(__s1 + -6)" (* "*") (cast_expression "(ulong *)(__s1 + -6)" (( "(") (type_descriptor "ulong *" (type_identifier "ulong") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(__s1 + -6)" (( "(") (binary_expression "__s1 + -6" (identifier "__s1") (+ "+") (number_literal "-6")) () ")"))))) (; ";")) (expression_statement "uVar3 = uVar4;" (assignment_expression "uVar3 = uVar4" (identifier "uVar3") (= "=") (identifier "uVar4")) (; ";")) (if_statement "if (sVar2 <= uVar4) {\n    uVar3 = sVar2;\n  }" (if "if") (parenthesized_expression "(sVar2 <= uVar4)" (( "(") (binary_expression "sVar2 <= uVar4" (identifier "sVar2") (<= "<=") (identifier "uVar4")) () ")")) (compound_statement "{\n    uVar3 = sVar2;\n  }" ({ "{") (expression_statement "uVar3 = sVar2;" (assignment_expression "uVar3 = sVar2" (identifier "uVar3") (= "=") (identifier "sVar2")) (; ";")) (} "}"))) (if_statement "if (uVar3 != 0) {\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" (if "if") (parenthesized_expression "(uVar3 != 0)" (( "(") (binary_expression "uVar3 != 0" (identifier "uVar3") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    uVar1 = wmemcmp(__s1,param_2,uVar3);\n    if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }\n  }" ({ "{") (expression_statement "uVar1 = wmemcmp(__s1,param_2,uVar3);" (assignment_expression "uVar1 = wmemcmp(__s1,param_2,uVar3)" (identifier "uVar1") (= "=") (call_expression "wmemcmp(__s1,param_2,uVar3)" (identifier "wmemcmp") (argument_list "(__s1,param_2,uVar3)" (( "(") (identifier "__s1") (, ",") (identifier "param_2") (, ",") (identifier "uVar3") () ")")))) (; ";")) (if_statement "if (uVar1 != 0) {\n      return (ulong)uVar1;\n    }" (if "if") (parenthesized_expression "(uVar1 != 0)" (( "(") (binary_expression "uVar1 != 0" (identifier "uVar1") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      return (ulong)uVar1;\n    }" ({ "{") (return_statement "return (ulong)uVar1;" (return "return") (cast_expression "(ulong)uVar1" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (identifier "uVar1")) (; ";")) (} "}"))) (} "}"))) (expression_statement "uVar4 = uVar4 - sVar2;" (assignment_expression "uVar4 = uVar4 - sVar2" (identifier "uVar4") (= "=") (binary_expression "uVar4 - sVar2" (identifier "uVar4") (- "-") (identifier "sVar2"))) (; ";")) (expression_statement "uVar3 = 0x7fffffff;" (assignment_expression "uVar3 = 0x7fffffff" (identifier "uVar3") (= "=") (number_literal "0x7fffffff")) (; ";")) (if_statement "if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {\n    uVar3 = uVar4 & 0xffffffff;\n  }" (if "if") (parenthesized_expression "(((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4))" (( "(") (binary_expression "((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" (parenthesized_expression "((long)uVar4 < 0x80000000)" (( "(") (binary_expression "(long)uVar4 < 0x80000000" (cast_expression "(long)uVar4" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar4")) (< "<") (number_literal "0x80000000")) () ")")) (&& "&&") (parenthesized_expression "(uVar3 = 0x80000000, -0x80000001 < (long)uVar4)" (( "(") (comma_expression "uVar3 = 0x80000000, -0x80000001 < (long)uVar4" (assignment_expression "uVar3 = 0x80000000" (identifier "uVar3") (= "=") (number_literal "0x80000000")) (, ",") (binary_expression "-0x80000001 < (long)uVar4" (number_literal "-0x80000001") (< "<") (cast_expression "(long)uVar4" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar4")))) () ")"))) () ")")) (compound_statement "{\n    uVar3 = uVar4 & 0xffffffff;\n  }" ({ "{") (expression_statement "uVar3 = uVar4 & 0xffffffff;" (assignment_expression "uVar3 = uVar4 & 0xffffffff" (identifier "uVar3") (= "=") (binary_expression "uVar4 & 0xffffffff" (identifier "uVar4") (& "&") (number_literal "0xffffffff"))) (; ";")) (} "}"))) (return_statement "return uVar3;" (return "return") (identifier "uVar3") (; ";")) (} "}")))

/* std::wstring::compare(wchar_t const*) const */

type_1 __thiscall std::type_2::function_1(type_2 *this,type_3 *param_1)

{
  type_3 *var_2;
  type_4 var_7;
  size_t var_3;
  type_1 var_5;
  type_1 var_4;
  
  var_2 = *(type_3 **)this;
  var_3 = var_1(param_1);
  var_4 = *(type_1 *)(var_2 + -6);
  var_5 = var_4;
  if (var_3 <= var_4) {
    var_5 = var_3;
  }
  if (var_5 != 0) {
    var_7 = var_6(var_2,param_1,var_5);
    if (var_7 != 0) {
      return (type_1)var_7;
    }
  }
  var_4 = var_4 - var_3;
  var_5 = 0x7fffffff;
  if (((long)var_4 < 0x80000000) && (var_5 = 0x80000000, -0x80000001 < (long)var_4)) {
    var_5 = var_4 & 0xffffffff;
  }
  return var_5;
}


(translation_unit (function_definition type: (type_identifier) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))))) body: (compound_statement (declaration type: (type_identifier) declarator: (pointer_declarator 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: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list (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))))))) (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 (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(undefined8 *param_1,wchar_t *param_2)

{
  wchar_t *__s1;
  uint uVar1;
  size_t sVar2;
  ulong uVar3;
  ulong uVar4;
  
  __s1 = (wchar_t *)*param_1;
  sVar2 = wcslen(param_2);
  uVar4 = *(ulong *)(__s1 + -6);
  uVar3 = uVar4;
  if (sVar2 <= uVar4) {
    uVar3 = sVar2;
  }
  if (uVar3 != 0) {
    uVar1 = wmemcmp(__s1,param_2,uVar3);
    if (uVar1 != 0) {
      return (ulong)uVar1;
    }
  }
  uVar4 = uVar4 - sVar2;
  uVar3 = 0x7fffffff;
  if (((long)uVar4 < 0x80000000) && (uVar3 = 0x80000000, -0x80000001 < (long)uVar4)) {
    uVar3 = uVar4 & 0xffffffff;
  }
  return uVar3;
}

