
void __regparm3 chacha20_encrypt(chacha20 *ctx,uchar *blk,int len)

{
  int iVar1;
  byte *pbVar2;
  
  if (len == 0) {
    return;
  }
  iVar1 = ctx->currentIndex;
LAB_00044918:
  do {
    pbVar2 = blk;
    if (0x3f < iVar1) {
      chacha20_round(ctx);
      iVar1 = ctx->currentIndex;
      if (0x3f < iVar1) goto LAB_00044918;
    }
    while( true ) {
      blk = pbVar2 + 1;
      len = len + -1;
      ctx->currentIndex = iVar1 + 1;
      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];
      iVar1 = ctx->currentIndex;
      if (0x3f < iVar1) break;
      pbVar2 = blk;
      if (len == 0) {
        return;
      }
    }
    if (len == 0) {
      return;
    }
  } while( true );
}



void __regparm3 FUN_00044900(int param_1,byte *param_2,int param_3)

{
  int iVar1;
  byte *pbVar2;
  
  if (param_3 == 0) {
    return;
  }
  iVar1 = *(int *)(param_1 + 0x80);
LAB_00044918:
  do {
    pbVar2 = param_2;
    if (0x3f < iVar1) {
      FUN_00044580();
      iVar1 = *(int *)(param_1 + 0x80);
      if (0x3f < iVar1) goto LAB_00044918;
    }
    while( true ) {
      param_2 = pbVar2 + 1;
      param_3 = param_3 + -1;
      *(int *)(param_1 + 0x80) = iVar1 + 1;
      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);
      iVar1 = *(int *)(param_1 + 0x80);
      if (0x3f < iVar1) break;
      pbVar2 = param_2;
      if (param_3 == 0) {
        return;
      }
    }
    if (param_3 == 0) {
      return;
    }
  } while( true );
}


PUSH EDI
PUSH ESI
PUSH EBX
TEST ECX,ECX
JZ 0x0004494a
MOV ESI,EAX
MOV EAX,dword ptr [EAX + 0x80]
MOV EBX,EDX
MOV EDI,ECX
LEA ESI,[ESI]
NOP
CMP EAX,0x3f
JLE 0x00044924
JMP 0x00044950
TEST EDI,EDI
JZ 0x0004494a
LEA EDX,[EAX + 0x1]
ADD EBX,0x1
SUB EDI,0x1
MOV dword ptr [ESI + 0x80],EDX
MOVZX EAX,byte ptr [ESI + EAX*0x1 + 0x40]
XOR byte ptr [EBX + -0x1],AL
MOV EAX,dword ptr [ESI + 0x80]
CMP EAX,0x3f
JLE 0x00044920
TEST EDI,EDI
JNZ 0x00044918
POP EBX
POP ESI
POP EDI
RET
MOV EAX,ESI
CALL 0x00044580
MOV EAX,dword ptr [ESI + 0x80]
CMP EAX,0x3f
JLE 0x00044924
JMP 0x00044918
(translation_unit "void __regparm3 FUN_00044900(int param_1,byte *param_2,int param_3)\n\n{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}\n\n" (function_definition "void __regparm3 FUN_00044900(int param_1,byte *param_2,int param_3)\n\n{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}" primitive_type (ERROR "__regparm3" identifier) (function_declarator "FUN_00044900(int param_1,byte *param_2,int param_3)" identifier (parameter_list "(int param_1,byte *param_2,int param_3)" ( (parameter_declaration "int param_1" primitive_type identifier) , (parameter_declaration "byte *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int param_3" primitive_type identifier) ))) (compound_statement "{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "byte *pbVar2;" type_identifier (pointer_declarator "*pbVar2" * identifier) ;) (if_statement "if (param_3 == 0) {\n    return;\n  }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n    return;\n  }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (labeled_statement "LAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );" statement_identifier : (do_statement "do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );" do (compound_statement "{\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  }" { (expression_statement "pbVar2 = param_2;" (assignment_expression "pbVar2 = param_2" identifier = identifier) ;) (if_statement "if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (compound_statement "{\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" { (expression_statement "FUN_00044580();" (call_expression "FUN_00044580()" identifier (argument_list "()" ( ))) ;) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (if_statement "if (0x3f < iVar1) goto LAB_00044918;" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (goto_statement "goto LAB_00044918;" goto statement_identifier ;)) })) (while_statement "while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }" { (expression_statement "param_2 = pbVar2 + 1;" (assignment_expression "param_2 = pbVar2 + 1" identifier = (binary_expression "pbVar2 + 1" identifier + number_literal)) ;) (expression_statement "param_3 = param_3 + -1;" (assignment_expression "param_3 = param_3 + -1" identifier = (binary_expression "param_3 + -1" identifier + number_literal)) ;) (expression_statement "*(int *)(param_1 + 0x80) = iVar1 + 1;" (assignment_expression "*(int *)(param_1 + 0x80) = iVar1 + 1" (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) = (binary_expression "iVar1 + 1" identifier + number_literal)) ;) (expression_statement "*pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);" (assignment_expression "*pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1)" (pointer_expression "*pbVar2" * identifier) = (binary_expression "*pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1)" (pointer_expression "*pbVar2" * identifier) ^ (pointer_expression "*(byte *)(param_1 + 0x40 + iVar1)" * (cast_expression "(byte *)(param_1 + 0x40 + iVar1)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x40 + iVar1)" ( (binary_expression "param_1 + 0x40 + iVar1" (binary_expression "param_1 + 0x40" identifier + number_literal) + identifier) )))))) ;) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (if_statement "if (0x3f < iVar1) break;" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (break_statement "break;" break ;)) (expression_statement "pbVar2 = param_2;" (assignment_expression "pbVar2 = param_2" identifier = identifier) ;) (if_statement "if (param_3 == 0) {\n        return;\n      }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n        return;\n      }" { (return_statement "return;" return ;) })) })) (if_statement "if (param_3 == 0) {\n      return;\n    }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n      return;\n    }" { (return_statement "return;" return ;) })) }) while (parenthesized_expression "( true )" ( true )) ;)) })))
(translation_unit "void __regparm3 chacha20_encrypt(chacha20 *ctx,uchar *blk,int len)\n\n{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (len == 0) {\n    return;\n  }\n  iVar1 = ctx->currentIndex;\nLAB_00044918:\n  do {\n    pbVar2 = blk;\n    if (0x3f < iVar1) {\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }\n    if (len == 0) {\n      return;\n    }\n  } while( true );\n}\n\n" (function_definition "void __regparm3 chacha20_encrypt(chacha20 *ctx,uchar *blk,int len)\n\n{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (len == 0) {\n    return;\n  }\n  iVar1 = ctx->currentIndex;\nLAB_00044918:\n  do {\n    pbVar2 = blk;\n    if (0x3f < iVar1) {\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }\n    if (len == 0) {\n      return;\n    }\n  } while( true );\n}" primitive_type (ERROR "__regparm3" identifier) (function_declarator "chacha20_encrypt(chacha20 *ctx,uchar *blk,int len)" identifier (parameter_list "(chacha20 *ctx,uchar *blk,int len)" ( (parameter_declaration "chacha20 *ctx" type_identifier (pointer_declarator "*ctx" * identifier)) , (parameter_declaration "uchar *blk" type_identifier (pointer_declarator "*blk" * identifier)) , (parameter_declaration "int len" primitive_type identifier) ))) (compound_statement "{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (len == 0) {\n    return;\n  }\n  iVar1 = ctx->currentIndex;\nLAB_00044918:\n  do {\n    pbVar2 = blk;\n    if (0x3f < iVar1) {\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }\n    if (len == 0) {\n      return;\n    }\n  } while( true );\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "byte *pbVar2;" type_identifier (pointer_declarator "*pbVar2" * identifier) ;) (if_statement "if (len == 0) {\n    return;\n  }" if (parenthesized_expression "(len == 0)" ( (binary_expression "len == 0" identifier == number_literal) )) (compound_statement "{\n    return;\n  }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = ctx->currentIndex;" (assignment_expression "iVar1 = ctx->currentIndex" identifier = (field_expression "ctx->currentIndex" identifier -> field_identifier)) ;) (labeled_statement "LAB_00044918:\n  do {\n    pbVar2 = blk;\n    if (0x3f < iVar1) {\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }\n    if (len == 0) {\n      return;\n    }\n  } while( true );" statement_identifier : (do_statement "do {\n    pbVar2 = blk;\n    if (0x3f < iVar1) {\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }\n    if (len == 0) {\n      return;\n    }\n  } while( true );" do (compound_statement "{\n    pbVar2 = blk;\n    if (0x3f < iVar1) {\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }\n    if (len == 0) {\n      return;\n    }\n  }" { (expression_statement "pbVar2 = blk;" (assignment_expression "pbVar2 = blk" identifier = identifier) ;) (if_statement "if (0x3f < iVar1) {\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (compound_statement "{\n      chacha20_round(ctx);\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" { (expression_statement "chacha20_round(ctx);" (call_expression "chacha20_round(ctx)" identifier (argument_list "(ctx)" ( identifier ))) ;) (expression_statement "iVar1 = ctx->currentIndex;" (assignment_expression "iVar1 = ctx->currentIndex" identifier = (field_expression "ctx->currentIndex" identifier -> field_identifier)) ;) (if_statement "if (0x3f < iVar1) goto LAB_00044918;" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (goto_statement "goto LAB_00044918;" goto statement_identifier ;)) })) (while_statement "while( true ) {\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n      blk = pbVar2 + 1;\n      len = len + -1;\n      ctx->currentIndex = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ ctx->current[iVar1];\n      iVar1 = ctx->currentIndex;\n      if (0x3f < iVar1) break;\n      pbVar2 = blk;\n      if (len == 0) {\n        return;\n      }\n    }" { (expression_statement "blk = pbVar2 + 1;" (assignment_expression "blk = pbVar2 + 1" identifier = (binary_expression "pbVar2 + 1" identifier + number_literal)) ;) (expression_statement "len = len + -1;" (assignment_expression "len = len + -1" identifier = (binary_expression "len + -1" identifier + number_literal)) ;) (expression_statement "ctx->currentIndex = iVar1 + 1;" (assignment_expression "ctx->currentIndex = iVar1 + 1" (field_expression "ctx->currentIndex" identifier -> field_identifier) = (binary_expression "iVar1 + 1" identifier + number_literal)) ;) (expression_statement "*pbVar2 = *pbVar2 ^ ctx->current[iVar1];" (assignment_expression "*pbVar2 = *pbVar2 ^ ctx->current[iVar1]" (pointer_expression "*pbVar2" * identifier) = (binary_expression "*pbVar2 ^ ctx->current[iVar1]" (pointer_expression "*pbVar2" * identifier) ^ (subscript_expression "ctx->current[iVar1]" (field_expression "ctx->current" identifier -> field_identifier) [ identifier ]))) ;) (expression_statement "iVar1 = ctx->currentIndex;" (assignment_expression "iVar1 = ctx->currentIndex" identifier = (field_expression "ctx->currentIndex" identifier -> field_identifier)) ;) (if_statement "if (0x3f < iVar1) break;" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (break_statement "break;" break ;)) (expression_statement "pbVar2 = blk;" (assignment_expression "pbVar2 = blk" identifier = identifier) ;) (if_statement "if (len == 0) {\n        return;\n      }" if (parenthesized_expression "(len == 0)" ( (binary_expression "len == 0" identifier == number_literal) )) (compound_statement "{\n        return;\n      }" { (return_statement "return;" return ;) })) })) (if_statement "if (len == 0) {\n      return;\n    }" if (parenthesized_expression "(len == 0)" ( (binary_expression "len == 0" identifier == number_literal) )) (compound_statement "{\n      return;\n    }" { (return_statement "return;" return ;) })) }) while (parenthesized_expression "( true )" ( true )) ;)) })))
(translation_unit "void __regparm3 FUN_00044900(int param_1,byte *param_2,int param_3)\n\n{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}\n\n" (function_definition "void __regparm3 FUN_00044900(int param_1,byte *param_2,int param_3)\n\n{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}" primitive_type (ERROR "__regparm3" identifier) (function_declarator "FUN_00044900(int param_1,byte *param_2,int param_3)" identifier (parameter_list "(int param_1,byte *param_2,int param_3)" ( (parameter_declaration "int param_1" primitive_type identifier) , (parameter_declaration "byte *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int param_3" primitive_type identifier) ))) (compound_statement "{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}" { (declaration "int iVar1;" primitive_type identifier ;) (declaration "byte *pbVar2;" type_identifier (pointer_declarator "*pbVar2" * identifier) ;) (if_statement "if (param_3 == 0) {\n    return;\n  }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n    return;\n  }" { (return_statement "return;" return ;) })) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (labeled_statement "LAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );" statement_identifier : (do_statement "do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );" do (compound_statement "{\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  }" { (expression_statement "pbVar2 = param_2;" (assignment_expression "pbVar2 = param_2" identifier = identifier) ;) (if_statement "if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (compound_statement "{\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" { (expression_statement "FUN_00044580();" (call_expression "FUN_00044580()" identifier (argument_list "()" ( ))) ;) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (if_statement "if (0x3f < iVar1) goto LAB_00044918;" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (goto_statement "goto LAB_00044918;" goto statement_identifier ;)) })) (while_statement "while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }" while (parenthesized_expression "( true )" ( true )) (compound_statement "{\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }" { (expression_statement "param_2 = pbVar2 + 1;" (assignment_expression "param_2 = pbVar2 + 1" identifier = (binary_expression "pbVar2 + 1" identifier + number_literal)) ;) (expression_statement "param_3 = param_3 + -1;" (assignment_expression "param_3 = param_3 + -1" identifier = (binary_expression "param_3 + -1" identifier + number_literal)) ;) (expression_statement "*(int *)(param_1 + 0x80) = iVar1 + 1;" (assignment_expression "*(int *)(param_1 + 0x80) = iVar1 + 1" (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) )))) = (binary_expression "iVar1 + 1" identifier + number_literal)) ;) (expression_statement "*pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);" (assignment_expression "*pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1)" (pointer_expression "*pbVar2" * identifier) = (binary_expression "*pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1)" (pointer_expression "*pbVar2" * identifier) ^ (pointer_expression "*(byte *)(param_1 + 0x40 + iVar1)" * (cast_expression "(byte *)(param_1 + 0x40 + iVar1)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x40 + iVar1)" ( (binary_expression "param_1 + 0x40 + iVar1" (binary_expression "param_1 + 0x40" identifier + number_literal) + identifier) )))))) ;) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" identifier = (pointer_expression "*(int *)(param_1 + 0x80)" * (cast_expression "(int *)(param_1 + 0x80)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x80)" ( (binary_expression "param_1 + 0x80" identifier + number_literal) ))))) ;) (if_statement "if (0x3f < iVar1) break;" if (parenthesized_expression "(0x3f < iVar1)" ( (binary_expression "0x3f < iVar1" number_literal < identifier) )) (break_statement "break;" break ;)) (expression_statement "pbVar2 = param_2;" (assignment_expression "pbVar2 = param_2" identifier = identifier) ;) (if_statement "if (param_3 == 0) {\n        return;\n      }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n        return;\n      }" { (return_statement "return;" return ;) })) })) (if_statement "if (param_3 == 0) {\n      return;\n    }" if (parenthesized_expression "(param_3 == 0)" ( (binary_expression "param_3 == 0" identifier == number_literal) )) (compound_statement "{\n      return;\n    }" { (return_statement "return;" return ;) })) }) while (parenthesized_expression "( true )" ( true )) ;)) })))
(translation_unit (function_definition TYPE (ERROR IDENT) (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (return_statement return ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (labeled_statement statement_identifier : (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( ))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (goto_statement goto statement_identifier ;)) })) (while_statement while (parenthesized_expression ( BOOL )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_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) )))) = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression (pointer_expression * IDENT) ^ (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (binary_expression IDENT + LIT) + IDENT) )))))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (break_statement break ;)) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (return_statement return ;) })) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (return_statement return ;) })) }) while (parenthesized_expression ( BOOL )) ;)) })))
(function_definition "void __regparm3 FUN_00044900(int param_1,byte *param_2,int param_3)\n\n{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}" (primitive_type "void") (ERROR "__regparm3" (identifier "__regparm3")) (function_declarator "FUN_00044900(int param_1,byte *param_2,int param_3)" (identifier "FUN_00044900") (parameter_list "(int param_1,byte *param_2,int param_3)" (( "(") (parameter_declaration "int param_1" (primitive_type "int") (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")) () ")"))) (compound_statement "{\n  int iVar1;\n  byte *pbVar2;\n  \n  if (param_3 == 0) {\n    return;\n  }\n  iVar1 = *(int *)(param_1 + 0x80);\nLAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );\n}" ({ "{") (declaration "int iVar1;" (primitive_type "int") (identifier "iVar1") (; ";")) (declaration "byte *pbVar2;" (type_identifier "byte") (pointer_declarator "*pbVar2" (* "*") (identifier "pbVar2")) (; ";")) (if_statement "if (param_3 == 0) {\n    return;\n  }" (if "if") (parenthesized_expression "(param_3 == 0)" (( "(") (binary_expression "param_3 == 0" (identifier "param_3") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n    return;\n  }" ({ "{") (return_statement "return;" (return "return") (; ";")) (} "}"))) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" (identifier "iVar1") (= "=") (pointer_expression "*(int *)(param_1 + 0x80)" (* "*") (cast_expression "(int *)(param_1 + 0x80)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")"))))) (; ";")) (labeled_statement "LAB_00044918:\n  do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );" (statement_identifier "LAB_00044918") (: ":") (do_statement "do {\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  } while( true );" (do "do") (compound_statement "{\n    pbVar2 = param_2;\n    if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }\n    while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }\n    if (param_3 == 0) {\n      return;\n    }\n  }" ({ "{") (expression_statement "pbVar2 = param_2;" (assignment_expression "pbVar2 = param_2" (identifier "pbVar2") (= "=") (identifier "param_2")) (; ";")) (if_statement "if (0x3f < iVar1) {\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" (if "if") (parenthesized_expression "(0x3f < iVar1)" (( "(") (binary_expression "0x3f < iVar1" (number_literal "0x3f") (< "<") (identifier "iVar1")) () ")")) (compound_statement "{\n      FUN_00044580();\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) goto LAB_00044918;\n    }" ({ "{") (expression_statement "FUN_00044580();" (call_expression "FUN_00044580()" (identifier "FUN_00044580") (argument_list "()" (( "(") () ")"))) (; ";")) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" (identifier "iVar1") (= "=") (pointer_expression "*(int *)(param_1 + 0x80)" (* "*") (cast_expression "(int *)(param_1 + 0x80)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")"))))) (; ";")) (if_statement "if (0x3f < iVar1) goto LAB_00044918;" (if "if") (parenthesized_expression "(0x3f < iVar1)" (( "(") (binary_expression "0x3f < iVar1" (number_literal "0x3f") (< "<") (identifier "iVar1")) () ")")) (goto_statement "goto LAB_00044918;" (goto "goto") (statement_identifier "LAB_00044918") (; ";"))) (} "}"))) (while_statement "while( true ) {\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }" (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (compound_statement "{\n      param_2 = pbVar2 + 1;\n      param_3 = param_3 + -1;\n      *(int *)(param_1 + 0x80) = iVar1 + 1;\n      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);\n      iVar1 = *(int *)(param_1 + 0x80);\n      if (0x3f < iVar1) break;\n      pbVar2 = param_2;\n      if (param_3 == 0) {\n        return;\n      }\n    }" ({ "{") (expression_statement "param_2 = pbVar2 + 1;" (assignment_expression "param_2 = pbVar2 + 1" (identifier "param_2") (= "=") (binary_expression "pbVar2 + 1" (identifier "pbVar2") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "param_3 = param_3 + -1;" (assignment_expression "param_3 = param_3 + -1" (identifier "param_3") (= "=") (binary_expression "param_3 + -1" (identifier "param_3") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "*(int *)(param_1 + 0x80) = iVar1 + 1;" (assignment_expression "*(int *)(param_1 + 0x80) = iVar1 + 1" (pointer_expression "*(int *)(param_1 + 0x80)" (* "*") (cast_expression "(int *)(param_1 + 0x80)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")")))) (= "=") (binary_expression "iVar1 + 1" (identifier "iVar1") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "*pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);" (assignment_expression "*pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1)" (pointer_expression "*pbVar2" (* "*") (identifier "pbVar2")) (= "=") (binary_expression "*pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1)" (pointer_expression "*pbVar2" (* "*") (identifier "pbVar2")) (^ "^") (pointer_expression "*(byte *)(param_1 + 0x40 + iVar1)" (* "*") (cast_expression "(byte *)(param_1 + 0x40 + iVar1)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x40 + iVar1)" (( "(") (binary_expression "param_1 + 0x40 + iVar1" (binary_expression "param_1 + 0x40" (identifier "param_1") (+ "+") (number_literal "0x40")) (+ "+") (identifier "iVar1")) () ")")))))) (; ";")) (expression_statement "iVar1 = *(int *)(param_1 + 0x80);" (assignment_expression "iVar1 = *(int *)(param_1 + 0x80)" (identifier "iVar1") (= "=") (pointer_expression "*(int *)(param_1 + 0x80)" (* "*") (cast_expression "(int *)(param_1 + 0x80)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x80)" (( "(") (binary_expression "param_1 + 0x80" (identifier "param_1") (+ "+") (number_literal "0x80")) () ")"))))) (; ";")) (if_statement "if (0x3f < iVar1) break;" (if "if") (parenthesized_expression "(0x3f < iVar1)" (( "(") (binary_expression "0x3f < iVar1" (number_literal "0x3f") (< "<") (identifier "iVar1")) () ")")) (break_statement "break;" (break "break") (; ";"))) (expression_statement "pbVar2 = param_2;" (assignment_expression "pbVar2 = param_2" (identifier "pbVar2") (= "=") (identifier "param_2")) (; ";")) (if_statement "if (param_3 == 0) {\n        return;\n      }" (if "if") (parenthesized_expression "(param_3 == 0)" (( "(") (binary_expression "param_3 == 0" (identifier "param_3") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n        return;\n      }" ({ "{") (return_statement "return;" (return "return") (; ";")) (} "}"))) (} "}"))) (if_statement "if (param_3 == 0) {\n      return;\n    }" (if "if") (parenthesized_expression "(param_3 == 0)" (( "(") (binary_expression "param_3 == 0" (identifier "param_3") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n      return;\n    }" ({ "{") (return_statement "return;" (return "return") (; ";")) (} "}"))) (} "}")) (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (; ";"))) (} "}")))

void __regparm3 function_1(type_1 *ctx,type_2 *blk,int var_1)

{
  int var_2;
  type_3 *var_4;
  
  if (var_1 == 0) {
    return;
  }
  var_2 = ctx->currentIndex;
LAB_00044918:
  do {
    var_4 = blk;
    if (0x3f < var_2) {
      var_3(ctx);
      var_2 = ctx->currentIndex;
      if (0x3f < var_2) goto LAB_00044918;
    }
    while( true ) {
      blk = var_4 + 1;
      var_1 = var_1 + -1;
      ctx->currentIndex = var_2 + 1;
      *var_4 = *var_4 ^ ctx->current[var_2];
      var_2 = ctx->currentIndex;
      if (0x3f < var_2) break;
      var_4 = blk;
      if (var_1 == 0) {
        return;
      }
    }
    if (var_1 == 0) {
      return;
    }
  } while( true );
}


(translation_unit (function_definition type: (primitive_type) (ERROR (identifier)) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (primitive_type) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (primitive_type) declarator: (identifier)))) body: (compound_statement (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (return_statement))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (labeled_statement label: (statement_identifier) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (compound_statement (expression_statement (call_expression function: (identifier) arguments: (argument_list))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (goto_statement label: (statement_identifier))))) (while_statement condition: (parenthesized_expression (true)) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (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: (binary_expression left: (pointer_expression argument: (identifier)) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (number_literal)) right: (identifier)))))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (break_statement)) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (return_statement))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (return_statement)))) condition: (parenthesized_expression (true)))))))

void __regparm3 MASKED(int param_1,byte *param_2,int param_3)

{
  int iVar1;
  byte *pbVar2;
  
  if (param_3 == 0) {
    return;
  }
  iVar1 = *(int *)(param_1 + 0x80);
LAB_00044918:
  do {
    pbVar2 = param_2;
    if (0x3f < iVar1) {
      FUN_00044580();
      iVar1 = *(int *)(param_1 + 0x80);
      if (0x3f < iVar1) goto LAB_00044918;
    }
    while( true ) {
      param_2 = pbVar2 + 1;
      param_3 = param_3 + -1;
      *(int *)(param_1 + 0x80) = iVar1 + 1;
      *pbVar2 = *pbVar2 ^ *(byte *)(param_1 + 0x40 + iVar1);
      iVar1 = *(int *)(param_1 + 0x80);
      if (0x3f < iVar1) break;
      pbVar2 = param_2;
      if (param_3 == 0) {
        return;
      }
    }
    if (param_3 == 0) {
      return;
    }
  } while( true );
}

