
/* std::(anonymous namespace)::ucs4_out(std::(anonymous namespace)::range<char32_t const, true>&,
   std::(anonymous namespace)::range<char16_t, false>&, unsigned long, std::codecvt_mode) [clone
   .part.23] */

undefined8
std::(anonymous_namespace)::ucs4_out(long *param_1,long *param_2,ulong param_3,uint param_4)

{
  uint uVar1;
  ushort *puVar2;
  ushort uVar3;
  ushort uVar4;
  ushort uVar5;
  long lVar6;
  
  if ((uint *)param_1[1] == (uint *)*param_1) {
    return 0;
  }
  uVar1 = *(uint *)*param_1;
  do {
    if (param_3 < uVar1) {
      return 2;
    }
    puVar2 = (ushort *)*param_2;
    uVar4 = (ushort)uVar1;
    if (uVar1 < 0x10000) {
      if ((ulong)(param_2[1] - (long)puVar2) < 2) {
        return 1;
      }
      if ((param_4 & 1) == 0) {
        uVar4 = uVar4 << 8 | uVar4 >> 8;
      }
      *puVar2 = uVar4;
      lVar6 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = lVar6 + 4;
      if (param_1[1] == lVar6 + 4) {
        return 0;
      }
    }
    else {
      if ((ulong)(param_2[1] - (long)puVar2) < 4) {
        return 1;
      }
      uVar3 = (uVar4 & 0x3ff) + 0xdc00;
      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;
      if ((param_4 & 1) == 0) {
        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;
        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;
        lVar6 = *param_2;
        *param_2 = lVar6 + 2;
      }
      else {
        *puVar2 = uVar5;
        lVar6 = *param_2;
        *param_2 = lVar6 + 2;
      }
      *(ushort *)(lVar6 + 2) = uVar3;
      lVar6 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = lVar6 + 4;
      if (param_1[1] == lVar6 + 4) {
        return 0;
      }
    }
    uVar1 = *(uint *)(lVar6 + 4);
  } while( true );
}



undefined8 FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)

{
  uint uVar1;
  ushort *puVar2;
  ushort uVar3;
  ushort uVar4;
  ushort uVar5;
  long lVar6;
  
  if ((uint *)param_1[1] == (uint *)*param_1) {
    return 0;
  }
  uVar1 = *(uint *)*param_1;
  do {
    if (param_3 < uVar1) {
      return 2;
    }
    puVar2 = (ushort *)*param_2;
    uVar4 = (ushort)uVar1;
    if (uVar1 < 0x10000) {
      if ((ulong)(param_2[1] - (long)puVar2) < 2) {
        return 1;
      }
      if ((param_4 & 1) == 0) {
        uVar4 = uVar4 << 8 | uVar4 >> 8;
      }
      *puVar2 = uVar4;
      lVar6 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = lVar6 + 4;
      if (param_1[1] == lVar6 + 4) {
        return 0;
      }
    }
    else {
      if ((ulong)(param_2[1] - (long)puVar2) < 4) {
        return 1;
      }
      uVar3 = (uVar4 & 0x3ff) + 0xdc00;
      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;
      if ((param_4 & 1) == 0) {
        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;
        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;
        lVar6 = *param_2;
        *param_2 = lVar6 + 2;
      }
      else {
        *puVar2 = uVar5;
        lVar6 = *param_2;
        *param_2 = lVar6 + 2;
      }
      *(ushort *)(lVar6 + 2) = uVar3;
      lVar6 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = lVar6 + 4;
      if (param_1[1] == lVar6 + 4) {
        return 0;
      }
    }
    uVar1 = *(uint *)(lVar6 + 4);
  } while( true );
}


MOV RAX,qword ptr [RDI]
CMP qword ptr [RDI + 0x8],RAX
JZ 0x003b7dde
MOV R8D,dword ptr [RAX]
AND ECX,0x1
MOV RAX,R8
CMP RDX,R8
JC 0x003b7dab
NOP
MOV R9,qword ptr [RSI]
MOV R8,qword ptr [RSI + 0x8]
SUB R8,R9
CMP EAX,0xffff
JA 0x003b7d50
CMP R8,0x1
JA 0x003b7db8
MOV EAX,0x1
RET
CMP R8,0x3
JBE 0x003b7d47
MOV R8D,EAX
AND AX,0x3ff
SHR R8D,0xa
SUB AX,0x2400
SUB R8W,0x2840
TEST ECX,ECX
JNZ 0x003b7de8
ROL R8W,0x8
ROL AX,0x8
MOV word ptr [R9],R8W
MOV R8,qword ptr [RSI]
LEA R9,[R8 + 0x2]
MOV qword ptr [RSI],R9
MOV word ptr [R8 + 0x2],AX
MOV R8,qword ptr [RDI]
ADD qword ptr [RSI],0x2
LEA RAX,[R8 + 0x4]
MOV qword ptr [RDI],RAX
CMP qword ptr [RDI + 0x8],RAX
JZ 0x003b7dde
MOV R8D,dword ptr [R8 + 0x4]
MOV RAX,R8
CMP R8,RDX
JBE 0x003b7d30
MOV EAX,0x2
RET
MOV R8D,EAX
ROL R8W,0x8
TEST ECX,ECX
CMOVZ EAX,R8D
MOV word ptr [R9],AX
MOV R8,qword ptr [RDI]
ADD qword ptr [RSI],0x2
LEA RAX,[R8 + 0x4]
MOV qword ptr [RDI],RAX
CMP qword ptr [RDI + 0x8],RAX
JNZ 0x003b7d9f
XOR EAX,EAX
RET
MOV word ptr [R9],R8W
MOV R8,qword ptr [RSI]
LEA R9,[R8 + 0x2]
MOV qword ptr [RSI],R9
JMP 0x003b7d86
(translation_unit "undefined8 FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)\n\n{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}\n\n" (function_definition "undefined8 FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)\n\n{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" type_identifier (function_declarator "FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)" identifier (parameter_list "(long *param_1,long *param_2,ulong param_3,uint param_4)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "long *param_2" (sized_type_specifier "long" long) (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "ulong param_3" type_identifier identifier) , (parameter_declaration "uint param_4" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ushort *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "ushort uVar3;" type_identifier identifier ;) (declaration "ushort uVar4;" type_identifier identifier ;) (declaration "ushort uVar5;" type_identifier identifier ;) (declaration "long lVar6;" (sized_type_specifier "long" long) identifier ;) (if_statement "if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }" if (parenthesized_expression "((uint *)param_1[1] == (uint *)*param_1)" ( (binary_expression "(uint *)param_1[1] == (uint *)*param_1" (cast_expression "(uint *)param_1[1]" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "param_1[1]" identifier [ number_literal ])) == (cast_expression "(uint *)*param_1" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier))) )) (compound_statement "{\n    return 0;\n  }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "uVar1 = *(uint *)*param_1;" (assignment_expression "uVar1 = *(uint *)*param_1" identifier = (pointer_expression "*(uint *)*param_1" * (cast_expression "(uint *)*param_1" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier)))) ;) (do_statement "do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );" do (compound_statement "{\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  }" { (if_statement "if (param_3 < uVar1) {\n      return 2;\n    }" if (parenthesized_expression "(param_3 < uVar1)" ( (binary_expression "param_3 < uVar1" identifier < identifier) )) (compound_statement "{\n      return 2;\n    }" { (return_statement "return 2;" return number_literal ;) })) (expression_statement "puVar2 = (ushort *)*param_2;" (assignment_expression "puVar2 = (ushort *)*param_2" identifier = (cast_expression "(ushort *)*param_2" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) ;) (expression_statement "uVar4 = (ushort)uVar1;" (assignment_expression "uVar4 = (ushort)uVar1" identifier = (cast_expression "(ushort)uVar1" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) (if_statement "if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" if (parenthesized_expression "(uVar1 < 0x10000)" ( (binary_expression "uVar1 < 0x10000" identifier < number_literal) )) (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" { (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }" if (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 2)" ( (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 2" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(param_2[1] - (long)puVar2)" ( (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" identifier [ number_literal ]) - (cast_expression "(long)puVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ))) < number_literal) )) (compound_statement "{\n        return 1;\n      }" { (return_statement "return 1;" return number_literal ;) })) (if_statement "if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" if (parenthesized_expression "((param_4 & 1) == 0)" ( (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" ( (binary_expression "param_4 & 1" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" { (expression_statement "uVar4 = uVar4 << 8 | uVar4 >> 8;" (assignment_expression "uVar4 = uVar4 << 8 | uVar4 >> 8" identifier = (binary_expression "uVar4 << 8 | uVar4 >> 8" (binary_expression "uVar4 << 8" identifier << number_literal) | (binary_expression "uVar4 >> 8" identifier >> number_literal))) ;) })) (expression_statement "*puVar2 = uVar4;" (assignment_expression "*puVar2 = uVar4" (pointer_expression "*puVar2" * identifier) = identifier) ;) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "*param_2 + 2" (pointer_expression "*param_2" * identifier) + number_literal)) ;) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar6 + 4" identifier + number_literal)) ;) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" if (parenthesized_expression "(param_1[1] == lVar6 + 4)" ( (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" identifier [ number_literal ]) == (binary_expression "lVar6 + 4" identifier + number_literal)) )) (compound_statement "{\n        return 0;\n      }" { (return_statement "return 0;" return number_literal ;) })) }) (else_clause "else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" else (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" { (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }" if (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 4)" ( (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 4" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(param_2[1] - (long)puVar2)" ( (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" identifier [ number_literal ]) - (cast_expression "(long)puVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ))) < number_literal) )) (compound_statement "{\n        return 1;\n      }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "uVar3 = (uVar4 & 0x3ff) + 0xdc00;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) + 0xdc00" identifier = (binary_expression "(uVar4 & 0x3ff) + 0xdc00" (parenthesized_expression "(uVar4 & 0x3ff)" ( (binary_expression "uVar4 & 0x3ff" identifier & number_literal) )) + number_literal)) ;) (expression_statement "uVar5 = (short)(uVar1 >> 10) + 0xd7c0;" (assignment_expression "uVar5 = (short)(uVar1 >> 10) + 0xd7c0" identifier = (binary_expression "(short)(uVar1 >> 10) + 0xd7c0" (cast_expression "(short)(uVar1 >> 10)" ( (type_descriptor "short" (sized_type_specifier "short" short)) ) (parenthesized_expression "(uVar1 >> 10)" ( (binary_expression "uVar1 >> 10" identifier >> number_literal) ))) + number_literal)) ;) (if_statement "if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" if (parenthesized_expression "((param_4 & 1) == 0)" ( (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" ( (binary_expression "param_4 & 1" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" { (expression_statement "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8" identifier = (binary_expression "(uVar4 & 0x3ff) << 8 | uVar3 >> 8" (binary_expression "(uVar4 & 0x3ff) << 8" (parenthesized_expression "(uVar4 & 0x3ff)" ( (binary_expression "uVar4 & 0x3ff" identifier & number_literal) )) << number_literal) | (binary_expression "uVar3 >> 8" identifier >> number_literal))) ;) (expression_statement "*puVar2 = uVar5 * 0x100 | uVar5 >> 8;" (assignment_expression "*puVar2 = uVar5 * 0x100 | uVar5 >> 8" (pointer_expression "*puVar2" * identifier) = (binary_expression "uVar5 * 0x100 | uVar5 >> 8" (binary_expression "uVar5 * 0x100" identifier * number_literal) | (binary_expression "uVar5 >> 8" identifier >> number_literal))) ;) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "lVar6 + 2" identifier + number_literal)) ;) }) (else_clause "else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" else (compound_statement "{\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" { (expression_statement "*puVar2 = uVar5;" (assignment_expression "*puVar2 = uVar5" (pointer_expression "*puVar2" * identifier) = identifier) ;) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "lVar6 + 2" identifier + number_literal)) ;) }))) (expression_statement "*(ushort *)(lVar6 + 2) = uVar3;" (assignment_expression "*(ushort *)(lVar6 + 2) = uVar3" (pointer_expression "*(ushort *)(lVar6 + 2)" * (cast_expression "(ushort *)(lVar6 + 2)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 2)" ( (binary_expression "lVar6 + 2" identifier + number_literal) )))) = identifier) ;) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "*param_2 + 2" (pointer_expression "*param_2" * identifier) + number_literal)) ;) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar6 + 4" identifier + number_literal)) ;) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" if (parenthesized_expression "(param_1[1] == lVar6 + 4)" ( (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" identifier [ number_literal ]) == (binary_expression "lVar6 + 4" identifier + number_literal)) )) (compound_statement "{\n        return 0;\n      }" { (return_statement "return 0;" return number_literal ;) })) }))) (expression_statement "uVar1 = *(uint *)(lVar6 + 4);" (assignment_expression "uVar1 = *(uint *)(lVar6 + 4)" identifier = (pointer_expression "*(uint *)(lVar6 + 4)" * (cast_expression "(uint *)(lVar6 + 4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 4)" ( (binary_expression "lVar6 + 4" identifier + number_literal) ))))) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit "/* std::(anonymous namespace)::ucs4_out(std::(anonymous namespace)::range<char32_t const, true>&,\n   std::(anonymous namespace)::range<char16_t, false>&, unsigned long, std::codecvt_mode) [clone\n   .part.23] */\n\nundefined8\nstd::(anonymous_namespace)::ucs4_out(long *param_1,long *param_2,ulong param_3,uint param_4)\n\n{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}\n\n" comment (function_definition "undefined8\nstd::(anonymous_namespace)::ucs4_out(long *param_1,long *param_2,ulong param_3,uint param_4)\n\n{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" type_identifier (ERROR "std::(anonymous_namespace)::" identifier : : ( identifier ) : :) (function_declarator "ucs4_out(long *param_1,long *param_2,ulong param_3,uint param_4)" identifier (parameter_list "(long *param_1,long *param_2,ulong param_3,uint param_4)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "long *param_2" (sized_type_specifier "long" long) (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "ulong param_3" type_identifier identifier) , (parameter_declaration "uint param_4" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ushort *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "ushort uVar3;" type_identifier identifier ;) (declaration "ushort uVar4;" type_identifier identifier ;) (declaration "ushort uVar5;" type_identifier identifier ;) (declaration "long lVar6;" (sized_type_specifier "long" long) identifier ;) (if_statement "if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }" if (parenthesized_expression "((uint *)param_1[1] == (uint *)*param_1)" ( (binary_expression "(uint *)param_1[1] == (uint *)*param_1" (cast_expression "(uint *)param_1[1]" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "param_1[1]" identifier [ number_literal ])) == (cast_expression "(uint *)*param_1" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier))) )) (compound_statement "{\n    return 0;\n  }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "uVar1 = *(uint *)*param_1;" (assignment_expression "uVar1 = *(uint *)*param_1" identifier = (pointer_expression "*(uint *)*param_1" * (cast_expression "(uint *)*param_1" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier)))) ;) (do_statement "do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );" do (compound_statement "{\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  }" { (if_statement "if (param_3 < uVar1) {\n      return 2;\n    }" if (parenthesized_expression "(param_3 < uVar1)" ( (binary_expression "param_3 < uVar1" identifier < identifier) )) (compound_statement "{\n      return 2;\n    }" { (return_statement "return 2;" return number_literal ;) })) (expression_statement "puVar2 = (ushort *)*param_2;" (assignment_expression "puVar2 = (ushort *)*param_2" identifier = (cast_expression "(ushort *)*param_2" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) ;) (expression_statement "uVar4 = (ushort)uVar1;" (assignment_expression "uVar4 = (ushort)uVar1" identifier = (cast_expression "(ushort)uVar1" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) (if_statement "if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" if (parenthesized_expression "(uVar1 < 0x10000)" ( (binary_expression "uVar1 < 0x10000" identifier < number_literal) )) (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" { (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }" if (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 2)" ( (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 2" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(param_2[1] - (long)puVar2)" ( (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" identifier [ number_literal ]) - (cast_expression "(long)puVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ))) < number_literal) )) (compound_statement "{\n        return 1;\n      }" { (return_statement "return 1;" return number_literal ;) })) (if_statement "if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" if (parenthesized_expression "((param_4 & 1) == 0)" ( (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" ( (binary_expression "param_4 & 1" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" { (expression_statement "uVar4 = uVar4 << 8 | uVar4 >> 8;" (assignment_expression "uVar4 = uVar4 << 8 | uVar4 >> 8" identifier = (binary_expression "uVar4 << 8 | uVar4 >> 8" (binary_expression "uVar4 << 8" identifier << number_literal) | (binary_expression "uVar4 >> 8" identifier >> number_literal))) ;) })) (expression_statement "*puVar2 = uVar4;" (assignment_expression "*puVar2 = uVar4" (pointer_expression "*puVar2" * identifier) = identifier) ;) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "*param_2 + 2" (pointer_expression "*param_2" * identifier) + number_literal)) ;) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar6 + 4" identifier + number_literal)) ;) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" if (parenthesized_expression "(param_1[1] == lVar6 + 4)" ( (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" identifier [ number_literal ]) == (binary_expression "lVar6 + 4" identifier + number_literal)) )) (compound_statement "{\n        return 0;\n      }" { (return_statement "return 0;" return number_literal ;) })) }) (else_clause "else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" else (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" { (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }" if (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 4)" ( (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 4" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(param_2[1] - (long)puVar2)" ( (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" identifier [ number_literal ]) - (cast_expression "(long)puVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ))) < number_literal) )) (compound_statement "{\n        return 1;\n      }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "uVar3 = (uVar4 & 0x3ff) + 0xdc00;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) + 0xdc00" identifier = (binary_expression "(uVar4 & 0x3ff) + 0xdc00" (parenthesized_expression "(uVar4 & 0x3ff)" ( (binary_expression "uVar4 & 0x3ff" identifier & number_literal) )) + number_literal)) ;) (expression_statement "uVar5 = (short)(uVar1 >> 10) + 0xd7c0;" (assignment_expression "uVar5 = (short)(uVar1 >> 10) + 0xd7c0" identifier = (binary_expression "(short)(uVar1 >> 10) + 0xd7c0" (cast_expression "(short)(uVar1 >> 10)" ( (type_descriptor "short" (sized_type_specifier "short" short)) ) (parenthesized_expression "(uVar1 >> 10)" ( (binary_expression "uVar1 >> 10" identifier >> number_literal) ))) + number_literal)) ;) (if_statement "if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" if (parenthesized_expression "((param_4 & 1) == 0)" ( (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" ( (binary_expression "param_4 & 1" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" { (expression_statement "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8" identifier = (binary_expression "(uVar4 & 0x3ff) << 8 | uVar3 >> 8" (binary_expression "(uVar4 & 0x3ff) << 8" (parenthesized_expression "(uVar4 & 0x3ff)" ( (binary_expression "uVar4 & 0x3ff" identifier & number_literal) )) << number_literal) | (binary_expression "uVar3 >> 8" identifier >> number_literal))) ;) (expression_statement "*puVar2 = uVar5 * 0x100 | uVar5 >> 8;" (assignment_expression "*puVar2 = uVar5 * 0x100 | uVar5 >> 8" (pointer_expression "*puVar2" * identifier) = (binary_expression "uVar5 * 0x100 | uVar5 >> 8" (binary_expression "uVar5 * 0x100" identifier * number_literal) | (binary_expression "uVar5 >> 8" identifier >> number_literal))) ;) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "lVar6 + 2" identifier + number_literal)) ;) }) (else_clause "else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" else (compound_statement "{\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" { (expression_statement "*puVar2 = uVar5;" (assignment_expression "*puVar2 = uVar5" (pointer_expression "*puVar2" * identifier) = identifier) ;) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "lVar6 + 2" identifier + number_literal)) ;) }))) (expression_statement "*(ushort *)(lVar6 + 2) = uVar3;" (assignment_expression "*(ushort *)(lVar6 + 2) = uVar3" (pointer_expression "*(ushort *)(lVar6 + 2)" * (cast_expression "(ushort *)(lVar6 + 2)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 2)" ( (binary_expression "lVar6 + 2" identifier + number_literal) )))) = identifier) ;) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "*param_2 + 2" (pointer_expression "*param_2" * identifier) + number_literal)) ;) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar6 + 4" identifier + number_literal)) ;) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" if (parenthesized_expression "(param_1[1] == lVar6 + 4)" ( (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" identifier [ number_literal ]) == (binary_expression "lVar6 + 4" identifier + number_literal)) )) (compound_statement "{\n        return 0;\n      }" { (return_statement "return 0;" return number_literal ;) })) }))) (expression_statement "uVar1 = *(uint *)(lVar6 + 4);" (assignment_expression "uVar1 = *(uint *)(lVar6 + 4)" identifier = (pointer_expression "*(uint *)(lVar6 + 4)" * (cast_expression "(uint *)(lVar6 + 4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 4)" ( (binary_expression "lVar6 + 4" identifier + number_literal) ))))) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit "undefined8 FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)\n\n{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}\n\n" (function_definition "undefined8 FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)\n\n{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" type_identifier (function_declarator "FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)" identifier (parameter_list "(long *param_1,long *param_2,ulong param_3,uint param_4)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "long *param_2" (sized_type_specifier "long" long) (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "ulong param_3" type_identifier identifier) , (parameter_declaration "uint param_4" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "ushort *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "ushort uVar3;" type_identifier identifier ;) (declaration "ushort uVar4;" type_identifier identifier ;) (declaration "ushort uVar5;" type_identifier identifier ;) (declaration "long lVar6;" (sized_type_specifier "long" long) identifier ;) (if_statement "if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }" if (parenthesized_expression "((uint *)param_1[1] == (uint *)*param_1)" ( (binary_expression "(uint *)param_1[1] == (uint *)*param_1" (cast_expression "(uint *)param_1[1]" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (subscript_expression "param_1[1]" identifier [ number_literal ])) == (cast_expression "(uint *)*param_1" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier))) )) (compound_statement "{\n    return 0;\n  }" { (return_statement "return 0;" return number_literal ;) })) (expression_statement "uVar1 = *(uint *)*param_1;" (assignment_expression "uVar1 = *(uint *)*param_1" identifier = (pointer_expression "*(uint *)*param_1" * (cast_expression "(uint *)*param_1" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier)))) ;) (do_statement "do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );" do (compound_statement "{\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  }" { (if_statement "if (param_3 < uVar1) {\n      return 2;\n    }" if (parenthesized_expression "(param_3 < uVar1)" ( (binary_expression "param_3 < uVar1" identifier < identifier) )) (compound_statement "{\n      return 2;\n    }" { (return_statement "return 2;" return number_literal ;) })) (expression_statement "puVar2 = (ushort *)*param_2;" (assignment_expression "puVar2 = (ushort *)*param_2" identifier = (cast_expression "(ushort *)*param_2" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) ;) (expression_statement "uVar4 = (ushort)uVar1;" (assignment_expression "uVar4 = (ushort)uVar1" identifier = (cast_expression "(ushort)uVar1" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) (if_statement "if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" if (parenthesized_expression "(uVar1 < 0x10000)" ( (binary_expression "uVar1 < 0x10000" identifier < number_literal) )) (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" { (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }" if (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 2)" ( (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 2" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(param_2[1] - (long)puVar2)" ( (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" identifier [ number_literal ]) - (cast_expression "(long)puVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ))) < number_literal) )) (compound_statement "{\n        return 1;\n      }" { (return_statement "return 1;" return number_literal ;) })) (if_statement "if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" if (parenthesized_expression "((param_4 & 1) == 0)" ( (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" ( (binary_expression "param_4 & 1" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" { (expression_statement "uVar4 = uVar4 << 8 | uVar4 >> 8;" (assignment_expression "uVar4 = uVar4 << 8 | uVar4 >> 8" identifier = (binary_expression "uVar4 << 8 | uVar4 >> 8" (binary_expression "uVar4 << 8" identifier << number_literal) | (binary_expression "uVar4 >> 8" identifier >> number_literal))) ;) })) (expression_statement "*puVar2 = uVar4;" (assignment_expression "*puVar2 = uVar4" (pointer_expression "*puVar2" * identifier) = identifier) ;) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "*param_2 + 2" (pointer_expression "*param_2" * identifier) + number_literal)) ;) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar6 + 4" identifier + number_literal)) ;) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" if (parenthesized_expression "(param_1[1] == lVar6 + 4)" ( (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" identifier [ number_literal ]) == (binary_expression "lVar6 + 4" identifier + number_literal)) )) (compound_statement "{\n        return 0;\n      }" { (return_statement "return 0;" return number_literal ;) })) }) (else_clause "else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" else (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" { (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }" if (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 4)" ( (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 4" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" ( identifier )) (argument_list "(param_2[1] - (long)puVar2)" ( (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" identifier [ number_literal ]) - (cast_expression "(long)puVar2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) ))) < number_literal) )) (compound_statement "{\n        return 1;\n      }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "uVar3 = (uVar4 & 0x3ff) + 0xdc00;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) + 0xdc00" identifier = (binary_expression "(uVar4 & 0x3ff) + 0xdc00" (parenthesized_expression "(uVar4 & 0x3ff)" ( (binary_expression "uVar4 & 0x3ff" identifier & number_literal) )) + number_literal)) ;) (expression_statement "uVar5 = (short)(uVar1 >> 10) + 0xd7c0;" (assignment_expression "uVar5 = (short)(uVar1 >> 10) + 0xd7c0" identifier = (binary_expression "(short)(uVar1 >> 10) + 0xd7c0" (cast_expression "(short)(uVar1 >> 10)" ( (type_descriptor "short" (sized_type_specifier "short" short)) ) (parenthesized_expression "(uVar1 >> 10)" ( (binary_expression "uVar1 >> 10" identifier >> number_literal) ))) + number_literal)) ;) (if_statement "if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" if (parenthesized_expression "((param_4 & 1) == 0)" ( (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" ( (binary_expression "param_4 & 1" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" { (expression_statement "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8" identifier = (binary_expression "(uVar4 & 0x3ff) << 8 | uVar3 >> 8" (binary_expression "(uVar4 & 0x3ff) << 8" (parenthesized_expression "(uVar4 & 0x3ff)" ( (binary_expression "uVar4 & 0x3ff" identifier & number_literal) )) << number_literal) | (binary_expression "uVar3 >> 8" identifier >> number_literal))) ;) (expression_statement "*puVar2 = uVar5 * 0x100 | uVar5 >> 8;" (assignment_expression "*puVar2 = uVar5 * 0x100 | uVar5 >> 8" (pointer_expression "*puVar2" * identifier) = (binary_expression "uVar5 * 0x100 | uVar5 >> 8" (binary_expression "uVar5 * 0x100" identifier * number_literal) | (binary_expression "uVar5 >> 8" identifier >> number_literal))) ;) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "lVar6 + 2" identifier + number_literal)) ;) }) (else_clause "else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" else (compound_statement "{\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" { (expression_statement "*puVar2 = uVar5;" (assignment_expression "*puVar2 = uVar5" (pointer_expression "*puVar2" * identifier) = identifier) ;) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "lVar6 + 2" identifier + number_literal)) ;) }))) (expression_statement "*(ushort *)(lVar6 + 2) = uVar3;" (assignment_expression "*(ushort *)(lVar6 + 2) = uVar3" (pointer_expression "*(ushort *)(lVar6 + 2)" * (cast_expression "(ushort *)(lVar6 + 2)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 2)" ( (binary_expression "lVar6 + 2" identifier + number_literal) )))) = identifier) ;) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" * identifier) = (binary_expression "*param_2 + 2" (pointer_expression "*param_2" * identifier) + number_literal)) ;) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar6 + 4" identifier + number_literal)) ;) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" if (parenthesized_expression "(param_1[1] == lVar6 + 4)" ( (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" identifier [ number_literal ]) == (binary_expression "lVar6 + 4" identifier + number_literal)) )) (compound_statement "{\n        return 0;\n      }" { (return_statement "return 0;" return number_literal ;) })) }))) (expression_statement "uVar1 = *(uint *)(lVar6 + 4);" (assignment_expression "uVar1 = *(uint *)(lVar6 + 4)" identifier = (pointer_expression "*(uint *)(lVar6 + 4)" * (cast_expression "(uint *)(lVar6 + 4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar6 + 4)" ( (binary_expression "lVar6 + 4" identifier + number_literal) ))))) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration (sized_type_specifier long) IDENT ;) (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ])) == (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) )) (compound_statement { (return_statement return LIT ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT)))) ;) (do_statement do (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT < IDENT) )) (compound_statement { (return_statement return LIT ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < LIT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression (subscript_expression IDENT [ LIT ]) - (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT)) ))) < LIT) )) (compound_statement { (return_statement return LIT ;) })) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression IDENT << LIT) | (binary_expression IDENT >> LIT))) ;) })) (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression (pointer_expression * IDENT) + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) == (binary_expression IDENT + LIT)) )) (compound_statement { (return_statement return LIT ;) })) }) (else_clause else (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression (subscript_expression IDENT [ LIT ]) - (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT)) ))) < LIT) )) (compound_statement { (return_statement return LIT ;) })) (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier short)) ) (parenthesized_expression ( (binary_expression IDENT >> LIT) ))) + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) << LIT) | (binary_expression IDENT >> LIT))) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression (binary_expression IDENT * LIT) | (binary_expression IDENT >> LIT))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression IDENT + LIT)) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression IDENT + LIT)) ;) }))) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = IDENT) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression (pointer_expression * IDENT) + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) == (binary_expression IDENT + LIT)) )) (compound_statement { (return_statement return LIT ;) })) }))) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) }) while (parenthesized_expression ( BOOL )) ;) })))
(function_definition "undefined8 FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)\n\n{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" (type_identifier "undefined8") (function_declarator "FUN_003b7d10(long *param_1,long *param_2,ulong param_3,uint param_4)" (identifier "FUN_003b7d10") (parameter_list "(long *param_1,long *param_2,ulong param_3,uint param_4)" (( "(") (parameter_declaration "long *param_1" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "long *param_2" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) (, ",") (parameter_declaration "ulong param_3" (type_identifier "ulong") (identifier "param_3")) (, ",") (parameter_declaration "uint param_4" (type_identifier "uint") (identifier "param_4")) () ")"))) (compound_statement "{\n  uint uVar1;\n  ushort *puVar2;\n  ushort uVar3;\n  ushort uVar4;\n  ushort uVar5;\n  long lVar6;\n  \n  if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }\n  uVar1 = *(uint *)*param_1;\n  do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );\n}" ({ "{") (declaration "uint uVar1;" (type_identifier "uint") (identifier "uVar1") (; ";")) (declaration "ushort *puVar2;" (type_identifier "ushort") (pointer_declarator "*puVar2" (* "*") (identifier "puVar2")) (; ";")) (declaration "ushort uVar3;" (type_identifier "ushort") (identifier "uVar3") (; ";")) (declaration "ushort uVar4;" (type_identifier "ushort") (identifier "uVar4") (; ";")) (declaration "ushort uVar5;" (type_identifier "ushort") (identifier "uVar5") (; ";")) (declaration "long lVar6;" (sized_type_specifier "long" (long "long")) (identifier "lVar6") (; ";")) (if_statement "if ((uint *)param_1[1] == (uint *)*param_1) {\n    return 0;\n  }" (if "if") (parenthesized_expression "((uint *)param_1[1] == (uint *)*param_1)" (( "(") (binary_expression "(uint *)param_1[1] == (uint *)*param_1" (cast_expression "(uint *)param_1[1]" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]"))) (== "==") (cast_expression "(uint *)*param_1" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_1" (* "*") (identifier "param_1")))) () ")")) (compound_statement "{\n    return 0;\n  }" ({ "{") (return_statement "return 0;" (return "return") (number_literal "0") (; ";")) (} "}"))) (expression_statement "uVar1 = *(uint *)*param_1;" (assignment_expression "uVar1 = *(uint *)*param_1" (identifier "uVar1") (= "=") (pointer_expression "*(uint *)*param_1" (* "*") (cast_expression "(uint *)*param_1" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_1" (* "*") (identifier "param_1"))))) (; ";")) (do_statement "do {\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  } while( true );" (do "do") (compound_statement "{\n    if (param_3 < uVar1) {\n      return 2;\n    }\n    puVar2 = (ushort *)*param_2;\n    uVar4 = (ushort)uVar1;\n    if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    uVar1 = *(uint *)(lVar6 + 4);\n  }" ({ "{") (if_statement "if (param_3 < uVar1) {\n      return 2;\n    }" (if "if") (parenthesized_expression "(param_3 < uVar1)" (( "(") (binary_expression "param_3 < uVar1" (identifier "param_3") (< "<") (identifier "uVar1")) () ")")) (compound_statement "{\n      return 2;\n    }" ({ "{") (return_statement "return 2;" (return "return") (number_literal "2") (; ";")) (} "}"))) (expression_statement "puVar2 = (ushort *)*param_2;" (assignment_expression "puVar2 = (ushort *)*param_2" (identifier "puVar2") (= "=") (cast_expression "(ushort *)*param_2" (( "(") (type_descriptor "ushort *" (type_identifier "ushort") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_2" (* "*") (identifier "param_2")))) (; ";")) (expression_statement "uVar4 = (ushort)uVar1;" (assignment_expression "uVar4 = (ushort)uVar1" (identifier "uVar4") (= "=") (cast_expression "(ushort)uVar1" (( "(") (type_descriptor "ushort" (type_identifier "ushort")) () ")") (identifier "uVar1"))) (; ";")) (if_statement "if (uVar1 < 0x10000) {\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }\n    else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" (if "if") (parenthesized_expression "(uVar1 < 0x10000)" (( "(") (binary_expression "uVar1 < 0x10000" (identifier "uVar1") (< "<") (number_literal "0x10000")) () ")")) (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }\n      if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }\n      *puVar2 = uVar4;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" ({ "{") (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 2) {\n        return 1;\n      }" (if "if") (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 2)" (( "(") (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 2" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")")) (argument_list "(param_2[1] - (long)puVar2)" (( "(") (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]")) (- "-") (cast_expression "(long)puVar2" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "puVar2"))) () ")"))) (< "<") (number_literal "2")) () ")")) (compound_statement "{\n        return 1;\n      }" ({ "{") (return_statement "return 1;" (return "return") (number_literal "1") (; ";")) (} "}"))) (if_statement "if ((param_4 & 1) == 0) {\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" (if "if") (parenthesized_expression "((param_4 & 1) == 0)" (( "(") (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" (( "(") (binary_expression "param_4 & 1" (identifier "param_4") (& "&") (number_literal "1")) () ")")) (== "==") (number_literal "0")) () ")")) (compound_statement "{\n        uVar4 = uVar4 << 8 | uVar4 >> 8;\n      }" ({ "{") (expression_statement "uVar4 = uVar4 << 8 | uVar4 >> 8;" (assignment_expression "uVar4 = uVar4 << 8 | uVar4 >> 8" (identifier "uVar4") (= "=") (binary_expression "uVar4 << 8 | uVar4 >> 8" (binary_expression "uVar4 << 8" (identifier "uVar4") (<< "<<") (number_literal "8")) (| "|") (binary_expression "uVar4 >> 8" (identifier "uVar4") (>> ">>") (number_literal "8")))) (; ";")) (} "}"))) (expression_statement "*puVar2 = uVar4;" (assignment_expression "*puVar2 = uVar4" (pointer_expression "*puVar2" (* "*") (identifier "puVar2")) (= "=") (identifier "uVar4")) (; ";")) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" (identifier "lVar6") (= "=") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) (; ";")) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (= "=") (binary_expression "*param_2 + 2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (+ "+") (number_literal "2"))) (; ";")) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (= "=") (binary_expression "lVar6 + 4" (identifier "lVar6") (+ "+") (number_literal "4"))) (; ";")) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" (if "if") (parenthesized_expression "(param_1[1] == lVar6 + 4)" (( "(") (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (== "==") (binary_expression "lVar6 + 4" (identifier "lVar6") (+ "+") (number_literal "4"))) () ")")) (compound_statement "{\n        return 0;\n      }" ({ "{") (return_statement "return 0;" (return "return") (number_literal "0") (; ";")) (} "}"))) (} "}")) (else_clause "else {\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" (else "else") (compound_statement "{\n      if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }\n      uVar3 = (uVar4 & 0x3ff) + 0xdc00;\n      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;\n      if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      *(ushort *)(lVar6 + 2) = uVar3;\n      lVar6 = *param_1;\n      *param_2 = *param_2 + 2;\n      *param_1 = lVar6 + 4;\n      if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }\n    }" ({ "{") (if_statement "if ((ulong)(param_2[1] - (long)puVar2) < 4) {\n        return 1;\n      }" (if "if") (parenthesized_expression "((ulong)(param_2[1] - (long)puVar2) < 4)" (( "(") (binary_expression "(ulong)(param_2[1] - (long)puVar2) < 4" (call_expression "(ulong)(param_2[1] - (long)puVar2)" (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")")) (argument_list "(param_2[1] - (long)puVar2)" (( "(") (binary_expression "param_2[1] - (long)puVar2" (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]")) (- "-") (cast_expression "(long)puVar2" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "puVar2"))) () ")"))) (< "<") (number_literal "4")) () ")")) (compound_statement "{\n        return 1;\n      }" ({ "{") (return_statement "return 1;" (return "return") (number_literal "1") (; ";")) (} "}"))) (expression_statement "uVar3 = (uVar4 & 0x3ff) + 0xdc00;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) + 0xdc00" (identifier "uVar3") (= "=") (binary_expression "(uVar4 & 0x3ff) + 0xdc00" (parenthesized_expression "(uVar4 & 0x3ff)" (( "(") (binary_expression "uVar4 & 0x3ff" (identifier "uVar4") (& "&") (number_literal "0x3ff")) () ")")) (+ "+") (number_literal "0xdc00"))) (; ";")) (expression_statement "uVar5 = (short)(uVar1 >> 10) + 0xd7c0;" (assignment_expression "uVar5 = (short)(uVar1 >> 10) + 0xd7c0" (identifier "uVar5") (= "=") (binary_expression "(short)(uVar1 >> 10) + 0xd7c0" (cast_expression "(short)(uVar1 >> 10)" (( "(") (type_descriptor "short" (sized_type_specifier "short" (short "short"))) () ")") (parenthesized_expression "(uVar1 >> 10)" (( "(") (binary_expression "uVar1 >> 10" (identifier "uVar1") (>> ">>") (number_literal "10")) () ")"))) (+ "+") (number_literal "0xd7c0"))) (; ";")) (if_statement "if ((param_4 & 1) == 0) {\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }\n      else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" (if "if") (parenthesized_expression "((param_4 & 1) == 0)" (( "(") (binary_expression "(param_4 & 1) == 0" (parenthesized_expression "(param_4 & 1)" (( "(") (binary_expression "param_4 & 1" (identifier "param_4") (& "&") (number_literal "1")) () ")")) (== "==") (number_literal "0")) () ")")) (compound_statement "{\n        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;\n        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" ({ "{") (expression_statement "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;" (assignment_expression "uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8" (identifier "uVar3") (= "=") (binary_expression "(uVar4 & 0x3ff) << 8 | uVar3 >> 8" (binary_expression "(uVar4 & 0x3ff) << 8" (parenthesized_expression "(uVar4 & 0x3ff)" (( "(") (binary_expression "uVar4 & 0x3ff" (identifier "uVar4") (& "&") (number_literal "0x3ff")) () ")")) (<< "<<") (number_literal "8")) (| "|") (binary_expression "uVar3 >> 8" (identifier "uVar3") (>> ">>") (number_literal "8")))) (; ";")) (expression_statement "*puVar2 = uVar5 * 0x100 | uVar5 >> 8;" (assignment_expression "*puVar2 = uVar5 * 0x100 | uVar5 >> 8" (pointer_expression "*puVar2" (* "*") (identifier "puVar2")) (= "=") (binary_expression "uVar5 * 0x100 | uVar5 >> 8" (binary_expression "uVar5 * 0x100" (identifier "uVar5") (* "*") (number_literal "0x100")) (| "|") (binary_expression "uVar5 >> 8" (identifier "uVar5") (>> ">>") (number_literal "8")))) (; ";")) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" (identifier "lVar6") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (= "=") (binary_expression "lVar6 + 2" (identifier "lVar6") (+ "+") (number_literal "2"))) (; ";")) (} "}")) (else_clause "else {\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" (else "else") (compound_statement "{\n        *puVar2 = uVar5;\n        lVar6 = *param_2;\n        *param_2 = lVar6 + 2;\n      }" ({ "{") (expression_statement "*puVar2 = uVar5;" (assignment_expression "*puVar2 = uVar5" (pointer_expression "*puVar2" (* "*") (identifier "puVar2")) (= "=") (identifier "uVar5")) (; ";")) (expression_statement "lVar6 = *param_2;" (assignment_expression "lVar6 = *param_2" (identifier "lVar6") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (expression_statement "*param_2 = lVar6 + 2;" (assignment_expression "*param_2 = lVar6 + 2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (= "=") (binary_expression "lVar6 + 2" (identifier "lVar6") (+ "+") (number_literal "2"))) (; ";")) (} "}")))) (expression_statement "*(ushort *)(lVar6 + 2) = uVar3;" (assignment_expression "*(ushort *)(lVar6 + 2) = uVar3" (pointer_expression "*(ushort *)(lVar6 + 2)" (* "*") (cast_expression "(ushort *)(lVar6 + 2)" (( "(") (type_descriptor "ushort *" (type_identifier "ushort") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar6 + 2)" (( "(") (binary_expression "lVar6 + 2" (identifier "lVar6") (+ "+") (number_literal "2")) () ")")))) (= "=") (identifier "uVar3")) (; ";")) (expression_statement "lVar6 = *param_1;" (assignment_expression "lVar6 = *param_1" (identifier "lVar6") (= "=") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) (; ";")) (expression_statement "*param_2 = *param_2 + 2;" (assignment_expression "*param_2 = *param_2 + 2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (= "=") (binary_expression "*param_2 + 2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (+ "+") (number_literal "2"))) (; ";")) (expression_statement "*param_1 = lVar6 + 4;" (assignment_expression "*param_1 = lVar6 + 4" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (= "=") (binary_expression "lVar6 + 4" (identifier "lVar6") (+ "+") (number_literal "4"))) (; ";")) (if_statement "if (param_1[1] == lVar6 + 4) {\n        return 0;\n      }" (if "if") (parenthesized_expression "(param_1[1] == lVar6 + 4)" (( "(") (binary_expression "param_1[1] == lVar6 + 4" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (== "==") (binary_expression "lVar6 + 4" (identifier "lVar6") (+ "+") (number_literal "4"))) () ")")) (compound_statement "{\n        return 0;\n      }" ({ "{") (return_statement "return 0;" (return "return") (number_literal "0") (; ";")) (} "}"))) (} "}")))) (expression_statement "uVar1 = *(uint *)(lVar6 + 4);" (assignment_expression "uVar1 = *(uint *)(lVar6 + 4)" (identifier "uVar1") (= "=") (pointer_expression "*(uint *)(lVar6 + 4)" (* "*") (cast_expression "(uint *)(lVar6 + 4)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar6 + 4)" (( "(") (binary_expression "lVar6 + 4" (identifier "lVar6") (+ "+") (number_literal "4")) () ")"))))) (; ";")) (} "}")) (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (; ";")) (} "}")))

/* std::(anonymous namespace)::ucs4_out(std::(anonymous namespace)::range<char32_t const, true>&,
   std::(anonymous namespace)::range<char16_t, false>&, unsigned long, std::codecvt_mode) [clone
   .part.23] */

type_1
std::(anonymous_namespace)::function_1(long *param_1,long *param_2,type_2 var_1,type_3 var_3)

{
  type_3 var_2;
  type_4 *puVar2;
  type_4 var_6;
  type_4 var_4;
  type_4 var_7;
  long var_5;
  
  if ((type_3 *)param_1[1] == (type_3 *)*param_1) {
    return 0;
  }
  var_2 = *(type_3 *)*param_1;
  do {
    if (var_1 < var_2) {
      return 2;
    }
    puVar2 = (type_4 *)*param_2;
    var_4 = (type_4)var_2;
    if (var_2 < 0x10000) {
      if ((type_2)(param_2[1] - (long)puVar2) < 2) {
        return 1;
      }
      if ((var_3 & 1) == 0) {
        var_4 = var_4 << 8 | var_4 >> 8;
      }
      *puVar2 = var_4;
      var_5 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = var_5 + 4;
      if (param_1[1] == var_5 + 4) {
        return 0;
      }
    }
    else {
      if ((type_2)(param_2[1] - (long)puVar2) < 4) {
        return 1;
      }
      var_6 = (var_4 & 0x3ff) + 0xdc00;
      var_7 = (short)(var_2 >> 10) + 0xd7c0;
      if ((var_3 & 1) == 0) {
        var_6 = (var_4 & 0x3ff) << 8 | var_6 >> 8;
        *puVar2 = var_7 * 0x100 | var_7 >> 8;
        var_5 = *param_2;
        *param_2 = var_5 + 2;
      }
      else {
        *puVar2 = var_7;
        var_5 = *param_2;
        *param_2 = var_5 + 2;
      }
      *(type_4 *)(var_5 + 2) = var_6;
      var_5 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = var_5 + 4;
      if (param_1[1] == var_5 + 4) {
        return 0;
      }
    }
    var_2 = *(type_3 *)(var_5 + 4);
  } while( true );
}


(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: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (identifier)))) body: (compound_statement (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (identifier)) (if_statement condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (subscript_expression argument: (identifier) index: (number_literal))) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) consequence: (compound_statement (return_statement (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier)))))) (do_statement body: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) consequence: (compound_statement (return_statement (number_literal)))) (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: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier))))) right: (number_literal))) consequence: (compound_statement (return_statement (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (binary_expression left: (identifier) right: (number_literal))))))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (binary_expression left: (identifier) right: (number_literal)))) consequence: (compound_statement (return_statement (number_literal))))) alternative: (else_clause (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier))))) right: (number_literal))) consequence: (compound_statement (return_statement (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal)) right: (binary_expression left: (identifier) right: (number_literal))))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (binary_expression left: (identifier) right: (number_literal))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (number_literal))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (number_literal))))))) (expression_statement (assignment_expression left: (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))))) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (binary_expression left: (identifier) right: (number_literal)))) consequence: (compound_statement (return_statement (number_literal))))))) (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)))))))) condition: (parenthesized_expression (true))))))

undefined8 MASKED(long *param_1,long *param_2,ulong param_3,uint param_4)

{
  uint uVar1;
  ushort *puVar2;
  ushort uVar3;
  ushort uVar4;
  ushort uVar5;
  long lVar6;
  
  if ((uint *)param_1[1] == (uint *)*param_1) {
    return 0;
  }
  uVar1 = *(uint *)*param_1;
  do {
    if (param_3 < uVar1) {
      return 2;
    }
    puVar2 = (ushort *)*param_2;
    uVar4 = (ushort)uVar1;
    if (uVar1 < 0x10000) {
      if ((ulong)(param_2[1] - (long)puVar2) < 2) {
        return 1;
      }
      if ((param_4 & 1) == 0) {
        uVar4 = uVar4 << 8 | uVar4 >> 8;
      }
      *puVar2 = uVar4;
      lVar6 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = lVar6 + 4;
      if (param_1[1] == lVar6 + 4) {
        return 0;
      }
    }
    else {
      if ((ulong)(param_2[1] - (long)puVar2) < 4) {
        return 1;
      }
      uVar3 = (uVar4 & 0x3ff) + 0xdc00;
      uVar5 = (short)(uVar1 >> 10) + 0xd7c0;
      if ((param_4 & 1) == 0) {
        uVar3 = (uVar4 & 0x3ff) << 8 | uVar3 >> 8;
        *puVar2 = uVar5 * 0x100 | uVar5 >> 8;
        lVar6 = *param_2;
        *param_2 = lVar6 + 2;
      }
      else {
        *puVar2 = uVar5;
        lVar6 = *param_2;
        *param_2 = lVar6 + 2;
      }
      *(ushort *)(lVar6 + 2) = uVar3;
      lVar6 = *param_1;
      *param_2 = *param_2 + 2;
      *param_1 = lVar6 + 4;
      if (param_1[1] == lVar6 + 4) {
        return 0;
      }
    }
    uVar1 = *(uint *)(lVar6 + 4);
  } while( true );
}

