
void bb_uuencode(char *p,void *src,int length,char *tbl)

{
  uint uVar1;
  char *pcVar2;
  uchar *s;
  char *pcVar3;
  char *pcVar4;
  int iVar5;
  
  pcVar3 = p;
  if (0 < length) {
    do {
      length = length + -3;
      uVar1 = 0;
      pcVar2 = tbl;
      pcVar4 = tbl;
      if (length != -2) {
        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);
        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;
        if (length == -1) {
          pcVar4 = tbl + iVar5;
        }
        else {
          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);
          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;
        }
      }
                    /* WARNING: Load size is inaccurate */
      p = pcVar3 + 4;
      *pcVar3 = tbl[*src >> 2];
                    /* WARNING: Load size is inaccurate */
      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];
      pcVar3[2] = *pcVar4;
      pcVar3[3] = *pcVar2;
      pcVar3 = p;
      src = (byte *)((int)src + 3);
    } while (0 < length);
  }
  *p = '\0';
  if (length != 0) {
    pcVar3 = p + length;
    do {
      p = p + -1;
      *p = tbl[0x40];
    } while (p != pcVar3);
  }
  return;
}



void FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)

{
  uint uVar1;
  undefined1 *puVar2;
  undefined1 *puVar3;
  undefined1 *puVar4;
  int iVar5;
  
  puVar3 = param_1;
  if (0 < param_3) {
    do {
      param_3 = param_3 + -3;
      uVar1 = 0;
      puVar2 = param_4;
      puVar4 = param_4;
      if (param_3 != -2) {
        uVar1 = (uint)(param_2[1] >> 4);
        iVar5 = (param_2[1] & 0xf) * 4;
        if (param_3 == -1) {
          puVar4 = param_4 + iVar5;
        }
        else {
          puVar2 = param_4 + (param_2[2] & 0x3f);
          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;
        }
      }
      param_1 = puVar3 + 4;
      *puVar3 = param_4[*param_2 >> 2];
      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];
      puVar3[2] = *puVar4;
      puVar3[3] = *puVar2;
      puVar3 = param_1;
      param_2 = param_2 + 3;
    } while (0 < param_3);
  }
  *param_1 = 0;
  if (param_3 != 0) {
    puVar3 = param_1 + param_3;
    do {
      param_1 = param_1 + -1;
      *param_1 = param_4[0x40];
    } while (param_1 != puVar3);
  }
  return;
}


blez a2,0x000fa448
_nop
li t3,-0x2
li t2,-0x1
addiu a2,a2,-0x3
bne a2,t3,0x000fa46c
_or v0,zero,zero
or v1,a3,zero
or t0,a3,zero
lbu t1,0x0(a1)
addiu a0,a0,0x4
addiu a1,a1,0x3
addu v0,a3,v0
srl t1,t1,0x2
addu t1,a3,t1
lbu t1,0x0(t1)
sb t1,-0x4(a0)
lbu t1,-0x3(a1)
sll t1,t1,0x4
andi t1,t1,0x30
addu v0,v0,t1
lbu v0,0x0(v0)
sb v0,-0x3(a0)
lbu v0,0x0(t0)
sb v0,-0x2(a0)
lbu v0,0x0(v1)
bgtz a2,0x000fa3e8
_sb v0,-0x1(a0)
beq a2,zero,0x000fa464
_sb zero,0x0(a0)
addu a2,a0,a2
addiu a0,a0,-0x1
lbu v0,0x40(a3)
bne a0,a2,0x000fa454
_sb v0,0x0(a0)
jr ra
_nop
lbu v0,0x1(a1)
sll t0,v0,0x2
srl v0,v0,0x4
beq a2,t2,0x000fa49c
_andi t1,t0,0x3c
lbu v1,0x2(a1)
srl t0,v1,0x6
andi v1,v1,0x3f
addu t0,t0,t1
addu v1,a3,v1
b 0x000fa3fc
_addu t0,a3,t0
addu t0,a3,t1
b 0x000fa3fc
_or v1,a3,zero
(translation_unit "void FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)\n\n{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}\n\n" (function_definition "void FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)\n\n{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}" primitive_type (function_declarator "FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)" identifier (parameter_list "(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)" ( (parameter_declaration "undefined1 *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "byte *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int param_3" primitive_type identifier) , (parameter_declaration "undefined1 *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) ))) (compound_statement "{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "undefined1 *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "undefined1 *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (declaration "undefined1 *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "int iVar5;" primitive_type identifier ;) (expression_statement "puVar3 = param_1;" (assignment_expression "puVar3 = param_1" identifier = identifier) ;) (if_statement "if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }" if (parenthesized_expression "(0 < param_3)" ( (binary_expression "0 < param_3" number_literal < identifier) )) (compound_statement "{\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }" { (do_statement "do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);" do (compound_statement "{\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    }" { (expression_statement "param_3 = param_3 + -3;" (assignment_expression "param_3 = param_3 + -3" identifier = (binary_expression "param_3 + -3" identifier + number_literal)) ;) (expression_statement "uVar1 = 0;" (assignment_expression "uVar1 = 0" identifier = number_literal) ;) (expression_statement "puVar2 = param_4;" (assignment_expression "puVar2 = param_4" identifier = identifier) ;) (expression_statement "puVar4 = param_4;" (assignment_expression "puVar4 = param_4" identifier = identifier) ;) (if_statement "if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }" if (parenthesized_expression "(param_3 != -2)" ( (binary_expression "param_3 != -2" identifier != number_literal) )) (compound_statement "{\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }" { (expression_statement "uVar1 = (uint)(param_2[1] >> 4);" (assignment_expression "uVar1 = (uint)(param_2[1] >> 4)" identifier = (call_expression "(uint)(param_2[1] >> 4)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "(param_2[1] >> 4)" ( (binary_expression "param_2[1] >> 4" (subscript_expression "param_2[1]" identifier [ number_literal ]) >> number_literal) )))) ;) (expression_statement "iVar5 = (param_2[1] & 0xf) * 4;" (assignment_expression "iVar5 = (param_2[1] & 0xf) * 4" identifier = (binary_expression "(param_2[1] & 0xf) * 4" (parenthesized_expression "(param_2[1] & 0xf)" ( (binary_expression "param_2[1] & 0xf" (subscript_expression "param_2[1]" identifier [ number_literal ]) & number_literal) )) * number_literal)) ;) (if_statement "if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" if (parenthesized_expression "(param_3 == -1)" ( (binary_expression "param_3 == -1" identifier == number_literal) )) (compound_statement "{\n          puVar4 = param_4 + iVar5;\n        }" { (expression_statement "puVar4 = param_4 + iVar5;" (assignment_expression "puVar4 = param_4 + iVar5" identifier = (binary_expression "param_4 + iVar5" identifier + identifier)) ;) }) (else_clause "else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" else (compound_statement "{\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" { (expression_statement "puVar2 = param_4 + (param_2[2] & 0x3f);" (assignment_expression "puVar2 = param_4 + (param_2[2] & 0x3f)" identifier = (binary_expression "param_4 + (param_2[2] & 0x3f)" identifier + (parenthesized_expression "(param_2[2] & 0x3f)" ( (binary_expression "param_2[2] & 0x3f" (subscript_expression "param_2[2]" identifier [ number_literal ]) & number_literal) )))) ;) (expression_statement "puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;" (assignment_expression "puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5" identifier = (binary_expression "param_4 + (uint)(param_2[2] >> 6) + iVar5" (binary_expression "param_4 + (uint)(param_2[2] >> 6)" identifier + (call_expression "(uint)(param_2[2] >> 6)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "(param_2[2] >> 6)" ( (binary_expression "param_2[2] >> 6" (subscript_expression "param_2[2]" identifier [ number_literal ]) >> number_literal) )))) + identifier)) ;) }))) })) (expression_statement "param_1 = puVar3 + 4;" (assignment_expression "param_1 = puVar3 + 4" identifier = (binary_expression "puVar3 + 4" identifier + number_literal)) ;) (expression_statement "*puVar3 = param_4[*param_2 >> 2];" (assignment_expression "*puVar3 = param_4[*param_2 >> 2]" (pointer_expression "*puVar3" * identifier) = (subscript_expression "param_4[*param_2 >> 2]" identifier [ (binary_expression "*param_2 >> 2" (pointer_expression "*param_2" * identifier) >> number_literal) ])) ;) (expression_statement "puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];" (assignment_expression "puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1]" (subscript_expression "puVar3[1]" identifier [ number_literal ]) = (subscript_expression "param_4[(*param_2 & 3) * 0x10 + uVar1]" identifier [ (binary_expression "(*param_2 & 3) * 0x10 + uVar1" (binary_expression "(*param_2 & 3) * 0x10" (parenthesized_expression "(*param_2 & 3)" ( (binary_expression "*param_2 & 3" (pointer_expression "*param_2" * identifier) & number_literal) )) * number_literal) + identifier) ])) ;) (expression_statement "puVar3[2] = *puVar4;" (assignment_expression "puVar3[2] = *puVar4" (subscript_expression "puVar3[2]" identifier [ number_literal ]) = (pointer_expression "*puVar4" * identifier)) ;) (expression_statement "puVar3[3] = *puVar2;" (assignment_expression "puVar3[3] = *puVar2" (subscript_expression "puVar3[3]" identifier [ number_literal ]) = (pointer_expression "*puVar2" * identifier)) ;) (expression_statement "puVar3 = param_1;" (assignment_expression "puVar3 = param_1" identifier = identifier) ;) (expression_statement "param_2 = param_2 + 3;" (assignment_expression "param_2 = param_2 + 3" identifier = (binary_expression "param_2 + 3" identifier + number_literal)) ;) }) while (parenthesized_expression "(0 < param_3)" ( (binary_expression "0 < param_3" number_literal < identifier) )) ;) })) (expression_statement "*param_1 = 0;" (assignment_expression "*param_1 = 0" (pointer_expression "*param_1" * identifier) = number_literal) ;) (if_statement "if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }" if (parenthesized_expression "(param_3 != 0)" ( (binary_expression "param_3 != 0" identifier != number_literal) )) (compound_statement "{\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }" { (expression_statement "puVar3 = param_1 + param_3;" (assignment_expression "puVar3 = param_1 + param_3" identifier = (binary_expression "param_1 + param_3" identifier + identifier)) ;) (do_statement "do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);" do (compound_statement "{\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    }" { (expression_statement "param_1 = param_1 + -1;" (assignment_expression "param_1 = param_1 + -1" identifier = (binary_expression "param_1 + -1" identifier + number_literal)) ;) (expression_statement "*param_1 = param_4[0x40];" (assignment_expression "*param_1 = param_4[0x40]" (pointer_expression "*param_1" * identifier) = (subscript_expression "param_4[0x40]" identifier [ number_literal ])) ;) }) while (parenthesized_expression "(param_1 != puVar3)" ( (binary_expression "param_1 != puVar3" identifier != identifier) )) ;) })) (return_statement "return;" return ;) })))
(translation_unit "void bb_uuencode(char *p,void *src,int length,char *tbl)\n\n{\n  uint uVar1;\n  char *pcVar2;\n  uchar *s;\n  char *pcVar3;\n  char *pcVar4;\n  int iVar5;\n  \n  pcVar3 = p;\n  if (0 < length) {\n    do {\n      length = length + -3;\n      uVar1 = 0;\n      pcVar2 = tbl;\n      pcVar4 = tbl;\n      if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }\n                    /* WARNING: Load size is inaccurate */\n      p = pcVar3 + 4;\n      *pcVar3 = tbl[*src >> 2];\n                    /* WARNING: Load size is inaccurate */\n      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];\n      pcVar3[2] = *pcVar4;\n      pcVar3[3] = *pcVar2;\n      pcVar3 = p;\n      src = (byte *)((int)src + 3);\n    } while (0 < length);\n  }\n  *p = '\0';\n  if (length != 0) {\n    pcVar3 = p + length;\n    do {\n      p = p + -1;\n      *p = tbl[0x40];\n    } while (p != pcVar3);\n  }\n  return;\n}\n\n" (function_definition "void bb_uuencode(char *p,void *src,int length,char *tbl)\n\n{\n  uint uVar1;\n  char *pcVar2;\n  uchar *s;\n  char *pcVar3;\n  char *pcVar4;\n  int iVar5;\n  \n  pcVar3 = p;\n  if (0 < length) {\n    do {\n      length = length + -3;\n      uVar1 = 0;\n      pcVar2 = tbl;\n      pcVar4 = tbl;\n      if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }\n                    /* WARNING: Load size is inaccurate */\n      p = pcVar3 + 4;\n      *pcVar3 = tbl[*src >> 2];\n                    /* WARNING: Load size is inaccurate */\n      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];\n      pcVar3[2] = *pcVar4;\n      pcVar3[3] = *pcVar2;\n      pcVar3 = p;\n      src = (byte *)((int)src + 3);\n    } while (0 < length);\n  }\n  *p = '\0';\n  if (length != 0) {\n    pcVar3 = p + length;\n    do {\n      p = p + -1;\n      *p = tbl[0x40];\n    } while (p != pcVar3);\n  }\n  return;\n}" primitive_type (function_declarator "bb_uuencode(char *p,void *src,int length,char *tbl)" identifier (parameter_list "(char *p,void *src,int length,char *tbl)" ( (parameter_declaration "char *p" primitive_type (pointer_declarator "*p" * identifier)) , (parameter_declaration "void *src" primitive_type (pointer_declarator "*src" * identifier)) , (parameter_declaration "int length" primitive_type identifier) , (parameter_declaration "char *tbl" primitive_type (pointer_declarator "*tbl" * identifier)) ))) (compound_statement "{\n  uint uVar1;\n  char *pcVar2;\n  uchar *s;\n  char *pcVar3;\n  char *pcVar4;\n  int iVar5;\n  \n  pcVar3 = p;\n  if (0 < length) {\n    do {\n      length = length + -3;\n      uVar1 = 0;\n      pcVar2 = tbl;\n      pcVar4 = tbl;\n      if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }\n                    /* WARNING: Load size is inaccurate */\n      p = pcVar3 + 4;\n      *pcVar3 = tbl[*src >> 2];\n                    /* WARNING: Load size is inaccurate */\n      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];\n      pcVar3[2] = *pcVar4;\n      pcVar3[3] = *pcVar2;\n      pcVar3 = p;\n      src = (byte *)((int)src + 3);\n    } while (0 < length);\n  }\n  *p = '\0';\n  if (length != 0) {\n    pcVar3 = p + length;\n    do {\n      p = p + -1;\n      *p = tbl[0x40];\n    } while (p != pcVar3);\n  }\n  return;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "char *pcVar2;" primitive_type (pointer_declarator "*pcVar2" * identifier) ;) (declaration "uchar *s;" type_identifier (pointer_declarator "*s" * identifier) ;) (declaration "char *pcVar3;" primitive_type (pointer_declarator "*pcVar3" * identifier) ;) (declaration "char *pcVar4;" primitive_type (pointer_declarator "*pcVar4" * identifier) ;) (declaration "int iVar5;" primitive_type identifier ;) (expression_statement "pcVar3 = p;" (assignment_expression "pcVar3 = p" identifier = identifier) ;) (if_statement "if (0 < length) {\n    do {\n      length = length + -3;\n      uVar1 = 0;\n      pcVar2 = tbl;\n      pcVar4 = tbl;\n      if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }\n                    /* WARNING: Load size is inaccurate */\n      p = pcVar3 + 4;\n      *pcVar3 = tbl[*src >> 2];\n                    /* WARNING: Load size is inaccurate */\n      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];\n      pcVar3[2] = *pcVar4;\n      pcVar3[3] = *pcVar2;\n      pcVar3 = p;\n      src = (byte *)((int)src + 3);\n    } while (0 < length);\n  }" if (parenthesized_expression "(0 < length)" ( (binary_expression "0 < length" number_literal < identifier) )) (compound_statement "{\n    do {\n      length = length + -3;\n      uVar1 = 0;\n      pcVar2 = tbl;\n      pcVar4 = tbl;\n      if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }\n                    /* WARNING: Load size is inaccurate */\n      p = pcVar3 + 4;\n      *pcVar3 = tbl[*src >> 2];\n                    /* WARNING: Load size is inaccurate */\n      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];\n      pcVar3[2] = *pcVar4;\n      pcVar3[3] = *pcVar2;\n      pcVar3 = p;\n      src = (byte *)((int)src + 3);\n    } while (0 < length);\n  }" { (do_statement "do {\n      length = length + -3;\n      uVar1 = 0;\n      pcVar2 = tbl;\n      pcVar4 = tbl;\n      if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }\n                    /* WARNING: Load size is inaccurate */\n      p = pcVar3 + 4;\n      *pcVar3 = tbl[*src >> 2];\n                    /* WARNING: Load size is inaccurate */\n      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];\n      pcVar3[2] = *pcVar4;\n      pcVar3[3] = *pcVar2;\n      pcVar3 = p;\n      src = (byte *)((int)src + 3);\n    } while (0 < length);" do (compound_statement "{\n      length = length + -3;\n      uVar1 = 0;\n      pcVar2 = tbl;\n      pcVar4 = tbl;\n      if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }\n                    /* WARNING: Load size is inaccurate */\n      p = pcVar3 + 4;\n      *pcVar3 = tbl[*src >> 2];\n                    /* WARNING: Load size is inaccurate */\n      pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];\n      pcVar3[2] = *pcVar4;\n      pcVar3[3] = *pcVar2;\n      pcVar3 = p;\n      src = (byte *)((int)src + 3);\n    }" { (expression_statement "length = length + -3;" (assignment_expression "length = length + -3" identifier = (binary_expression "length + -3" identifier + number_literal)) ;) (expression_statement "uVar1 = 0;" (assignment_expression "uVar1 = 0" identifier = number_literal) ;) (expression_statement "pcVar2 = tbl;" (assignment_expression "pcVar2 = tbl" identifier = identifier) ;) (expression_statement "pcVar4 = tbl;" (assignment_expression "pcVar4 = tbl" identifier = identifier) ;) (if_statement "if (length != -2) {\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }" if (parenthesized_expression "(length != -2)" ( (binary_expression "length != -2" identifier != number_literal) )) (compound_statement "{\n        uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);\n        iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;\n        if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }\n      }" { (expression_statement "uVar1 = (uint)(*(byte *)((int)src + 1) >> 4);" (assignment_expression "uVar1 = (uint)(*(byte *)((int)src + 1) >> 4)" identifier = (call_expression "(uint)(*(byte *)((int)src + 1) >> 4)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "(*(byte *)((int)src + 1) >> 4)" ( (binary_expression "*(byte *)((int)src + 1) >> 4" (pointer_expression "*(byte *)((int)src + 1)" * (cast_expression "(byte *)((int)src + 1)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((int)src + 1)" ( (binary_expression "(int)src + 1" (cast_expression "(int)src" ( (type_descriptor "int" primitive_type) ) identifier) + number_literal) )))) >> number_literal) )))) ;) (expression_statement "iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4;" (assignment_expression "iVar5 = (*(byte *)((int)src + 1) & 0xf) * 4" identifier = (binary_expression "(*(byte *)((int)src + 1) & 0xf) * 4" (parenthesized_expression "(*(byte *)((int)src + 1) & 0xf)" ( (binary_expression "*(byte *)((int)src + 1) & 0xf" (pointer_expression "*(byte *)((int)src + 1)" * (cast_expression "(byte *)((int)src + 1)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((int)src + 1)" ( (binary_expression "(int)src + 1" (cast_expression "(int)src" ( (type_descriptor "int" primitive_type) ) identifier) + number_literal) )))) & number_literal) )) * number_literal)) ;) (if_statement "if (length == -1) {\n          pcVar4 = tbl + iVar5;\n        }\n        else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }" if (parenthesized_expression "(length == -1)" ( (binary_expression "length == -1" identifier == number_literal) )) (compound_statement "{\n          pcVar4 = tbl + iVar5;\n        }" { (expression_statement "pcVar4 = tbl + iVar5;" (assignment_expression "pcVar4 = tbl + iVar5" identifier = (binary_expression "tbl + iVar5" identifier + identifier)) ;) }) (else_clause "else {\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }" else (compound_statement "{\n          pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);\n          pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;\n        }" { (expression_statement "pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f);" (assignment_expression "pcVar2 = tbl + (*(byte *)((int)src + 2) & 0x3f)" identifier = (binary_expression "tbl + (*(byte *)((int)src + 2) & 0x3f)" identifier + (parenthesized_expression "(*(byte *)((int)src + 2) & 0x3f)" ( (binary_expression "*(byte *)((int)src + 2) & 0x3f" (pointer_expression "*(byte *)((int)src + 2)" * (cast_expression "(byte *)((int)src + 2)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((int)src + 2)" ( (binary_expression "(int)src + 2" (cast_expression "(int)src" ( (type_descriptor "int" primitive_type) ) identifier) + number_literal) )))) & number_literal) )))) ;) (expression_statement "pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5;" (assignment_expression "pcVar4 = tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5" identifier = (binary_expression "tbl + (uint)(*(byte *)((int)src + 2) >> 6) + iVar5" (binary_expression "tbl + (uint)(*(byte *)((int)src + 2) >> 6)" identifier + (call_expression "(uint)(*(byte *)((int)src + 2) >> 6)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "(*(byte *)((int)src + 2) >> 6)" ( (binary_expression "*(byte *)((int)src + 2) >> 6" (pointer_expression "*(byte *)((int)src + 2)" * (cast_expression "(byte *)((int)src + 2)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((int)src + 2)" ( (binary_expression "(int)src + 2" (cast_expression "(int)src" ( (type_descriptor "int" primitive_type) ) identifier) + number_literal) )))) >> number_literal) )))) + identifier)) ;) }))) })) comment (expression_statement "p = pcVar3 + 4;" (assignment_expression "p = pcVar3 + 4" identifier = (binary_expression "pcVar3 + 4" identifier + number_literal)) ;) (expression_statement "*pcVar3 = tbl[*src >> 2];" (assignment_expression "*pcVar3 = tbl[*src >> 2]" (pointer_expression "*pcVar3" * identifier) = (subscript_expression "tbl[*src >> 2]" identifier [ (binary_expression "*src >> 2" (pointer_expression "*src" * identifier) >> number_literal) ])) ;) comment (expression_statement "pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1];" (assignment_expression "pcVar3[1] = tbl[(*src & 3) * 0x10 + uVar1]" (subscript_expression "pcVar3[1]" identifier [ number_literal ]) = (subscript_expression "tbl[(*src & 3) * 0x10 + uVar1]" identifier [ (binary_expression "(*src & 3) * 0x10 + uVar1" (binary_expression "(*src & 3) * 0x10" (parenthesized_expression "(*src & 3)" ( (binary_expression "*src & 3" (pointer_expression "*src" * identifier) & number_literal) )) * number_literal) + identifier) ])) ;) (expression_statement "pcVar3[2] = *pcVar4;" (assignment_expression "pcVar3[2] = *pcVar4" (subscript_expression "pcVar3[2]" identifier [ number_literal ]) = (pointer_expression "*pcVar4" * identifier)) ;) (expression_statement "pcVar3[3] = *pcVar2;" (assignment_expression "pcVar3[3] = *pcVar2" (subscript_expression "pcVar3[3]" identifier [ number_literal ]) = (pointer_expression "*pcVar2" * identifier)) ;) (expression_statement "pcVar3 = p;" (assignment_expression "pcVar3 = p" identifier = identifier) ;) (expression_statement "src = (byte *)((int)src + 3);" (assignment_expression "src = (byte *)((int)src + 3)" identifier = (cast_expression "(byte *)((int)src + 3)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((int)src + 3)" ( (binary_expression "(int)src + 3" (cast_expression "(int)src" ( (type_descriptor "int" primitive_type) ) identifier) + number_literal) )))) ;) }) while (parenthesized_expression "(0 < length)" ( (binary_expression "0 < length" number_literal < identifier) )) ;) })) (expression_statement "*p = '\0';" (assignment_expression "*p = '\0'" (pointer_expression "*p" * identifier) = (char_literal "'\0'" ' escape_sequence ')) ;) (if_statement "if (length != 0) {\n    pcVar3 = p + length;\n    do {\n      p = p + -1;\n      *p = tbl[0x40];\n    } while (p != pcVar3);\n  }" if (parenthesized_expression "(length != 0)" ( (binary_expression "length != 0" identifier != number_literal) )) (compound_statement "{\n    pcVar3 = p + length;\n    do {\n      p = p + -1;\n      *p = tbl[0x40];\n    } while (p != pcVar3);\n  }" { (expression_statement "pcVar3 = p + length;" (assignment_expression "pcVar3 = p + length" identifier = (binary_expression "p + length" identifier + identifier)) ;) (do_statement "do {\n      p = p + -1;\n      *p = tbl[0x40];\n    } while (p != pcVar3);" do (compound_statement "{\n      p = p + -1;\n      *p = tbl[0x40];\n    }" { (expression_statement "p = p + -1;" (assignment_expression "p = p + -1" identifier = (binary_expression "p + -1" identifier + number_literal)) ;) (expression_statement "*p = tbl[0x40];" (assignment_expression "*p = tbl[0x40]" (pointer_expression "*p" * identifier) = (subscript_expression "tbl[0x40]" identifier [ number_literal ])) ;) }) while (parenthesized_expression "(p != pcVar3)" ( (binary_expression "p != pcVar3" identifier != identifier) )) ;) })) (return_statement "return;" return ;) })))
(translation_unit "void FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)\n\n{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}\n\n" (function_definition "void FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)\n\n{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}" primitive_type (function_declarator "FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)" identifier (parameter_list "(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)" ( (parameter_declaration "undefined1 *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "byte *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int param_3" primitive_type identifier) , (parameter_declaration "undefined1 *param_4" type_identifier (pointer_declarator "*param_4" * identifier)) ))) (compound_statement "{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "undefined1 *puVar2;" type_identifier (pointer_declarator "*puVar2" * identifier) ;) (declaration "undefined1 *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (declaration "undefined1 *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "int iVar5;" primitive_type identifier ;) (expression_statement "puVar3 = param_1;" (assignment_expression "puVar3 = param_1" identifier = identifier) ;) (if_statement "if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }" if (parenthesized_expression "(0 < param_3)" ( (binary_expression "0 < param_3" number_literal < identifier) )) (compound_statement "{\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }" { (do_statement "do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);" do (compound_statement "{\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    }" { (expression_statement "param_3 = param_3 + -3;" (assignment_expression "param_3 = param_3 + -3" identifier = (binary_expression "param_3 + -3" identifier + number_literal)) ;) (expression_statement "uVar1 = 0;" (assignment_expression "uVar1 = 0" identifier = number_literal) ;) (expression_statement "puVar2 = param_4;" (assignment_expression "puVar2 = param_4" identifier = identifier) ;) (expression_statement "puVar4 = param_4;" (assignment_expression "puVar4 = param_4" identifier = identifier) ;) (if_statement "if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }" if (parenthesized_expression "(param_3 != -2)" ( (binary_expression "param_3 != -2" identifier != number_literal) )) (compound_statement "{\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }" { (expression_statement "uVar1 = (uint)(param_2[1] >> 4);" (assignment_expression "uVar1 = (uint)(param_2[1] >> 4)" identifier = (call_expression "(uint)(param_2[1] >> 4)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "(param_2[1] >> 4)" ( (binary_expression "param_2[1] >> 4" (subscript_expression "param_2[1]" identifier [ number_literal ]) >> number_literal) )))) ;) (expression_statement "iVar5 = (param_2[1] & 0xf) * 4;" (assignment_expression "iVar5 = (param_2[1] & 0xf) * 4" identifier = (binary_expression "(param_2[1] & 0xf) * 4" (parenthesized_expression "(param_2[1] & 0xf)" ( (binary_expression "param_2[1] & 0xf" (subscript_expression "param_2[1]" identifier [ number_literal ]) & number_literal) )) * number_literal)) ;) (if_statement "if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" if (parenthesized_expression "(param_3 == -1)" ( (binary_expression "param_3 == -1" identifier == number_literal) )) (compound_statement "{\n          puVar4 = param_4 + iVar5;\n        }" { (expression_statement "puVar4 = param_4 + iVar5;" (assignment_expression "puVar4 = param_4 + iVar5" identifier = (binary_expression "param_4 + iVar5" identifier + identifier)) ;) }) (else_clause "else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" else (compound_statement "{\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" { (expression_statement "puVar2 = param_4 + (param_2[2] & 0x3f);" (assignment_expression "puVar2 = param_4 + (param_2[2] & 0x3f)" identifier = (binary_expression "param_4 + (param_2[2] & 0x3f)" identifier + (parenthesized_expression "(param_2[2] & 0x3f)" ( (binary_expression "param_2[2] & 0x3f" (subscript_expression "param_2[2]" identifier [ number_literal ]) & number_literal) )))) ;) (expression_statement "puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;" (assignment_expression "puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5" identifier = (binary_expression "param_4 + (uint)(param_2[2] >> 6) + iVar5" (binary_expression "param_4 + (uint)(param_2[2] >> 6)" identifier + (call_expression "(uint)(param_2[2] >> 6)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "(param_2[2] >> 6)" ( (binary_expression "param_2[2] >> 6" (subscript_expression "param_2[2]" identifier [ number_literal ]) >> number_literal) )))) + identifier)) ;) }))) })) (expression_statement "param_1 = puVar3 + 4;" (assignment_expression "param_1 = puVar3 + 4" identifier = (binary_expression "puVar3 + 4" identifier + number_literal)) ;) (expression_statement "*puVar3 = param_4[*param_2 >> 2];" (assignment_expression "*puVar3 = param_4[*param_2 >> 2]" (pointer_expression "*puVar3" * identifier) = (subscript_expression "param_4[*param_2 >> 2]" identifier [ (binary_expression "*param_2 >> 2" (pointer_expression "*param_2" * identifier) >> number_literal) ])) ;) (expression_statement "puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];" (assignment_expression "puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1]" (subscript_expression "puVar3[1]" identifier [ number_literal ]) = (subscript_expression "param_4[(*param_2 & 3) * 0x10 + uVar1]" identifier [ (binary_expression "(*param_2 & 3) * 0x10 + uVar1" (binary_expression "(*param_2 & 3) * 0x10" (parenthesized_expression "(*param_2 & 3)" ( (binary_expression "*param_2 & 3" (pointer_expression "*param_2" * identifier) & number_literal) )) * number_literal) + identifier) ])) ;) (expression_statement "puVar3[2] = *puVar4;" (assignment_expression "puVar3[2] = *puVar4" (subscript_expression "puVar3[2]" identifier [ number_literal ]) = (pointer_expression "*puVar4" * identifier)) ;) (expression_statement "puVar3[3] = *puVar2;" (assignment_expression "puVar3[3] = *puVar2" (subscript_expression "puVar3[3]" identifier [ number_literal ]) = (pointer_expression "*puVar2" * identifier)) ;) (expression_statement "puVar3 = param_1;" (assignment_expression "puVar3 = param_1" identifier = identifier) ;) (expression_statement "param_2 = param_2 + 3;" (assignment_expression "param_2 = param_2 + 3" identifier = (binary_expression "param_2 + 3" identifier + number_literal)) ;) }) while (parenthesized_expression "(0 < param_3)" ( (binary_expression "0 < param_3" number_literal < identifier) )) ;) })) (expression_statement "*param_1 = 0;" (assignment_expression "*param_1 = 0" (pointer_expression "*param_1" * identifier) = number_literal) ;) (if_statement "if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }" if (parenthesized_expression "(param_3 != 0)" ( (binary_expression "param_3 != 0" identifier != number_literal) )) (compound_statement "{\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }" { (expression_statement "puVar3 = param_1 + param_3;" (assignment_expression "puVar3 = param_1 + param_3" identifier = (binary_expression "param_1 + param_3" identifier + identifier)) ;) (do_statement "do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);" do (compound_statement "{\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    }" { (expression_statement "param_1 = param_1 + -1;" (assignment_expression "param_1 = param_1 + -1" identifier = (binary_expression "param_1 + -1" identifier + number_literal)) ;) (expression_statement "*param_1 = param_4[0x40];" (assignment_expression "*param_1 = param_4[0x40]" (pointer_expression "*param_1" * identifier) = (subscript_expression "param_4[0x40]" identifier [ number_literal ])) ;) }) while (parenthesized_expression "(param_1 != puVar3)" ( (binary_expression "param_1 != puVar3" identifier != identifier) )) ;) })) (return_statement "return;" return ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE (pointer_declarator * IDENT)) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression (subscript_expression IDENT [ LIT ]) >> LIT) )))) ;) (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) & LIT) )) * LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) & LIT) )))) ;) (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression IDENT + (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression (subscript_expression IDENT [ LIT ]) >> LIT) )))) + IDENT)) ;) }))) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (subscript_expression IDENT [ (binary_expression (pointer_expression * IDENT) >> LIT) ])) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (subscript_expression IDENT [ (binary_expression (binary_expression (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) & LIT) )) * LIT) + IDENT) ])) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression LIT < IDENT) )) ;) })) (expression_statement (assignment_expression (pointer_expression * IDENT) = LIT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (subscript_expression IDENT [ LIT ])) ;) }) while (parenthesized_expression ( (binary_expression IDENT != IDENT) )) ;) })) (return_statement return ;) })))
(function_definition "void FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)\n\n{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}" (primitive_type "void") (function_declarator "FUN_000fa3d8(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)" (identifier "FUN_000fa3d8") (parameter_list "(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)" (( "(") (parameter_declaration "undefined1 *param_1" (type_identifier "undefined1") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "byte *param_2" (type_identifier "byte") (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) (, ",") (parameter_declaration "int param_3" (primitive_type "int") (identifier "param_3")) (, ",") (parameter_declaration "undefined1 *param_4" (type_identifier "undefined1") (pointer_declarator "*param_4" (* "*") (identifier "param_4"))) () ")"))) (compound_statement "{\n  uint uVar1;\n  undefined1 *puVar2;\n  undefined1 *puVar3;\n  undefined1 *puVar4;\n  int iVar5;\n  \n  puVar3 = param_1;\n  if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }\n  *param_1 = 0;\n  if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }\n  return;\n}" ({ "{") (declaration "uint uVar1;" (type_identifier "uint") (identifier "uVar1") (; ";")) (declaration "undefined1 *puVar2;" (type_identifier "undefined1") (pointer_declarator "*puVar2" (* "*") (identifier "puVar2")) (; ";")) (declaration "undefined1 *puVar3;" (type_identifier "undefined1") (pointer_declarator "*puVar3" (* "*") (identifier "puVar3")) (; ";")) (declaration "undefined1 *puVar4;" (type_identifier "undefined1") (pointer_declarator "*puVar4" (* "*") (identifier "puVar4")) (; ";")) (declaration "int iVar5;" (primitive_type "int") (identifier "iVar5") (; ";")) (expression_statement "puVar3 = param_1;" (assignment_expression "puVar3 = param_1" (identifier "puVar3") (= "=") (identifier "param_1")) (; ";")) (if_statement "if (0 < param_3) {\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }" (if "if") (parenthesized_expression "(0 < param_3)" (( "(") (binary_expression "0 < param_3" (number_literal "0") (< "<") (identifier "param_3")) () ")")) (compound_statement "{\n    do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);\n  }" ({ "{") (do_statement "do {\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    } while (0 < param_3);" (do "do") (compound_statement "{\n      param_3 = param_3 + -3;\n      uVar1 = 0;\n      puVar2 = param_4;\n      puVar4 = param_4;\n      if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }\n      param_1 = puVar3 + 4;\n      *puVar3 = param_4[*param_2 >> 2];\n      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];\n      puVar3[2] = *puVar4;\n      puVar3[3] = *puVar2;\n      puVar3 = param_1;\n      param_2 = param_2 + 3;\n    }" ({ "{") (expression_statement "param_3 = param_3 + -3;" (assignment_expression "param_3 = param_3 + -3" (identifier "param_3") (= "=") (binary_expression "param_3 + -3" (identifier "param_3") (+ "+") (number_literal "-3"))) (; ";")) (expression_statement "uVar1 = 0;" (assignment_expression "uVar1 = 0" (identifier "uVar1") (= "=") (number_literal "0")) (; ";")) (expression_statement "puVar2 = param_4;" (assignment_expression "puVar2 = param_4" (identifier "puVar2") (= "=") (identifier "param_4")) (; ";")) (expression_statement "puVar4 = param_4;" (assignment_expression "puVar4 = param_4" (identifier "puVar4") (= "=") (identifier "param_4")) (; ";")) (if_statement "if (param_3 != -2) {\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }" (if "if") (parenthesized_expression "(param_3 != -2)" (( "(") (binary_expression "param_3 != -2" (identifier "param_3") (!= "!=") (number_literal "-2")) () ")")) (compound_statement "{\n        uVar1 = (uint)(param_2[1] >> 4);\n        iVar5 = (param_2[1] & 0xf) * 4;\n        if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }\n      }" ({ "{") (expression_statement "uVar1 = (uint)(param_2[1] >> 4);" (assignment_expression "uVar1 = (uint)(param_2[1] >> 4)" (identifier "uVar1") (= "=") (call_expression "(uint)(param_2[1] >> 4)" (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")")) (argument_list "(param_2[1] >> 4)" (( "(") (binary_expression "param_2[1] >> 4" (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]")) (>> ">>") (number_literal "4")) () ")")))) (; ";")) (expression_statement "iVar5 = (param_2[1] & 0xf) * 4;" (assignment_expression "iVar5 = (param_2[1] & 0xf) * 4" (identifier "iVar5") (= "=") (binary_expression "(param_2[1] & 0xf) * 4" (parenthesized_expression "(param_2[1] & 0xf)" (( "(") (binary_expression "param_2[1] & 0xf" (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]")) (& "&") (number_literal "0xf")) () ")")) (* "*") (number_literal "4"))) (; ";")) (if_statement "if (param_3 == -1) {\n          puVar4 = param_4 + iVar5;\n        }\n        else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" (if "if") (parenthesized_expression "(param_3 == -1)" (( "(") (binary_expression "param_3 == -1" (identifier "param_3") (== "==") (number_literal "-1")) () ")")) (compound_statement "{\n          puVar4 = param_4 + iVar5;\n        }" ({ "{") (expression_statement "puVar4 = param_4 + iVar5;" (assignment_expression "puVar4 = param_4 + iVar5" (identifier "puVar4") (= "=") (binary_expression "param_4 + iVar5" (identifier "param_4") (+ "+") (identifier "iVar5"))) (; ";")) (} "}")) (else_clause "else {\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" (else "else") (compound_statement "{\n          puVar2 = param_4 + (param_2[2] & 0x3f);\n          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;\n        }" ({ "{") (expression_statement "puVar2 = param_4 + (param_2[2] & 0x3f);" (assignment_expression "puVar2 = param_4 + (param_2[2] & 0x3f)" (identifier "puVar2") (= "=") (binary_expression "param_4 + (param_2[2] & 0x3f)" (identifier "param_4") (+ "+") (parenthesized_expression "(param_2[2] & 0x3f)" (( "(") (binary_expression "param_2[2] & 0x3f" (subscript_expression "param_2[2]" (identifier "param_2") ([ "[") (number_literal "2") (] "]")) (& "&") (number_literal "0x3f")) () ")")))) (; ";")) (expression_statement "puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;" (assignment_expression "puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5" (identifier "puVar4") (= "=") (binary_expression "param_4 + (uint)(param_2[2] >> 6) + iVar5" (binary_expression "param_4 + (uint)(param_2[2] >> 6)" (identifier "param_4") (+ "+") (call_expression "(uint)(param_2[2] >> 6)" (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")")) (argument_list "(param_2[2] >> 6)" (( "(") (binary_expression "param_2[2] >> 6" (subscript_expression "param_2[2]" (identifier "param_2") ([ "[") (number_literal "2") (] "]")) (>> ">>") (number_literal "6")) () ")")))) (+ "+") (identifier "iVar5"))) (; ";")) (} "}")))) (} "}"))) (expression_statement "param_1 = puVar3 + 4;" (assignment_expression "param_1 = puVar3 + 4" (identifier "param_1") (= "=") (binary_expression "puVar3 + 4" (identifier "puVar3") (+ "+") (number_literal "4"))) (; ";")) (expression_statement "*puVar3 = param_4[*param_2 >> 2];" (assignment_expression "*puVar3 = param_4[*param_2 >> 2]" (pointer_expression "*puVar3" (* "*") (identifier "puVar3")) (= "=") (subscript_expression "param_4[*param_2 >> 2]" (identifier "param_4") ([ "[") (binary_expression "*param_2 >> 2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (>> ">>") (number_literal "2")) (] "]"))) (; ";")) (expression_statement "puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];" (assignment_expression "puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1]" (subscript_expression "puVar3[1]" (identifier "puVar3") ([ "[") (number_literal "1") (] "]")) (= "=") (subscript_expression "param_4[(*param_2 & 3) * 0x10 + uVar1]" (identifier "param_4") ([ "[") (binary_expression "(*param_2 & 3) * 0x10 + uVar1" (binary_expression "(*param_2 & 3) * 0x10" (parenthesized_expression "(*param_2 & 3)" (( "(") (binary_expression "*param_2 & 3" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (& "&") (number_literal "3")) () ")")) (* "*") (number_literal "0x10")) (+ "+") (identifier "uVar1")) (] "]"))) (; ";")) (expression_statement "puVar3[2] = *puVar4;" (assignment_expression "puVar3[2] = *puVar4" (subscript_expression "puVar3[2]" (identifier "puVar3") ([ "[") (number_literal "2") (] "]")) (= "=") (pointer_expression "*puVar4" (* "*") (identifier "puVar4"))) (; ";")) (expression_statement "puVar3[3] = *puVar2;" (assignment_expression "puVar3[3] = *puVar2" (subscript_expression "puVar3[3]" (identifier "puVar3") ([ "[") (number_literal "3") (] "]")) (= "=") (pointer_expression "*puVar2" (* "*") (identifier "puVar2"))) (; ";")) (expression_statement "puVar3 = param_1;" (assignment_expression "puVar3 = param_1" (identifier "puVar3") (= "=") (identifier "param_1")) (; ";")) (expression_statement "param_2 = param_2 + 3;" (assignment_expression "param_2 = param_2 + 3" (identifier "param_2") (= "=") (binary_expression "param_2 + 3" (identifier "param_2") (+ "+") (number_literal "3"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(0 < param_3)" (( "(") (binary_expression "0 < param_3" (number_literal "0") (< "<") (identifier "param_3")) () ")")) (; ";")) (} "}"))) (expression_statement "*param_1 = 0;" (assignment_expression "*param_1 = 0" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (= "=") (number_literal "0")) (; ";")) (if_statement "if (param_3 != 0) {\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }" (if "if") (parenthesized_expression "(param_3 != 0)" (( "(") (binary_expression "param_3 != 0" (identifier "param_3") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    puVar3 = param_1 + param_3;\n    do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);\n  }" ({ "{") (expression_statement "puVar3 = param_1 + param_3;" (assignment_expression "puVar3 = param_1 + param_3" (identifier "puVar3") (= "=") (binary_expression "param_1 + param_3" (identifier "param_1") (+ "+") (identifier "param_3"))) (; ";")) (do_statement "do {\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    } while (param_1 != puVar3);" (do "do") (compound_statement "{\n      param_1 = param_1 + -1;\n      *param_1 = param_4[0x40];\n    }" ({ "{") (expression_statement "param_1 = param_1 + -1;" (assignment_expression "param_1 = param_1 + -1" (identifier "param_1") (= "=") (binary_expression "param_1 + -1" (identifier "param_1") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "*param_1 = param_4[0x40];" (assignment_expression "*param_1 = param_4[0x40]" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (= "=") (subscript_expression "param_4[0x40]" (identifier "param_4") ([ "[") (number_literal "0x40") (] "]"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(param_1 != puVar3)" (( "(") (binary_expression "param_1 != puVar3" (identifier "param_1") (!= "!=") (identifier "puVar3")) () ")")) (; ";")) (} "}"))) (return_statement "return;" (return "return") (; ";")) (} "}")))
(translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (primitive_type) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator 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: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (compound_statement (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier))))) alternative: (else_clause (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (identifier) right: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))))) right: (identifier))))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (subscript_expression argument: (identifier) index: (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal))))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (subscript_expression argument: (identifier) index: (binary_expression left: (binary_expression left: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal))) right: (number_literal)) right: (identifier))))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier)))))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (number_literal))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (subscript_expression argument: (identifier) index: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier)))))) (return_statement))))

void MASKED(undefined1 *param_1,byte *param_2,int param_3,undefined1 *param_4)

{
  uint uVar1;
  undefined1 *puVar2;
  undefined1 *puVar3;
  undefined1 *puVar4;
  int iVar5;
  
  puVar3 = param_1;
  if (0 < param_3) {
    do {
      param_3 = param_3 + -3;
      uVar1 = 0;
      puVar2 = param_4;
      puVar4 = param_4;
      if (param_3 != -2) {
        uVar1 = (uint)(param_2[1] >> 4);
        iVar5 = (param_2[1] & 0xf) * 4;
        if (param_3 == -1) {
          puVar4 = param_4 + iVar5;
        }
        else {
          puVar2 = param_4 + (param_2[2] & 0x3f);
          puVar4 = param_4 + (uint)(param_2[2] >> 6) + iVar5;
        }
      }
      param_1 = puVar3 + 4;
      *puVar3 = param_4[*param_2 >> 2];
      puVar3[1] = param_4[(*param_2 & 3) * 0x10 + uVar1];
      puVar3[2] = *puVar4;
      puVar3[3] = *puVar2;
      puVar3 = param_1;
      param_2 = param_2 + 3;
    } while (0 < param_3);
  }
  *param_1 = 0;
  if (param_3 != 0) {
    puVar3 = param_1 + param_3;
    do {
      param_1 = param_1 + -1;
      *param_1 = param_4[0x40];
    } while (param_1 != puVar3);
  }
  return;
}

