
int __regparm3
sqlite3OpenTableAndIndices
          (Parse *pParse,Table *pTab,int op,u8 p5,int iBase,u8 *aToOpen,int *piDataCur,int *piIdxCur
          )

{
  int p1;
  Index *pIdx;
  Vdbe *local_34;
  int local_30;
  byte local_25;
  
  local_30 = -0x8000;
  local_25 = p5;
  if (pTab->pSchema != (Schema *)0x0) {
    local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema);
  }
  local_34 = pParse->pVdbe;
  if (local_34 == (Vdbe *)0x0) {
    local_34 = sqlite3GetVdbe(pParse);
  }
  if (iBase < 0) {
    iBase = pParse->nTab;
  }
  if (piDataCur != (int *)0x0) {
    *piDataCur = iBase;
  }
  if (((pTab->tabFlags & 0x80) == 0) && ((aToOpen == (u8 *)0x0 || (*aToOpen != '\0')))) {
    sqlite3OpenTable(pParse,iBase,local_30,pTab,op);
  }
  else {
    sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);
  }
  if (piIdxCur != (int *)0x0) {
    *piIdxCur = iBase + 1;
  }
  p1 = iBase + 1;
  for (pIdx = pTab->pIndex; pIdx != (Index *)0x0; pIdx = pIdx->pNext) {
    if ((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&
       (local_25 = 0, piDataCur != (int *)0x0)) {
      *piDataCur = p1;
    }
    if ((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')) {
      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);
      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);
      if (0 < local_34->nOp) {
        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;
      }
    }
    p1 = p1 + 1;
  }
  if (pParse->nTab < p1) {
    pParse->nTab = p1;
  }
  return ~iBase + p1;
}



int __regparm3
FUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,
            uint *param_7,uint *param_8)

{
  uint *puVar1;
  int extraout_ECX;
  int extraout_ECX_00;
  int iVar2;
  uint uVar3;
  undefined8 uVar4;
  int local_34;
  undefined4 local_30;
  byte local_25;
  
  uVar4 = CONCAT44(param_2[0x12],0xffff8000);
  local_25 = param_4;
  iVar2 = param_3;
  if (param_2[0x12] != 0) {
    uVar4 = FUN_0002a630();
    iVar2 = extraout_ECX;
  }
  local_30 = (undefined4)uVar4;
  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));
  if (*(int *)(param_1 + 8) == 0) {
    uVar4 = FUN_000318c0();
    iVar2 = extraout_ECX_00;
  }
  local_34 = (int)uVar4;
  if ((int)param_5 < 0) {
    param_5 = *(uint *)(param_1 + 0x28);
  }
  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);
  if (param_7 != (uint *)0x0) {
    *param_7 = param_5;
    uVar3 = param_5;
  }
  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {
    FUN_0004b430(param_2,param_3,iVar2,iVar2);
  }
  else {
    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);
  }
  if (param_8 != (uint *)0x0) {
    *param_8 = param_5 + 1;
  }
  uVar3 = param_5 + 1;
  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {
    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);
    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&
       (local_25 = 0, param_7 != (uint *)0x0)) {
      *param_7 = uVar3;
      puVar1 = param_7;
    }
    if ((param_6 == (char *)0x0) ||
       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')
       ) {
      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);
      FUN_0004b400();
      if (0 < *(int *)(local_34 + 0x68)) {
        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =
             (ushort)local_25;
      }
    }
    uVar3 = uVar3 + 1;
  }
  if (*(int *)(param_1 + 0x28) < (int)uVar3) {
    *(uint *)(param_1 + 0x28) = uVar3;
  }
  return ~param_5 + uVar3;
}


PUSH EBP
PUSH EDI
MOV EDI,EDX
PUSH ESI
PUSH EBX
MOV ESI,EAX
SUB ESP,0x2c
MOV EDX,dword ptr [EDX + 0x48]
MOV AL,byte ptr [ESP + 0x40]
MOV dword ptr [ESP + 0x10],ECX
MOV EBP,dword ptr [ESP + 0x50]
MOV dword ptr [ESP + 0xc],0xffff8000
TEST EDX,EDX
MOV byte ptr [ESP + 0x17],AL
JZ 0x00017c1f
MOV EAX,dword ptr [ESI]
CALL 0x0002a630
MOV dword ptr [ESP + 0xc],EAX
MOV EAX,dword ptr [ESI + 0x8]
TEST EAX,EAX
MOV dword ptr [ESP + 0x8],EAX
JNZ 0x00017c35
MOV EAX,ESI
CALL 0x000318c0
MOV dword ptr [ESP + 0x8],EAX
CMP dword ptr [ESP + 0x44],0x0
JNS 0x00017c43
MOV EAX,dword ptr [ESI + 0x28]
MOV dword ptr [ESP + 0x44],EAX
CMP dword ptr [ESP + 0x4c],0x0
MOV EAX,dword ptr [ESP + 0x44]
LEA EBX,[EAX + 0x1]
JZ 0x00017c5b
MOV EAX,dword ptr [ESP + 0x4c]
MOV EDX,dword ptr [ESP + 0x44]
MOV dword ptr [EAX],EDX
TEST byte ptr [EDI + 0x24],0x80
JNZ 0x00017c8c
CMP dword ptr [ESP + 0x48],0x0
JZ 0x00017c71
MOV EAX,dword ptr [ESP + 0x48]
CMP byte ptr [EAX],0x0
JZ 0x00017c8c
PUSH ECX
PUSH ECX
MOV EAX,ESI
PUSH dword ptr [ESP + 0x18]
PUSH EDI
MOV ECX,dword ptr [ESP + 0x1c]
MOV EDX,dword ptr [ESP + 0x54]
CALL 0x0004b430
ADD ESP,0x10
JMP 0x00017cac
XOR EAX,EAX
PUSH EDX
PUSH EDX
PUSH dword ptr [EDI]
CMP dword ptr [ESP + 0x1c],0x61
MOV ECX,dword ptr [EDI + 0x1c]
SETZ AL
PUSH EAX
MOV EDX,dword ptr [ESP + 0x1c]
MOV EAX,ESI
CALL 0x000309e0
ADD ESP,0x10
TEST EBP,EBP
JZ 0x00017cb3
MOV dword ptr [EBP],EBX
MOV EAX,dword ptr [ESP + 0x44]
MOV EBP,dword ptr [EDI + 0x8]
MOV ECX,EBX
NOT EAX
MOV dword ptr [ESP + 0x18],EAX
MOV EAX,dword ptr [ESP + 0x48]
SUB EAX,dword ptr [ESP + 0x44]
MOV dword ptr [ESP + 0x1c],EAX
MOV EAX,dword ptr [ESP + 0x18]
ADD EAX,ECX
TEST EBP,EBP
JZ 0x00017d5d
MOV AL,byte ptr [EBP + 0x37]
LEA EBX,[ECX + 0x1]
AND EAX,0x3
CMP AL,0x2
JNZ 0x00017d01
TEST byte ptr [EDI + 0x24],0x80
JZ 0x00017d01
CMP dword ptr [ESP + 0x4c],0x0
MOV byte ptr [ESP + 0x17],0x0
JZ 0x00017d01
MOV EAX,dword ptr [ESP + 0x4c]
MOV dword ptr [EAX],ECX
CMP dword ptr [ESP + 0x48],0x0
JZ 0x00017d13
MOV EAX,dword ptr [ESP + 0x1c]
CMP byte ptr [EAX + EBX*0x1 + -0x1],0x0
JZ 0x00017d53
PUSH EAX
PUSH EAX
PUSH dword ptr [ESP + 0x14]
PUSH dword ptr [EBP + 0x2c]
MOV EDX,dword ptr [ESP + 0x20]
MOV EAX,dword ptr [ESP + 0x18]
CALL 0x000315c0
MOV EAX,ESI
MOV EDX,EBP
CALL 0x0004b400
MOV EAX,dword ptr [ESP + 0x18]
ADD ESP,0x10
MOV EAX,dword ptr [EAX + 0x68]
TEST EAX,EAX
JLE 0x00017d53
MOV ECX,dword ptr [ESP + 0x8]
MOVZX EDX,byte ptr [ESP + 0x17]
IMUL EAX,EAX,0x14
ADD EAX,dword ptr [ECX + 0x64]
MOV word ptr [EAX + -0x12],DX
MOV EBP,dword ptr [EBP + 0x14]
MOV ECX,EBX
JMP 0x00017cce
CMP ECX,dword ptr [ESI + 0x28]
JLE 0x00017d65
MOV dword ptr [ESI + 0x28],ECX
ADD ESP,0x2c
POP EBX
POP ESI
POP EDI
POP EBP
RET
(translation_unit "int __regparm3\nFUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)\n\n{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}\n\n" (function_definition "int __regparm3\nFUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)\n\n{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}" primitive_type (ERROR "__regparm3" identifier) (function_declarator "FUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)" identifier (parameter_list "(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)" ( (parameter_declaration "int param_1" primitive_type identifier) , (parameter_declaration "undefined4 *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int param_3" primitive_type identifier) , (parameter_declaration "byte param_4" type_identifier identifier) , (parameter_declaration "uint param_5" type_identifier identifier) , (parameter_declaration "char *param_6" primitive_type (pointer_declarator "*param_6" * identifier)) , (parameter_declaration "uint *param_7" type_identifier (pointer_declarator "*param_7" * identifier)) , (parameter_declaration "uint *param_8" type_identifier (pointer_declarator "*param_8" * identifier)) ))) (compound_statement "{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}" { (declaration "uint *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "int extraout_ECX;" primitive_type identifier ;) (declaration "int extraout_ECX_00;" primitive_type identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "uint uVar3;" type_identifier identifier ;) (declaration "undefined8 uVar4;" type_identifier identifier ;) (declaration "int local_34;" primitive_type identifier ;) (declaration "undefined4 local_30;" type_identifier identifier ;) (declaration "byte local_25;" type_identifier identifier ;) (expression_statement "uVar4 = CONCAT44(param_2[0x12],0xffff8000);" (assignment_expression "uVar4 = CONCAT44(param_2[0x12],0xffff8000)" identifier = (call_expression "CONCAT44(param_2[0x12],0xffff8000)" identifier (argument_list "(param_2[0x12],0xffff8000)" ( (subscript_expression "param_2[0x12]" identifier [ number_literal ]) , number_literal )))) ;) (expression_statement "local_25 = param_4;" (assignment_expression "local_25 = param_4" identifier = identifier) ;) (expression_statement "iVar2 = param_3;" (assignment_expression "iVar2 = param_3" identifier = identifier) ;) (if_statement "if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }" if (parenthesized_expression "(param_2[0x12] != 0)" ( (binary_expression "param_2[0x12] != 0" (subscript_expression "param_2[0x12]" identifier [ number_literal ]) != number_literal) )) (compound_statement "{\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }" { (expression_statement "uVar4 = FUN_0002a630();" (assignment_expression "uVar4 = FUN_0002a630()" identifier = (call_expression "FUN_0002a630()" identifier (argument_list "()" ( )))) ;) (expression_statement "iVar2 = extraout_ECX;" (assignment_expression "iVar2 = extraout_ECX" identifier = identifier) ;) })) (expression_statement "local_30 = (undefined4)uVar4;" (assignment_expression "local_30 = (undefined4)uVar4" identifier = (cast_expression "(undefined4)uVar4" ( (type_descriptor "undefined4" type_identifier) ) identifier)) ;) (expression_statement "uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));" (assignment_expression "uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" identifier = (call_expression "CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" identifier (argument_list "((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" ( (cast_expression "(int)((ulonglong)uVar4 >> 0x20)" ( (type_descriptor "int" primitive_type) ) (parenthesized_expression "((ulonglong)uVar4 >> 0x20)" ( (binary_expression "(ulonglong)uVar4 >> 0x20" (cast_expression "(ulonglong)uVar4" ( (type_descriptor "ulonglong" type_identifier) ) identifier) >> number_literal) ))) , (pointer_expression "*(int *)(param_1 + 8)" * (cast_expression "(int *)(param_1 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) )))) ;) (if_statement "if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }" if (parenthesized_expression "(*(int *)(param_1 + 8) == 0)" ( (binary_expression "*(int *)(param_1 + 8) == 0" (pointer_expression "*(int *)(param_1 + 8)" * (cast_expression "(int *)(param_1 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) == number_literal) )) (compound_statement "{\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }" { (expression_statement "uVar4 = FUN_000318c0();" (assignment_expression "uVar4 = FUN_000318c0()" identifier = (call_expression "FUN_000318c0()" identifier (argument_list "()" ( )))) ;) (expression_statement "iVar2 = extraout_ECX_00;" (assignment_expression "iVar2 = extraout_ECX_00" identifier = identifier) ;) })) (expression_statement "local_34 = (int)uVar4;" (assignment_expression "local_34 = (int)uVar4" identifier = (cast_expression "(int)uVar4" ( (type_descriptor "int" primitive_type) ) identifier)) ;) (if_statement "if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }" if (parenthesized_expression "((int)param_5 < 0)" ( (binary_expression "(int)param_5 < 0" (cast_expression "(int)param_5" ( (type_descriptor "int" primitive_type) ) identifier) < number_literal) )) (compound_statement "{\n    param_5 = *(uint *)(param_1 + 0x28);\n  }" { (expression_statement "param_5 = *(uint *)(param_1 + 0x28);" (assignment_expression "param_5 = *(uint *)(param_1 + 0x28)" identifier = (pointer_expression "*(uint *)(param_1 + 0x28)" * (cast_expression "(uint *)(param_1 + 0x28)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x28)" ( (binary_expression "param_1 + 0x28" identifier + number_literal) ))))) ;) })) (expression_statement "uVar3 = (uint)((ulonglong)uVar4 >> 0x20);" (assignment_expression "uVar3 = (uint)((ulonglong)uVar4 >> 0x20)" identifier = (call_expression "(uint)((ulonglong)uVar4 >> 0x20)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "((ulonglong)uVar4 >> 0x20)" ( (binary_expression "(ulonglong)uVar4 >> 0x20" (cast_expression "(ulonglong)uVar4" ( (type_descriptor "ulonglong" type_identifier) ) identifier) >> number_literal) )))) ;) (if_statement "if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }" if (parenthesized_expression "(param_7 != (uint *)0x0)" ( (binary_expression "param_7 != (uint *)0x0" identifier != (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }" { (expression_statement "*param_7 = param_5;" (assignment_expression "*param_7 = param_5" (pointer_expression "*param_7" * identifier) = identifier) ;) (expression_statement "uVar3 = param_5;" (assignment_expression "uVar3 = param_5" identifier = identifier) ;) })) (if_statement "if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" if (parenthesized_expression "(((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0'))))" ( (binary_expression "((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))" (parenthesized_expression "((*(byte *)(param_2 + 9) & 0x80) == 0)" ( (binary_expression "(*(byte *)(param_2 + 9) & 0x80) == 0" (parenthesized_expression "(*(byte *)(param_2 + 9) & 0x80)" ( (binary_expression "*(byte *)(param_2 + 9) & 0x80" (pointer_expression "*(byte *)(param_2 + 9)" * (cast_expression "(byte *)(param_2 + 9)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 9)" ( (binary_expression "param_2 + 9" identifier + number_literal) )))) & number_literal) )) == number_literal) )) && (parenthesized_expression "((param_6 == (char *)0x0 || (*param_6 != '\0')))" ( (parenthesized_expression "(param_6 == (char *)0x0 || (*param_6 != '\0'))" ( (binary_expression "param_6 == (char *)0x0 || (*param_6 != '\0')" (binary_expression "param_6 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) || (parenthesized_expression "(*param_6 != '\0')" ( (binary_expression "*param_6 != '\0'" (pointer_expression "*param_6" * identifier) != (char_literal "'\0'" ' escape_sequence ')) ))) )) ))) )) (compound_statement "{\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }" { (expression_statement "FUN_0004b430(param_2,param_3,iVar2,iVar2);" (call_expression "FUN_0004b430(param_2,param_3,iVar2,iVar2)" identifier (argument_list "(param_2,param_3,iVar2,iVar2)" ( identifier , identifier , identifier , identifier ))) ;) }) (else_clause "else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" else (compound_statement "{\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" { (expression_statement "FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);" (call_expression "FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3)" identifier (argument_list "(param_3 == 0x61,*param_2,uVar3,uVar3)" ( (binary_expression "param_3 == 0x61" identifier == number_literal) , (pointer_expression "*param_2" * identifier) , identifier , identifier ))) ;) }))) (if_statement "if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }" if (parenthesized_expression "(param_8 != (uint *)0x0)" ( (binary_expression "param_8 != (uint *)0x0" identifier != (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_8 = param_5 + 1;\n  }" { (expression_statement "*param_8 = param_5 + 1;" (assignment_expression "*param_8 = param_5 + 1" (pointer_expression "*param_8" * identifier) = (binary_expression "param_5 + 1" identifier + number_literal)) ;) })) (expression_statement "uVar3 = param_5 + 1;" (assignment_expression "uVar3 = param_5 + 1" identifier = (binary_expression "param_5 + 1" identifier + number_literal)) ;) (for_statement "for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }" for ( (assignment_expression "iVar2 = param_2[2]" identifier = (subscript_expression "param_2[2]" identifier [ number_literal ])) ; (binary_expression "iVar2 != 0" identifier != number_literal) ; (assignment_expression "iVar2 = *(int *)(iVar2 + 0x14)" identifier = (pointer_expression "*(int *)(iVar2 + 0x14)" * (cast_expression "(int *)(iVar2 + 0x14)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x14)" ( (binary_expression "iVar2 + 0x14" identifier + number_literal) ))))) ) (compound_statement "{\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }" { (expression_statement "puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);" (assignment_expression "puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3)" identifier = (cast_expression "(uint *)(*(byte *)(iVar2 + 0x37) & 3)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(byte *)(iVar2 + 0x37) & 3)" ( (binary_expression "*(byte *)(iVar2 + 0x37) & 3" (pointer_expression "*(byte *)(iVar2 + 0x37)" * (cast_expression "(byte *)(iVar2 + 0x37)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x37)" ( (binary_expression "iVar2 + 0x37" identifier + number_literal) )))) & number_literal) )))) ;) (if_statement "if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }" if (parenthesized_expression "((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0))" ( (binary_expression "(((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)" (parenthesized_expression "(((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0))" ( (binary_expression "((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)" (parenthesized_expression "((char)puVar1 == '\x02')" ( (binary_expression "(char)puVar1 == '\x02'" (cast_expression "(char)puVar1" ( (type_descriptor "char" primitive_type) ) identifier) == (char_literal "'\x02'" ' escape_sequence ')) )) && (parenthesized_expression "((*(byte *)(param_2 + 9) & 0x80) != 0)" ( (binary_expression "(*(byte *)(param_2 + 9) & 0x80) != 0" (parenthesized_expression "(*(byte *)(param_2 + 9) & 0x80)" ( (binary_expression "*(byte *)(param_2 + 9) & 0x80" (pointer_expression "*(byte *)(param_2 + 9)" * (cast_expression "(byte *)(param_2 + 9)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 9)" ( (binary_expression "param_2 + 9" identifier + number_literal) )))) & number_literal) )) != number_literal) ))) )) && (parenthesized_expression "(local_25 = 0, param_7 != (uint *)0x0)" ( (comma_expression "local_25 = 0, param_7 != (uint *)0x0" (assignment_expression "local_25 = 0" identifier = number_literal) , (binary_expression "param_7 != (uint *)0x0" identifier != (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal))) ))) )) (compound_statement "{\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }" { (expression_statement "*param_7 = uVar3;" (assignment_expression "*param_7 = uVar3" (pointer_expression "*param_7" * identifier) = identifier) ;) (expression_statement "puVar1 = param_7;" (assignment_expression "puVar1 = param_7" identifier = identifier) ;) })) (if_statement "if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }" if (parenthesized_expression "((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       )" ( (binary_expression "(param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')" (parenthesized_expression "(param_6 == (char *)0x0)" ( (binary_expression "param_6 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) || (parenthesized_expression "(puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')" ( (comma_expression "puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0'" (assignment_expression "puVar1 = (uint *)(param_6 + -param_5)" identifier = (cast_expression "(uint *)(param_6 + -param_5)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_6 + -param_5)" ( (binary_expression "param_6 + -param_5" identifier + (unary_expression "-param_5" - identifier)) )))) , (binary_expression "*(char *)((int)(param_6 + -param_5) + uVar3) != '\0'" (pointer_expression "*(char *)((int)(param_6 + -param_5) + uVar3)" * (cast_expression "(char *)((int)(param_6 + -param_5) + uVar3)" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((int)(param_6 + -param_5) + uVar3)" ( (binary_expression "(int)(param_6 + -param_5) + uVar3" (cast_expression "(int)(param_6 + -param_5)" ( (type_descriptor "int" primitive_type) ) (parenthesized_expression "(param_6 + -param_5)" ( (binary_expression "param_6 + -param_5" identifier + (unary_expression "-param_5" - identifier)) ))) + identifier) )))) != (char_literal "'\0'" ' escape_sequence '))) ))) )) (compound_statement "{\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }" { (expression_statement "FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);" (call_expression "FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1)" identifier (argument_list "(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1)" ( (pointer_expression "*(undefined4 *)(iVar2 + 0x2c)" * (cast_expression "(undefined4 *)(iVar2 + 0x2c)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x2c)" ( (binary_expression "iVar2 + 0x2c" identifier + number_literal) )))) , identifier , identifier , identifier ))) ;) (expression_statement "FUN_0004b400();" (call_expression "FUN_0004b400()" identifier (argument_list "()" ( ))) ;) (if_statement "if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }" if (parenthesized_expression "(0 < *(int *)(local_34 + 0x68))" ( (binary_expression "0 < *(int *)(local_34 + 0x68)" number_literal < (pointer_expression "*(int *)(local_34 + 0x68)" * (cast_expression "(int *)(local_34 + 0x68)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(local_34 + 0x68)" ( (binary_expression "local_34 + 0x68" identifier + number_literal) ))))) )) (compound_statement "{\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }" { (expression_statement "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;" (assignment_expression "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25" (pointer_expression "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" * (cast_expression "(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" ( (binary_expression "*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12" (binary_expression "*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100)" (binary_expression "*(int *)(local_34 + 0x68) * 0x14" (pointer_expression "*(int *)(local_34 + 0x68)" * (cast_expression "(int *)(local_34 + 0x68)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(local_34 + 0x68)" ( (binary_expression "local_34 + 0x68" identifier + number_literal) )))) * number_literal) + (pointer_expression "*(int *)(local_34 + 100)" * (cast_expression "(int *)(local_34 + 100)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(local_34 + 100)" ( (binary_expression "local_34 + 100" identifier + number_literal) ))))) + number_literal) )))) = (cast_expression "(ushort)local_25" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) })) })) (expression_statement "uVar3 = uVar3 + 1;" (assignment_expression "uVar3 = uVar3 + 1" identifier = (binary_expression "uVar3 + 1" identifier + number_literal)) ;) })) (if_statement "if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }" if (parenthesized_expression "(*(int *)(param_1 + 0x28) < (int)uVar3)" ( (binary_expression "*(int *)(param_1 + 0x28) < (int)uVar3" (pointer_expression "*(int *)(param_1 + 0x28)" * (cast_expression "(int *)(param_1 + 0x28)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x28)" ( (binary_expression "param_1 + 0x28" identifier + number_literal) )))) < (cast_expression "(int)uVar3" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }" { (expression_statement "*(uint *)(param_1 + 0x28) = uVar3;" (assignment_expression "*(uint *)(param_1 + 0x28) = uVar3" (pointer_expression "*(uint *)(param_1 + 0x28)" * (cast_expression "(uint *)(param_1 + 0x28)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x28)" ( (binary_expression "param_1 + 0x28" identifier + number_literal) )))) = identifier) ;) })) (return_statement "return ~param_5 + uVar3;" return (binary_expression "~param_5 + uVar3" (unary_expression "~param_5" ~ identifier) + identifier) ;) })))
(translation_unit "int __regparm3\nsqlite3OpenTableAndIndices\n          (Parse *pParse,Table *pTab,int op,u8 p5,int iBase,u8 *aToOpen,int *piDataCur,int *piIdxCur\n          )\n\n{\n  int p1;\n  Index *pIdx;\n  Vdbe *local_34;\n  int local_30;\n  byte local_25;\n  \n  local_30 = -0x8000;\n  local_25 = p5;\n  if (pTab->pSchema != (Schema *)0x0) {\n    local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema);\n  }\n  local_34 = pParse->pVdbe;\n  if (local_34 == (Vdbe *)0x0) {\n    local_34 = sqlite3GetVdbe(pParse);\n  }\n  if (iBase < 0) {\n    iBase = pParse->nTab;\n  }\n  if (piDataCur != (int *)0x0) {\n    *piDataCur = iBase;\n  }\n  if (((pTab->tabFlags & 0x80) == 0) && ((aToOpen == (u8 *)0x0 || (*aToOpen != '\0')))) {\n    sqlite3OpenTable(pParse,iBase,local_30,pTab,op);\n  }\n  else {\n    sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);\n  }\n  if (piIdxCur != (int *)0x0) {\n    *piIdxCur = iBase + 1;\n  }\n  p1 = iBase + 1;\n  for (pIdx = pTab->pIndex; pIdx != (Index *)0x0; pIdx = pIdx->pNext) {\n    if ((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0)) {\n      *piDataCur = p1;\n    }\n    if ((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')) {\n      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);\n      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);\n      if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }\n    }\n    p1 = p1 + 1;\n  }\n  if (pParse->nTab < p1) {\n    pParse->nTab = p1;\n  }\n  return ~iBase + p1;\n}\n\n" (function_definition "int __regparm3\nsqlite3OpenTableAndIndices\n          (Parse *pParse,Table *pTab,int op,u8 p5,int iBase,u8 *aToOpen,int *piDataCur,int *piIdxCur\n          )\n\n{\n  int p1;\n  Index *pIdx;\n  Vdbe *local_34;\n  int local_30;\n  byte local_25;\n  \n  local_30 = -0x8000;\n  local_25 = p5;\n  if (pTab->pSchema != (Schema *)0x0) {\n    local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema);\n  }\n  local_34 = pParse->pVdbe;\n  if (local_34 == (Vdbe *)0x0) {\n    local_34 = sqlite3GetVdbe(pParse);\n  }\n  if (iBase < 0) {\n    iBase = pParse->nTab;\n  }\n  if (piDataCur != (int *)0x0) {\n    *piDataCur = iBase;\n  }\n  if (((pTab->tabFlags & 0x80) == 0) && ((aToOpen == (u8 *)0x0 || (*aToOpen != '\0')))) {\n    sqlite3OpenTable(pParse,iBase,local_30,pTab,op);\n  }\n  else {\n    sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);\n  }\n  if (piIdxCur != (int *)0x0) {\n    *piIdxCur = iBase + 1;\n  }\n  p1 = iBase + 1;\n  for (pIdx = pTab->pIndex; pIdx != (Index *)0x0; pIdx = pIdx->pNext) {\n    if ((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0)) {\n      *piDataCur = p1;\n    }\n    if ((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')) {\n      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);\n      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);\n      if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }\n    }\n    p1 = p1 + 1;\n  }\n  if (pParse->nTab < p1) {\n    pParse->nTab = p1;\n  }\n  return ~iBase + p1;\n}" primitive_type (ERROR "__regparm3" identifier) (function_declarator "sqlite3OpenTableAndIndices\n          (Parse *pParse,Table *pTab,int op,u8 p5,int iBase,u8 *aToOpen,int *piDataCur,int *piIdxCur\n          )" identifier (parameter_list "(Parse *pParse,Table *pTab,int op,u8 p5,int iBase,u8 *aToOpen,int *piDataCur,int *piIdxCur\n          )" ( (parameter_declaration "Parse *pParse" type_identifier (pointer_declarator "*pParse" * identifier)) , (parameter_declaration "Table *pTab" type_identifier (pointer_declarator "*pTab" * identifier)) , (parameter_declaration "int op" primitive_type identifier) , (parameter_declaration "u8 p5" type_identifier identifier) , (parameter_declaration "int iBase" primitive_type identifier) , (parameter_declaration "u8 *aToOpen" type_identifier (pointer_declarator "*aToOpen" * identifier)) , (parameter_declaration "int *piDataCur" primitive_type (pointer_declarator "*piDataCur" * identifier)) , (parameter_declaration "int *piIdxCur" primitive_type (pointer_declarator "*piIdxCur" * identifier)) ))) (compound_statement "{\n  int p1;\n  Index *pIdx;\n  Vdbe *local_34;\n  int local_30;\n  byte local_25;\n  \n  local_30 = -0x8000;\n  local_25 = p5;\n  if (pTab->pSchema != (Schema *)0x0) {\n    local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema);\n  }\n  local_34 = pParse->pVdbe;\n  if (local_34 == (Vdbe *)0x0) {\n    local_34 = sqlite3GetVdbe(pParse);\n  }\n  if (iBase < 0) {\n    iBase = pParse->nTab;\n  }\n  if (piDataCur != (int *)0x0) {\n    *piDataCur = iBase;\n  }\n  if (((pTab->tabFlags & 0x80) == 0) && ((aToOpen == (u8 *)0x0 || (*aToOpen != '\0')))) {\n    sqlite3OpenTable(pParse,iBase,local_30,pTab,op);\n  }\n  else {\n    sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);\n  }\n  if (piIdxCur != (int *)0x0) {\n    *piIdxCur = iBase + 1;\n  }\n  p1 = iBase + 1;\n  for (pIdx = pTab->pIndex; pIdx != (Index *)0x0; pIdx = pIdx->pNext) {\n    if ((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0)) {\n      *piDataCur = p1;\n    }\n    if ((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')) {\n      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);\n      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);\n      if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }\n    }\n    p1 = p1 + 1;\n  }\n  if (pParse->nTab < p1) {\n    pParse->nTab = p1;\n  }\n  return ~iBase + p1;\n}" { (declaration "int p1;" primitive_type identifier ;) (declaration "Index *pIdx;" type_identifier (pointer_declarator "*pIdx" * identifier) ;) (declaration "Vdbe *local_34;" type_identifier (pointer_declarator "*local_34" * identifier) ;) (declaration "int local_30;" primitive_type identifier ;) (declaration "byte local_25;" type_identifier identifier ;) (expression_statement "local_30 = -0x8000;" (assignment_expression "local_30 = -0x8000" identifier = number_literal) ;) (expression_statement "local_25 = p5;" (assignment_expression "local_25 = p5" identifier = identifier) ;) (if_statement "if (pTab->pSchema != (Schema *)0x0) {\n    local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema);\n  }" if (parenthesized_expression "(pTab->pSchema != (Schema *)0x0)" ( (binary_expression "pTab->pSchema != (Schema *)0x0" (field_expression "pTab->pSchema" identifier -> field_identifier) != (cast_expression "(Schema *)0x0" ( (type_descriptor "Schema *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema);\n  }" { (expression_statement "local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema);" (assignment_expression "local_30 = sqlite3SchemaToIndex(pParse->db,pTab->pSchema)" identifier = (call_expression "sqlite3SchemaToIndex(pParse->db,pTab->pSchema)" identifier (argument_list "(pParse->db,pTab->pSchema)" ( (field_expression "pParse->db" identifier -> field_identifier) , (field_expression "pTab->pSchema" identifier -> field_identifier) )))) ;) })) (expression_statement "local_34 = pParse->pVdbe;" (assignment_expression "local_34 = pParse->pVdbe" identifier = (field_expression "pParse->pVdbe" identifier -> field_identifier)) ;) (if_statement "if (local_34 == (Vdbe *)0x0) {\n    local_34 = sqlite3GetVdbe(pParse);\n  }" if (parenthesized_expression "(local_34 == (Vdbe *)0x0)" ( (binary_expression "local_34 == (Vdbe *)0x0" identifier == (cast_expression "(Vdbe *)0x0" ( (type_descriptor "Vdbe *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    local_34 = sqlite3GetVdbe(pParse);\n  }" { (expression_statement "local_34 = sqlite3GetVdbe(pParse);" (assignment_expression "local_34 = sqlite3GetVdbe(pParse)" identifier = (call_expression "sqlite3GetVdbe(pParse)" identifier (argument_list "(pParse)" ( identifier )))) ;) })) (if_statement "if (iBase < 0) {\n    iBase = pParse->nTab;\n  }" if (parenthesized_expression "(iBase < 0)" ( (binary_expression "iBase < 0" identifier < number_literal) )) (compound_statement "{\n    iBase = pParse->nTab;\n  }" { (expression_statement "iBase = pParse->nTab;" (assignment_expression "iBase = pParse->nTab" identifier = (field_expression "pParse->nTab" identifier -> field_identifier)) ;) })) (if_statement "if (piDataCur != (int *)0x0) {\n    *piDataCur = iBase;\n  }" if (parenthesized_expression "(piDataCur != (int *)0x0)" ( (binary_expression "piDataCur != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *piDataCur = iBase;\n  }" { (expression_statement "*piDataCur = iBase;" (assignment_expression "*piDataCur = iBase" (pointer_expression "*piDataCur" * identifier) = identifier) ;) })) (if_statement "if (((pTab->tabFlags & 0x80) == 0) && ((aToOpen == (u8 *)0x0 || (*aToOpen != '\0')))) {\n    sqlite3OpenTable(pParse,iBase,local_30,pTab,op);\n  }\n  else {\n    sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);\n  }" if (parenthesized_expression "(((pTab->tabFlags & 0x80) == 0) && ((aToOpen == (u8 *)0x0 || (*aToOpen != '\0'))))" ( (binary_expression "((pTab->tabFlags & 0x80) == 0) && ((aToOpen == (u8 *)0x0 || (*aToOpen != '\0')))" (parenthesized_expression "((pTab->tabFlags & 0x80) == 0)" ( (binary_expression "(pTab->tabFlags & 0x80) == 0" (parenthesized_expression "(pTab->tabFlags & 0x80)" ( (binary_expression "pTab->tabFlags & 0x80" (field_expression "pTab->tabFlags" identifier -> field_identifier) & number_literal) )) == number_literal) )) && (parenthesized_expression "((aToOpen == (u8 *)0x0 || (*aToOpen != '\0')))" ( (parenthesized_expression "(aToOpen == (u8 *)0x0 || (*aToOpen != '\0'))" ( (binary_expression "aToOpen == (u8 *)0x0 || (*aToOpen != '\0')" (binary_expression "aToOpen == (u8 *)0x0" identifier == (cast_expression "(u8 *)0x0" ( (type_descriptor "u8 *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) || (parenthesized_expression "(*aToOpen != '\0')" ( (binary_expression "*aToOpen != '\0'" (pointer_expression "*aToOpen" * identifier) != (char_literal "'\0'" ' escape_sequence ')) ))) )) ))) )) (compound_statement "{\n    sqlite3OpenTable(pParse,iBase,local_30,pTab,op);\n  }" { (expression_statement "sqlite3OpenTable(pParse,iBase,local_30,pTab,op);" (call_expression "sqlite3OpenTable(pParse,iBase,local_30,pTab,op)" identifier (argument_list "(pParse,iBase,local_30,pTab,op)" ( identifier , identifier , identifier , identifier , identifier ))) ;) }) (else_clause "else {\n    sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);\n  }" else (compound_statement "{\n    sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);\n  }" { (expression_statement "sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName);" (call_expression "sqlite3TableLock(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName)" identifier (argument_list "(pParse,local_30,pTab->tnum,op == 0x61,pTab->zName)" ( identifier , identifier , (field_expression "pTab->tnum" identifier -> field_identifier) , (binary_expression "op == 0x61" identifier == number_literal) , (field_expression "pTab->zName" identifier -> field_identifier) ))) ;) }))) (if_statement "if (piIdxCur != (int *)0x0) {\n    *piIdxCur = iBase + 1;\n  }" if (parenthesized_expression "(piIdxCur != (int *)0x0)" ( (binary_expression "piIdxCur != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *piIdxCur = iBase + 1;\n  }" { (expression_statement "*piIdxCur = iBase + 1;" (assignment_expression "*piIdxCur = iBase + 1" (pointer_expression "*piIdxCur" * identifier) = (binary_expression "iBase + 1" identifier + number_literal)) ;) })) (expression_statement "p1 = iBase + 1;" (assignment_expression "p1 = iBase + 1" identifier = (binary_expression "iBase + 1" identifier + number_literal)) ;) (for_statement "for (pIdx = pTab->pIndex; pIdx != (Index *)0x0; pIdx = pIdx->pNext) {\n    if ((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0)) {\n      *piDataCur = p1;\n    }\n    if ((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')) {\n      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);\n      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);\n      if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }\n    }\n    p1 = p1 + 1;\n  }" for ( (assignment_expression "pIdx = pTab->pIndex" identifier = (field_expression "pTab->pIndex" identifier -> field_identifier)) ; (binary_expression "pIdx != (Index *)0x0" identifier != (cast_expression "(Index *)0x0" ( (type_descriptor "Index *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) ; (assignment_expression "pIdx = pIdx->pNext" identifier = (field_expression "pIdx->pNext" identifier -> field_identifier)) ) (compound_statement "{\n    if ((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0)) {\n      *piDataCur = p1;\n    }\n    if ((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')) {\n      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);\n      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);\n      if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }\n    }\n    p1 = p1 + 1;\n  }" { (if_statement "if ((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0)) {\n      *piDataCur = p1;\n    }" if (parenthesized_expression "((((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0))" ( (binary_expression "(((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&\n       (local_25 = 0, piDataCur != (int *)0x0)" (parenthesized_expression "(((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0))" ( (binary_expression "((pIdx->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)" (parenthesized_expression "((pIdx->field_0x37 & 3) == 2)" ( (binary_expression "(pIdx->field_0x37 & 3) == 2" (parenthesized_expression "(pIdx->field_0x37 & 3)" ( (binary_expression "pIdx->field_0x37 & 3" (field_expression "pIdx->field_0x37" identifier -> field_identifier) & number_literal) )) == number_literal) )) && (parenthesized_expression "((pTab->tabFlags & 0x80) != 0)" ( (binary_expression "(pTab->tabFlags & 0x80) != 0" (parenthesized_expression "(pTab->tabFlags & 0x80)" ( (binary_expression "pTab->tabFlags & 0x80" (field_expression "pTab->tabFlags" identifier -> field_identifier) & number_literal) )) != number_literal) ))) )) && (parenthesized_expression "(local_25 = 0, piDataCur != (int *)0x0)" ( (comma_expression "local_25 = 0, piDataCur != (int *)0x0" (assignment_expression "local_25 = 0" identifier = number_literal) , (binary_expression "piDataCur != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal))) ))) )) (compound_statement "{\n      *piDataCur = p1;\n    }" { (expression_statement "*piDataCur = p1;" (assignment_expression "*piDataCur = p1" (pointer_expression "*piDataCur" * identifier) = identifier) ;) })) (if_statement "if ((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')) {\n      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);\n      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);\n      if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }\n    }" if (parenthesized_expression "((aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0'))" ( (binary_expression "(aToOpen == (u8 *)0x0) || (aToOpen[p1 + 1 + (-1 - iBase)] != '\0')" (parenthesized_expression "(aToOpen == (u8 *)0x0)" ( (binary_expression "aToOpen == (u8 *)0x0" identifier == (cast_expression "(u8 *)0x0" ( (type_descriptor "u8 *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) || (parenthesized_expression "(aToOpen[p1 + 1 + (-1 - iBase)] != '\0')" ( (binary_expression "aToOpen[p1 + 1 + (-1 - iBase)] != '\0'" (subscript_expression "aToOpen[p1 + 1 + (-1 - iBase)]" identifier [ (binary_expression "p1 + 1 + (-1 - iBase)" (binary_expression "p1 + 1" identifier + number_literal) + (parenthesized_expression "(-1 - iBase)" ( (binary_expression "-1 - iBase" number_literal - identifier) ))) ]) != (char_literal "'\0'" ' escape_sequence ')) ))) )) (compound_statement "{\n      sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);\n      sqlite3VdbeSetP4KeyInfo(pParse,pIdx);\n      if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }\n    }" { (expression_statement "sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30);" (call_expression "sqlite3VdbeAddOp3(local_34,op,p1,pIdx->tnum,local_30)" identifier (argument_list "(local_34,op,p1,pIdx->tnum,local_30)" ( identifier , identifier , identifier , (field_expression "pIdx->tnum" identifier -> field_identifier) , identifier ))) ;) (expression_statement "sqlite3VdbeSetP4KeyInfo(pParse,pIdx);" (call_expression "sqlite3VdbeSetP4KeyInfo(pParse,pIdx)" identifier (argument_list "(pParse,pIdx)" ( identifier , identifier ))) ;) (if_statement "if (0 < local_34->nOp) {\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }" if (parenthesized_expression "(0 < local_34->nOp)" ( (binary_expression "0 < local_34->nOp" number_literal < (field_expression "local_34->nOp" identifier -> field_identifier)) )) (compound_statement "{\n        local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;\n      }" { (expression_statement "local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25;" (assignment_expression "local_34->aOp[local_34->nOp + -1].p5 = (ushort)local_25" (field_expression "local_34->aOp[local_34->nOp + -1].p5" (subscript_expression "local_34->aOp[local_34->nOp + -1]" (field_expression "local_34->aOp" identifier -> field_identifier) [ (binary_expression "local_34->nOp + -1" (field_expression "local_34->nOp" identifier -> field_identifier) + number_literal) ]) . field_identifier) = (cast_expression "(ushort)local_25" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) })) })) (expression_statement "p1 = p1 + 1;" (assignment_expression "p1 = p1 + 1" identifier = (binary_expression "p1 + 1" identifier + number_literal)) ;) })) (if_statement "if (pParse->nTab < p1) {\n    pParse->nTab = p1;\n  }" if (parenthesized_expression "(pParse->nTab < p1)" ( (binary_expression "pParse->nTab < p1" (field_expression "pParse->nTab" identifier -> field_identifier) < identifier) )) (compound_statement "{\n    pParse->nTab = p1;\n  }" { (expression_statement "pParse->nTab = p1;" (assignment_expression "pParse->nTab = p1" (field_expression "pParse->nTab" identifier -> field_identifier) = identifier) ;) })) (return_statement "return ~iBase + p1;" return (binary_expression "~iBase + p1" (unary_expression "~iBase" ~ identifier) + identifier) ;) })))
(translation_unit "int __regparm3\nFUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)\n\n{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}\n\n" (function_definition "int __regparm3\nFUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)\n\n{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}" primitive_type (ERROR "__regparm3" identifier) (function_declarator "FUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)" identifier (parameter_list "(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)" ( (parameter_declaration "int param_1" primitive_type identifier) , (parameter_declaration "undefined4 *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int param_3" primitive_type identifier) , (parameter_declaration "byte param_4" type_identifier identifier) , (parameter_declaration "uint param_5" type_identifier identifier) , (parameter_declaration "char *param_6" primitive_type (pointer_declarator "*param_6" * identifier)) , (parameter_declaration "uint *param_7" type_identifier (pointer_declarator "*param_7" * identifier)) , (parameter_declaration "uint *param_8" type_identifier (pointer_declarator "*param_8" * identifier)) ))) (compound_statement "{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}" { (declaration "uint *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "int extraout_ECX;" primitive_type identifier ;) (declaration "int extraout_ECX_00;" primitive_type identifier ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "uint uVar3;" type_identifier identifier ;) (declaration "undefined8 uVar4;" type_identifier identifier ;) (declaration "int local_34;" primitive_type identifier ;) (declaration "undefined4 local_30;" type_identifier identifier ;) (declaration "byte local_25;" type_identifier identifier ;) (expression_statement "uVar4 = CONCAT44(param_2[0x12],0xffff8000);" (assignment_expression "uVar4 = CONCAT44(param_2[0x12],0xffff8000)" identifier = (call_expression "CONCAT44(param_2[0x12],0xffff8000)" identifier (argument_list "(param_2[0x12],0xffff8000)" ( (subscript_expression "param_2[0x12]" identifier [ number_literal ]) , number_literal )))) ;) (expression_statement "local_25 = param_4;" (assignment_expression "local_25 = param_4" identifier = identifier) ;) (expression_statement "iVar2 = param_3;" (assignment_expression "iVar2 = param_3" identifier = identifier) ;) (if_statement "if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }" if (parenthesized_expression "(param_2[0x12] != 0)" ( (binary_expression "param_2[0x12] != 0" (subscript_expression "param_2[0x12]" identifier [ number_literal ]) != number_literal) )) (compound_statement "{\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }" { (expression_statement "uVar4 = FUN_0002a630();" (assignment_expression "uVar4 = FUN_0002a630()" identifier = (call_expression "FUN_0002a630()" identifier (argument_list "()" ( )))) ;) (expression_statement "iVar2 = extraout_ECX;" (assignment_expression "iVar2 = extraout_ECX" identifier = identifier) ;) })) (expression_statement "local_30 = (undefined4)uVar4;" (assignment_expression "local_30 = (undefined4)uVar4" identifier = (cast_expression "(undefined4)uVar4" ( (type_descriptor "undefined4" type_identifier) ) identifier)) ;) (expression_statement "uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));" (assignment_expression "uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" identifier = (call_expression "CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" identifier (argument_list "((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" ( (cast_expression "(int)((ulonglong)uVar4 >> 0x20)" ( (type_descriptor "int" primitive_type) ) (parenthesized_expression "((ulonglong)uVar4 >> 0x20)" ( (binary_expression "(ulonglong)uVar4 >> 0x20" (cast_expression "(ulonglong)uVar4" ( (type_descriptor "ulonglong" type_identifier) ) identifier) >> number_literal) ))) , (pointer_expression "*(int *)(param_1 + 8)" * (cast_expression "(int *)(param_1 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) )))) ;) (if_statement "if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }" if (parenthesized_expression "(*(int *)(param_1 + 8) == 0)" ( (binary_expression "*(int *)(param_1 + 8) == 0" (pointer_expression "*(int *)(param_1 + 8)" * (cast_expression "(int *)(param_1 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) == number_literal) )) (compound_statement "{\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }" { (expression_statement "uVar4 = FUN_000318c0();" (assignment_expression "uVar4 = FUN_000318c0()" identifier = (call_expression "FUN_000318c0()" identifier (argument_list "()" ( )))) ;) (expression_statement "iVar2 = extraout_ECX_00;" (assignment_expression "iVar2 = extraout_ECX_00" identifier = identifier) ;) })) (expression_statement "local_34 = (int)uVar4;" (assignment_expression "local_34 = (int)uVar4" identifier = (cast_expression "(int)uVar4" ( (type_descriptor "int" primitive_type) ) identifier)) ;) (if_statement "if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }" if (parenthesized_expression "((int)param_5 < 0)" ( (binary_expression "(int)param_5 < 0" (cast_expression "(int)param_5" ( (type_descriptor "int" primitive_type) ) identifier) < number_literal) )) (compound_statement "{\n    param_5 = *(uint *)(param_1 + 0x28);\n  }" { (expression_statement "param_5 = *(uint *)(param_1 + 0x28);" (assignment_expression "param_5 = *(uint *)(param_1 + 0x28)" identifier = (pointer_expression "*(uint *)(param_1 + 0x28)" * (cast_expression "(uint *)(param_1 + 0x28)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x28)" ( (binary_expression "param_1 + 0x28" identifier + number_literal) ))))) ;) })) (expression_statement "uVar3 = (uint)((ulonglong)uVar4 >> 0x20);" (assignment_expression "uVar3 = (uint)((ulonglong)uVar4 >> 0x20)" identifier = (call_expression "(uint)((ulonglong)uVar4 >> 0x20)" (parenthesized_expression "(uint)" ( identifier )) (argument_list "((ulonglong)uVar4 >> 0x20)" ( (binary_expression "(ulonglong)uVar4 >> 0x20" (cast_expression "(ulonglong)uVar4" ( (type_descriptor "ulonglong" type_identifier) ) identifier) >> number_literal) )))) ;) (if_statement "if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }" if (parenthesized_expression "(param_7 != (uint *)0x0)" ( (binary_expression "param_7 != (uint *)0x0" identifier != (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }" { (expression_statement "*param_7 = param_5;" (assignment_expression "*param_7 = param_5" (pointer_expression "*param_7" * identifier) = identifier) ;) (expression_statement "uVar3 = param_5;" (assignment_expression "uVar3 = param_5" identifier = identifier) ;) })) (if_statement "if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" if (parenthesized_expression "(((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0'))))" ( (binary_expression "((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))" (parenthesized_expression "((*(byte *)(param_2 + 9) & 0x80) == 0)" ( (binary_expression "(*(byte *)(param_2 + 9) & 0x80) == 0" (parenthesized_expression "(*(byte *)(param_2 + 9) & 0x80)" ( (binary_expression "*(byte *)(param_2 + 9) & 0x80" (pointer_expression "*(byte *)(param_2 + 9)" * (cast_expression "(byte *)(param_2 + 9)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 9)" ( (binary_expression "param_2 + 9" identifier + number_literal) )))) & number_literal) )) == number_literal) )) && (parenthesized_expression "((param_6 == (char *)0x0 || (*param_6 != '\0')))" ( (parenthesized_expression "(param_6 == (char *)0x0 || (*param_6 != '\0'))" ( (binary_expression "param_6 == (char *)0x0 || (*param_6 != '\0')" (binary_expression "param_6 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) || (parenthesized_expression "(*param_6 != '\0')" ( (binary_expression "*param_6 != '\0'" (pointer_expression "*param_6" * identifier) != (char_literal "'\0'" ' escape_sequence ')) ))) )) ))) )) (compound_statement "{\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }" { (expression_statement "FUN_0004b430(param_2,param_3,iVar2,iVar2);" (call_expression "FUN_0004b430(param_2,param_3,iVar2,iVar2)" identifier (argument_list "(param_2,param_3,iVar2,iVar2)" ( identifier , identifier , identifier , identifier ))) ;) }) (else_clause "else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" else (compound_statement "{\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" { (expression_statement "FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);" (call_expression "FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3)" identifier (argument_list "(param_3 == 0x61,*param_2,uVar3,uVar3)" ( (binary_expression "param_3 == 0x61" identifier == number_literal) , (pointer_expression "*param_2" * identifier) , identifier , identifier ))) ;) }))) (if_statement "if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }" if (parenthesized_expression "(param_8 != (uint *)0x0)" ( (binary_expression "param_8 != (uint *)0x0" identifier != (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    *param_8 = param_5 + 1;\n  }" { (expression_statement "*param_8 = param_5 + 1;" (assignment_expression "*param_8 = param_5 + 1" (pointer_expression "*param_8" * identifier) = (binary_expression "param_5 + 1" identifier + number_literal)) ;) })) (expression_statement "uVar3 = param_5 + 1;" (assignment_expression "uVar3 = param_5 + 1" identifier = (binary_expression "param_5 + 1" identifier + number_literal)) ;) (for_statement "for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }" for ( (assignment_expression "iVar2 = param_2[2]" identifier = (subscript_expression "param_2[2]" identifier [ number_literal ])) ; (binary_expression "iVar2 != 0" identifier != number_literal) ; (assignment_expression "iVar2 = *(int *)(iVar2 + 0x14)" identifier = (pointer_expression "*(int *)(iVar2 + 0x14)" * (cast_expression "(int *)(iVar2 + 0x14)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x14)" ( (binary_expression "iVar2 + 0x14" identifier + number_literal) ))))) ) (compound_statement "{\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }" { (expression_statement "puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);" (assignment_expression "puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3)" identifier = (cast_expression "(uint *)(*(byte *)(iVar2 + 0x37) & 3)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(byte *)(iVar2 + 0x37) & 3)" ( (binary_expression "*(byte *)(iVar2 + 0x37) & 3" (pointer_expression "*(byte *)(iVar2 + 0x37)" * (cast_expression "(byte *)(iVar2 + 0x37)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x37)" ( (binary_expression "iVar2 + 0x37" identifier + number_literal) )))) & number_literal) )))) ;) (if_statement "if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }" if (parenthesized_expression "((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0))" ( (binary_expression "(((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)" (parenthesized_expression "(((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0))" ( (binary_expression "((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)" (parenthesized_expression "((char)puVar1 == '\x02')" ( (binary_expression "(char)puVar1 == '\x02'" (cast_expression "(char)puVar1" ( (type_descriptor "char" primitive_type) ) identifier) == (char_literal "'\x02'" ' escape_sequence ')) )) && (parenthesized_expression "((*(byte *)(param_2 + 9) & 0x80) != 0)" ( (binary_expression "(*(byte *)(param_2 + 9) & 0x80) != 0" (parenthesized_expression "(*(byte *)(param_2 + 9) & 0x80)" ( (binary_expression "*(byte *)(param_2 + 9) & 0x80" (pointer_expression "*(byte *)(param_2 + 9)" * (cast_expression "(byte *)(param_2 + 9)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 9)" ( (binary_expression "param_2 + 9" identifier + number_literal) )))) & number_literal) )) != number_literal) ))) )) && (parenthesized_expression "(local_25 = 0, param_7 != (uint *)0x0)" ( (comma_expression "local_25 = 0, param_7 != (uint *)0x0" (assignment_expression "local_25 = 0" identifier = number_literal) , (binary_expression "param_7 != (uint *)0x0" identifier != (cast_expression "(uint *)0x0" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal))) ))) )) (compound_statement "{\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }" { (expression_statement "*param_7 = uVar3;" (assignment_expression "*param_7 = uVar3" (pointer_expression "*param_7" * identifier) = identifier) ;) (expression_statement "puVar1 = param_7;" (assignment_expression "puVar1 = param_7" identifier = identifier) ;) })) (if_statement "if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }" if (parenthesized_expression "((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       )" ( (binary_expression "(param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')" (parenthesized_expression "(param_6 == (char *)0x0)" ( (binary_expression "param_6 == (char *)0x0" identifier == (cast_expression "(char *)0x0" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) || (parenthesized_expression "(puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')" ( (comma_expression "puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0'" (assignment_expression "puVar1 = (uint *)(param_6 + -param_5)" identifier = (cast_expression "(uint *)(param_6 + -param_5)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_6 + -param_5)" ( (binary_expression "param_6 + -param_5" identifier + (unary_expression "-param_5" - identifier)) )))) , (binary_expression "*(char *)((int)(param_6 + -param_5) + uVar3) != '\0'" (pointer_expression "*(char *)((int)(param_6 + -param_5) + uVar3)" * (cast_expression "(char *)((int)(param_6 + -param_5) + uVar3)" ( (type_descriptor "char *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "((int)(param_6 + -param_5) + uVar3)" ( (binary_expression "(int)(param_6 + -param_5) + uVar3" (cast_expression "(int)(param_6 + -param_5)" ( (type_descriptor "int" primitive_type) ) (parenthesized_expression "(param_6 + -param_5)" ( (binary_expression "param_6 + -param_5" identifier + (unary_expression "-param_5" - identifier)) ))) + identifier) )))) != (char_literal "'\0'" ' escape_sequence '))) ))) )) (compound_statement "{\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }" { (expression_statement "FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);" (call_expression "FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1)" identifier (argument_list "(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1)" ( (pointer_expression "*(undefined4 *)(iVar2 + 0x2c)" * (cast_expression "(undefined4 *)(iVar2 + 0x2c)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar2 + 0x2c)" ( (binary_expression "iVar2 + 0x2c" identifier + number_literal) )))) , identifier , identifier , identifier ))) ;) (expression_statement "FUN_0004b400();" (call_expression "FUN_0004b400()" identifier (argument_list "()" ( ))) ;) (if_statement "if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }" if (parenthesized_expression "(0 < *(int *)(local_34 + 0x68))" ( (binary_expression "0 < *(int *)(local_34 + 0x68)" number_literal < (pointer_expression "*(int *)(local_34 + 0x68)" * (cast_expression "(int *)(local_34 + 0x68)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(local_34 + 0x68)" ( (binary_expression "local_34 + 0x68" identifier + number_literal) ))))) )) (compound_statement "{\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }" { (expression_statement "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;" (assignment_expression "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25" (pointer_expression "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" * (cast_expression "(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" ( (type_descriptor "ushort *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" ( (binary_expression "*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12" (binary_expression "*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100)" (binary_expression "*(int *)(local_34 + 0x68) * 0x14" (pointer_expression "*(int *)(local_34 + 0x68)" * (cast_expression "(int *)(local_34 + 0x68)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(local_34 + 0x68)" ( (binary_expression "local_34 + 0x68" identifier + number_literal) )))) * number_literal) + (pointer_expression "*(int *)(local_34 + 100)" * (cast_expression "(int *)(local_34 + 100)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(local_34 + 100)" ( (binary_expression "local_34 + 100" identifier + number_literal) ))))) + number_literal) )))) = (cast_expression "(ushort)local_25" ( (type_descriptor "ushort" type_identifier) ) identifier)) ;) })) })) (expression_statement "uVar3 = uVar3 + 1;" (assignment_expression "uVar3 = uVar3 + 1" identifier = (binary_expression "uVar3 + 1" identifier + number_literal)) ;) })) (if_statement "if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }" if (parenthesized_expression "(*(int *)(param_1 + 0x28) < (int)uVar3)" ( (binary_expression "*(int *)(param_1 + 0x28) < (int)uVar3" (pointer_expression "*(int *)(param_1 + 0x28)" * (cast_expression "(int *)(param_1 + 0x28)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x28)" ( (binary_expression "param_1 + 0x28" identifier + number_literal) )))) < (cast_expression "(int)uVar3" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }" { (expression_statement "*(uint *)(param_1 + 0x28) = uVar3;" (assignment_expression "*(uint *)(param_1 + 0x28) = uVar3" (pointer_expression "*(uint *)(param_1 + 0x28)" * (cast_expression "(uint *)(param_1 + 0x28)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x28)" ( (binary_expression "param_1 + 0x28" identifier + number_literal) )))) = identifier) ;) })) (return_statement "return ~param_5 + uVar3;" return (binary_expression "~param_5 + uVar3" (unary_expression "~param_5" ~ identifier) + identifier) ;) })))
(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) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) ))) (compound_statement { (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( (subscript_expression IDENT [ LIT ]) , LIT )))) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( (cast_expression ( (type_descriptor TYPE) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) >> LIT) ))) , (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) )))) ;) (if_statement if (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) < LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) })) (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) >> LIT) )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) })) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) & LIT) )) == LIT) )) && (parenthesized_expression ( (parenthesized_expression ( (binary_expression (binary_expression IDENT == (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) || (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) != (char_literal ' escape_sequence ')) ))) )) ))) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( IDENT , IDENT , IDENT , IDENT ))) ;) }) (else_clause else (compound_statement { (expression_statement (call_expression IDENT (argument_list ( (binary_expression IDENT == LIT) , (pointer_expression * IDENT) , IDENT , IDENT ))) ;) }))) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression IDENT + LIT)) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (for_statement for ( (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ; (binary_expression IDENT != LIT) ; (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) & LIT) )))) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) == (char_literal ' escape_sequence ')) )) && (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) & LIT) )) != LIT) ))) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = LIT) , (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT))) ))) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) })) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) || (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + (unary_expression - IDENT)) )))) , (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) (parenthesized_expression ( (binary_expression IDENT + (unary_expression - IDENT)) ))) + IDENT) )))) != (char_literal ' escape_sequence '))) ))) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) , IDENT , IDENT , IDENT ))) ;) (expression_statement (call_expression IDENT (argument_list ( ))) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (binary_expression (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) * LIT) + (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) + LIT) )))) = (cast_expression ( (type_descriptor TYPE) ) IDENT)) ;) })) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) })) (if_statement if (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) < (cast_expression ( (type_descriptor TYPE) ) IDENT)) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = IDENT) ;) })) (return_statement return (binary_expression (unary_expression ~ IDENT) + IDENT) ;) })))
(function_definition "int __regparm3\nFUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)\n\n{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}" (primitive_type "int") (ERROR "__regparm3" (identifier "__regparm3")) (function_declarator "FUN_00017bea(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)" (identifier "FUN_00017bea") (parameter_list "(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,\n            uint *param_7,uint *param_8)" (( "(") (parameter_declaration "int param_1" (primitive_type "int") (identifier "param_1")) (, ",") (parameter_declaration "undefined4 *param_2" (type_identifier "undefined4") (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) (, ",") (parameter_declaration "int param_3" (primitive_type "int") (identifier "param_3")) (, ",") (parameter_declaration "byte param_4" (type_identifier "byte") (identifier "param_4")) (, ",") (parameter_declaration "uint param_5" (type_identifier "uint") (identifier "param_5")) (, ",") (parameter_declaration "char *param_6" (primitive_type "char") (pointer_declarator "*param_6" (* "*") (identifier "param_6"))) (, ",") (parameter_declaration "uint *param_7" (type_identifier "uint") (pointer_declarator "*param_7" (* "*") (identifier "param_7"))) (, ",") (parameter_declaration "uint *param_8" (type_identifier "uint") (pointer_declarator "*param_8" (* "*") (identifier "param_8"))) () ")"))) (compound_statement "{\n  uint *puVar1;\n  int extraout_ECX;\n  int extraout_ECX_00;\n  int iVar2;\n  uint uVar3;\n  undefined8 uVar4;\n  int local_34;\n  undefined4 local_30;\n  byte local_25;\n  \n  uVar4 = CONCAT44(param_2[0x12],0xffff8000);\n  local_25 = param_4;\n  iVar2 = param_3;\n  if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }\n  local_30 = (undefined4)uVar4;\n  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));\n  if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }\n  local_34 = (int)uVar4;\n  if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }\n  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);\n  if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }\n  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }\n  if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }\n  uVar3 = param_5 + 1;\n  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }\n  if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }\n  return ~param_5 + uVar3;\n}" ({ "{") (declaration "uint *puVar1;" (type_identifier "uint") (pointer_declarator "*puVar1" (* "*") (identifier "puVar1")) (; ";")) (declaration "int extraout_ECX;" (primitive_type "int") (identifier "extraout_ECX") (; ";")) (declaration "int extraout_ECX_00;" (primitive_type "int") (identifier "extraout_ECX_00") (; ";")) (declaration "int iVar2;" (primitive_type "int") (identifier "iVar2") (; ";")) (declaration "uint uVar3;" (type_identifier "uint") (identifier "uVar3") (; ";")) (declaration "undefined8 uVar4;" (type_identifier "undefined8") (identifier "uVar4") (; ";")) (declaration "int local_34;" (primitive_type "int") (identifier "local_34") (; ";")) (declaration "undefined4 local_30;" (type_identifier "undefined4") (identifier "local_30") (; ";")) (declaration "byte local_25;" (type_identifier "byte") (identifier "local_25") (; ";")) (expression_statement "uVar4 = CONCAT44(param_2[0x12],0xffff8000);" (assignment_expression "uVar4 = CONCAT44(param_2[0x12],0xffff8000)" (identifier "uVar4") (= "=") (call_expression "CONCAT44(param_2[0x12],0xffff8000)" (identifier "CONCAT44") (argument_list "(param_2[0x12],0xffff8000)" (( "(") (subscript_expression "param_2[0x12]" (identifier "param_2") ([ "[") (number_literal "0x12") (] "]")) (, ",") (number_literal "0xffff8000") () ")")))) (; ";")) (expression_statement "local_25 = param_4;" (assignment_expression "local_25 = param_4" (identifier "local_25") (= "=") (identifier "param_4")) (; ";")) (expression_statement "iVar2 = param_3;" (assignment_expression "iVar2 = param_3" (identifier "iVar2") (= "=") (identifier "param_3")) (; ";")) (if_statement "if (param_2[0x12] != 0) {\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }" (if "if") (parenthesized_expression "(param_2[0x12] != 0)" (( "(") (binary_expression "param_2[0x12] != 0" (subscript_expression "param_2[0x12]" (identifier "param_2") ([ "[") (number_literal "0x12") (] "]")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    uVar4 = FUN_0002a630();\n    iVar2 = extraout_ECX;\n  }" ({ "{") (expression_statement "uVar4 = FUN_0002a630();" (assignment_expression "uVar4 = FUN_0002a630()" (identifier "uVar4") (= "=") (call_expression "FUN_0002a630()" (identifier "FUN_0002a630") (argument_list "()" (( "(") () ")")))) (; ";")) (expression_statement "iVar2 = extraout_ECX;" (assignment_expression "iVar2 = extraout_ECX" (identifier "iVar2") (= "=") (identifier "extraout_ECX")) (; ";")) (} "}"))) (expression_statement "local_30 = (undefined4)uVar4;" (assignment_expression "local_30 = (undefined4)uVar4" (identifier "local_30") (= "=") (cast_expression "(undefined4)uVar4" (( "(") (type_descriptor "undefined4" (type_identifier "undefined4")) () ")") (identifier "uVar4"))) (; ";")) (expression_statement "uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));" (assignment_expression "uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" (identifier "uVar4") (= "=") (call_expression "CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" (identifier "CONCAT44") (argument_list "((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8))" (( "(") (cast_expression "(int)((ulonglong)uVar4 >> 0x20)" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (parenthesized_expression "((ulonglong)uVar4 >> 0x20)" (( "(") (binary_expression "(ulonglong)uVar4 >> 0x20" (cast_expression "(ulonglong)uVar4" (( "(") (type_descriptor "ulonglong" (type_identifier "ulonglong")) () ")") (identifier "uVar4")) (>> ">>") (number_literal "0x20")) () ")"))) (, ",") (pointer_expression "*(int *)(param_1 + 8)" (* "*") (cast_expression "(int *)(param_1 + 8)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")")))) () ")")))) (; ";")) (if_statement "if (*(int *)(param_1 + 8) == 0) {\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }" (if "if") (parenthesized_expression "(*(int *)(param_1 + 8) == 0)" (( "(") (binary_expression "*(int *)(param_1 + 8) == 0" (pointer_expression "*(int *)(param_1 + 8)" (* "*") (cast_expression "(int *)(param_1 + 8)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")")))) (== "==") (number_literal "0")) () ")")) (compound_statement "{\n    uVar4 = FUN_000318c0();\n    iVar2 = extraout_ECX_00;\n  }" ({ "{") (expression_statement "uVar4 = FUN_000318c0();" (assignment_expression "uVar4 = FUN_000318c0()" (identifier "uVar4") (= "=") (call_expression "FUN_000318c0()" (identifier "FUN_000318c0") (argument_list "()" (( "(") () ")")))) (; ";")) (expression_statement "iVar2 = extraout_ECX_00;" (assignment_expression "iVar2 = extraout_ECX_00" (identifier "iVar2") (= "=") (identifier "extraout_ECX_00")) (; ";")) (} "}"))) (expression_statement "local_34 = (int)uVar4;" (assignment_expression "local_34 = (int)uVar4" (identifier "local_34") (= "=") (cast_expression "(int)uVar4" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "uVar4"))) (; ";")) (if_statement "if ((int)param_5 < 0) {\n    param_5 = *(uint *)(param_1 + 0x28);\n  }" (if "if") (parenthesized_expression "((int)param_5 < 0)" (( "(") (binary_expression "(int)param_5 < 0" (cast_expression "(int)param_5" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "param_5")) (< "<") (number_literal "0")) () ")")) (compound_statement "{\n    param_5 = *(uint *)(param_1 + 0x28);\n  }" ({ "{") (expression_statement "param_5 = *(uint *)(param_1 + 0x28);" (assignment_expression "param_5 = *(uint *)(param_1 + 0x28)" (identifier "param_5") (= "=") (pointer_expression "*(uint *)(param_1 + 0x28)" (* "*") (cast_expression "(uint *)(param_1 + 0x28)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x28)" (( "(") (binary_expression "param_1 + 0x28" (identifier "param_1") (+ "+") (number_literal "0x28")) () ")"))))) (; ";")) (} "}"))) (expression_statement "uVar3 = (uint)((ulonglong)uVar4 >> 0x20);" (assignment_expression "uVar3 = (uint)((ulonglong)uVar4 >> 0x20)" (identifier "uVar3") (= "=") (call_expression "(uint)((ulonglong)uVar4 >> 0x20)" (parenthesized_expression "(uint)" (( "(") (identifier "uint") () ")")) (argument_list "((ulonglong)uVar4 >> 0x20)" (( "(") (binary_expression "(ulonglong)uVar4 >> 0x20" (cast_expression "(ulonglong)uVar4" (( "(") (type_descriptor "ulonglong" (type_identifier "ulonglong")) () ")") (identifier "uVar4")) (>> ">>") (number_literal "0x20")) () ")")))) (; ";")) (if_statement "if (param_7 != (uint *)0x0) {\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }" (if "if") (parenthesized_expression "(param_7 != (uint *)0x0)" (( "(") (binary_expression "param_7 != (uint *)0x0" (identifier "param_7") (!= "!=") (cast_expression "(uint *)0x0" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    *param_7 = param_5;\n    uVar3 = param_5;\n  }" ({ "{") (expression_statement "*param_7 = param_5;" (assignment_expression "*param_7 = param_5" (pointer_expression "*param_7" (* "*") (identifier "param_7")) (= "=") (identifier "param_5")) (; ";")) (expression_statement "uVar3 = param_5;" (assignment_expression "uVar3 = param_5" (identifier "uVar3") (= "=") (identifier "param_5")) (; ";")) (} "}"))) (if_statement "if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }\n  else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" (if "if") (parenthesized_expression "(((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0'))))" (( "(") (binary_expression "((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))" (parenthesized_expression "((*(byte *)(param_2 + 9) & 0x80) == 0)" (( "(") (binary_expression "(*(byte *)(param_2 + 9) & 0x80) == 0" (parenthesized_expression "(*(byte *)(param_2 + 9) & 0x80)" (( "(") (binary_expression "*(byte *)(param_2 + 9) & 0x80" (pointer_expression "*(byte *)(param_2 + 9)" (* "*") (cast_expression "(byte *)(param_2 + 9)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_2 + 9)" (( "(") (binary_expression "param_2 + 9" (identifier "param_2") (+ "+") (number_literal "9")) () ")")))) (& "&") (number_literal "0x80")) () ")")) (== "==") (number_literal "0")) () ")")) (&& "&&") (parenthesized_expression "((param_6 == (char *)0x0 || (*param_6 != '\0')))" (( "(") (parenthesized_expression "(param_6 == (char *)0x0 || (*param_6 != '\0'))" (( "(") (binary_expression "param_6 == (char *)0x0 || (*param_6 != '\0')" (binary_expression "param_6 == (char *)0x0" (identifier "param_6") (== "==") (cast_expression "(char *)0x0" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) (|| "||") (parenthesized_expression "(*param_6 != '\0')" (( "(") (binary_expression "*param_6 != '\0'" (pointer_expression "*param_6" (* "*") (identifier "param_6")) (!= "!=") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'"))) () ")"))) () ")")) () ")"))) () ")")) (compound_statement "{\n    FUN_0004b430(param_2,param_3,iVar2,iVar2);\n  }" ({ "{") (expression_statement "FUN_0004b430(param_2,param_3,iVar2,iVar2);" (call_expression "FUN_0004b430(param_2,param_3,iVar2,iVar2)" (identifier "FUN_0004b430") (argument_list "(param_2,param_3,iVar2,iVar2)" (( "(") (identifier "param_2") (, ",") (identifier "param_3") (, ",") (identifier "iVar2") (, ",") (identifier "iVar2") () ")"))) (; ";")) (} "}")) (else_clause "else {\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" (else "else") (compound_statement "{\n    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);\n  }" ({ "{") (expression_statement "FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);" (call_expression "FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3)" (identifier "FUN_000309e0") (argument_list "(param_3 == 0x61,*param_2,uVar3,uVar3)" (( "(") (binary_expression "param_3 == 0x61" (identifier "param_3") (== "==") (number_literal "0x61")) (, ",") (pointer_expression "*param_2" (* "*") (identifier "param_2")) (, ",") (identifier "uVar3") (, ",") (identifier "uVar3") () ")"))) (; ";")) (} "}")))) (if_statement "if (param_8 != (uint *)0x0) {\n    *param_8 = param_5 + 1;\n  }" (if "if") (parenthesized_expression "(param_8 != (uint *)0x0)" (( "(") (binary_expression "param_8 != (uint *)0x0" (identifier "param_8") (!= "!=") (cast_expression "(uint *)0x0" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    *param_8 = param_5 + 1;\n  }" ({ "{") (expression_statement "*param_8 = param_5 + 1;" (assignment_expression "*param_8 = param_5 + 1" (pointer_expression "*param_8" (* "*") (identifier "param_8")) (= "=") (binary_expression "param_5 + 1" (identifier "param_5") (+ "+") (number_literal "1"))) (; ";")) (} "}"))) (expression_statement "uVar3 = param_5 + 1;" (assignment_expression "uVar3 = param_5 + 1" (identifier "uVar3") (= "=") (binary_expression "param_5 + 1" (identifier "param_5") (+ "+") (number_literal "1"))) (; ";")) (for_statement "for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }" (for "for") (( "(") (assignment_expression "iVar2 = param_2[2]" (identifier "iVar2") (= "=") (subscript_expression "param_2[2]" (identifier "param_2") ([ "[") (number_literal "2") (] "]"))) (; ";") (binary_expression "iVar2 != 0" (identifier "iVar2") (!= "!=") (number_literal "0")) (; ";") (assignment_expression "iVar2 = *(int *)(iVar2 + 0x14)" (identifier "iVar2") (= "=") (pointer_expression "*(int *)(iVar2 + 0x14)" (* "*") (cast_expression "(int *)(iVar2 + 0x14)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0x14)" (( "(") (binary_expression "iVar2 + 0x14" (identifier "iVar2") (+ "+") (number_literal "0x14")) () ")"))))) () ")") (compound_statement "{\n    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);\n    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }\n    if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }\n    uVar3 = uVar3 + 1;\n  }" ({ "{") (expression_statement "puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);" (assignment_expression "puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3)" (identifier "puVar1") (= "=") (cast_expression "(uint *)(*(byte *)(iVar2 + 0x37) & 3)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*(byte *)(iVar2 + 0x37) & 3)" (( "(") (binary_expression "*(byte *)(iVar2 + 0x37) & 3" (pointer_expression "*(byte *)(iVar2 + 0x37)" (* "*") (cast_expression "(byte *)(iVar2 + 0x37)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0x37)" (( "(") (binary_expression "iVar2 + 0x37" (identifier "iVar2") (+ "+") (number_literal "0x37")) () ")")))) (& "&") (number_literal "3")) () ")")))) (; ";")) (if_statement "if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)) {\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }" (if "if") (parenthesized_expression "((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0))" (( "(") (binary_expression "(((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&\n       (local_25 = 0, param_7 != (uint *)0x0)" (parenthesized_expression "(((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0))" (( "(") (binary_expression "((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)" (parenthesized_expression "((char)puVar1 == '\x02')" (( "(") (binary_expression "(char)puVar1 == '\x02'" (cast_expression "(char)puVar1" (( "(") (type_descriptor "char" (primitive_type "char")) () ")") (identifier "puVar1")) (== "==") (char_literal "'\x02'" (' "'") (escape_sequence "\x02") (' "'"))) () ")")) (&& "&&") (parenthesized_expression "((*(byte *)(param_2 + 9) & 0x80) != 0)" (( "(") (binary_expression "(*(byte *)(param_2 + 9) & 0x80) != 0" (parenthesized_expression "(*(byte *)(param_2 + 9) & 0x80)" (( "(") (binary_expression "*(byte *)(param_2 + 9) & 0x80" (pointer_expression "*(byte *)(param_2 + 9)" (* "*") (cast_expression "(byte *)(param_2 + 9)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_2 + 9)" (( "(") (binary_expression "param_2 + 9" (identifier "param_2") (+ "+") (number_literal "9")) () ")")))) (& "&") (number_literal "0x80")) () ")")) (!= "!=") (number_literal "0")) () ")"))) () ")")) (&& "&&") (parenthesized_expression "(local_25 = 0, param_7 != (uint *)0x0)" (( "(") (comma_expression "local_25 = 0, param_7 != (uint *)0x0" (assignment_expression "local_25 = 0" (identifier "local_25") (= "=") (number_literal "0")) (, ",") (binary_expression "param_7 != (uint *)0x0" (identifier "param_7") (!= "!=") (cast_expression "(uint *)0x0" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0")))) () ")"))) () ")")) (compound_statement "{\n      *param_7 = uVar3;\n      puVar1 = param_7;\n    }" ({ "{") (expression_statement "*param_7 = uVar3;" (assignment_expression "*param_7 = uVar3" (pointer_expression "*param_7" (* "*") (identifier "param_7")) (= "=") (identifier "uVar3")) (; ";")) (expression_statement "puVar1 = param_7;" (assignment_expression "puVar1 = param_7" (identifier "puVar1") (= "=") (identifier "param_7")) (; ";")) (} "}"))) (if_statement "if ((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       ) {\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }" (if "if") (parenthesized_expression "((param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')\n       )" (( "(") (binary_expression "(param_6 == (char *)0x0) ||\n       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')" (parenthesized_expression "(param_6 == (char *)0x0)" (( "(") (binary_expression "param_6 == (char *)0x0" (identifier "param_6") (== "==") (cast_expression "(char *)0x0" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (|| "||") (parenthesized_expression "(puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')" (( "(") (comma_expression "puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0'" (assignment_expression "puVar1 = (uint *)(param_6 + -param_5)" (identifier "puVar1") (= "=") (cast_expression "(uint *)(param_6 + -param_5)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_6 + -param_5)" (( "(") (binary_expression "param_6 + -param_5" (identifier "param_6") (+ "+") (unary_expression "-param_5" (- "-") (identifier "param_5"))) () ")")))) (, ",") (binary_expression "*(char *)((int)(param_6 + -param_5) + uVar3) != '\0'" (pointer_expression "*(char *)((int)(param_6 + -param_5) + uVar3)" (* "*") (cast_expression "(char *)((int)(param_6 + -param_5) + uVar3)" (( "(") (type_descriptor "char *" (primitive_type "char") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "((int)(param_6 + -param_5) + uVar3)" (( "(") (binary_expression "(int)(param_6 + -param_5) + uVar3" (cast_expression "(int)(param_6 + -param_5)" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (parenthesized_expression "(param_6 + -param_5)" (( "(") (binary_expression "param_6 + -param_5" (identifier "param_6") (+ "+") (unary_expression "-param_5" (- "-") (identifier "param_5"))) () ")"))) (+ "+") (identifier "uVar3")) () ")")))) (!= "!=") (char_literal "'\0'" (' "'") (escape_sequence "\0") (' "'")))) () ")"))) () ")")) (compound_statement "{\n      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);\n      FUN_0004b400();\n      if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }\n    }" ({ "{") (expression_statement "FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);" (call_expression "FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1)" (identifier "FUN_000315c0") (argument_list "(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1)" (( "(") (pointer_expression "*(undefined4 *)(iVar2 + 0x2c)" (* "*") (cast_expression "(undefined4 *)(iVar2 + 0x2c)" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar2 + 0x2c)" (( "(") (binary_expression "iVar2 + 0x2c" (identifier "iVar2") (+ "+") (number_literal "0x2c")) () ")")))) (, ",") (identifier "local_30") (, ",") (identifier "puVar1") (, ",") (identifier "puVar1") () ")"))) (; ";")) (expression_statement "FUN_0004b400();" (call_expression "FUN_0004b400()" (identifier "FUN_0004b400") (argument_list "()" (( "(") () ")"))) (; ";")) (if_statement "if (0 < *(int *)(local_34 + 0x68)) {\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }" (if "if") (parenthesized_expression "(0 < *(int *)(local_34 + 0x68))" (( "(") (binary_expression "0 < *(int *)(local_34 + 0x68)" (number_literal "0") (< "<") (pointer_expression "*(int *)(local_34 + 0x68)" (* "*") (cast_expression "(int *)(local_34 + 0x68)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(local_34 + 0x68)" (( "(") (binary_expression "local_34 + 0x68" (identifier "local_34") (+ "+") (number_literal "0x68")) () ")"))))) () ")")) (compound_statement "{\n        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;\n      }" ({ "{") (expression_statement "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25;" (assignment_expression "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =\n             (ushort)local_25" (pointer_expression "*(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" (* "*") (cast_expression "(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" (( "(") (type_descriptor "ushort *" (type_identifier "ushort") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12)" (( "(") (binary_expression "*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12" (binary_expression "*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100)" (binary_expression "*(int *)(local_34 + 0x68) * 0x14" (pointer_expression "*(int *)(local_34 + 0x68)" (* "*") (cast_expression "(int *)(local_34 + 0x68)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(local_34 + 0x68)" (( "(") (binary_expression "local_34 + 0x68" (identifier "local_34") (+ "+") (number_literal "0x68")) () ")")))) (* "*") (number_literal "0x14")) (+ "+") (pointer_expression "*(int *)(local_34 + 100)" (* "*") (cast_expression "(int *)(local_34 + 100)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(local_34 + 100)" (( "(") (binary_expression "local_34 + 100" (identifier "local_34") (+ "+") (number_literal "100")) () ")"))))) (+ "+") (number_literal "-0x12")) () ")")))) (= "=") (cast_expression "(ushort)local_25" (( "(") (type_descriptor "ushort" (type_identifier "ushort")) () ")") (identifier "local_25"))) (; ";")) (} "}"))) (} "}"))) (expression_statement "uVar3 = uVar3 + 1;" (assignment_expression "uVar3 = uVar3 + 1" (identifier "uVar3") (= "=") (binary_expression "uVar3 + 1" (identifier "uVar3") (+ "+") (number_literal "1"))) (; ";")) (} "}"))) (if_statement "if (*(int *)(param_1 + 0x28) < (int)uVar3) {\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }" (if "if") (parenthesized_expression "(*(int *)(param_1 + 0x28) < (int)uVar3)" (( "(") (binary_expression "*(int *)(param_1 + 0x28) < (int)uVar3" (pointer_expression "*(int *)(param_1 + 0x28)" (* "*") (cast_expression "(int *)(param_1 + 0x28)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x28)" (( "(") (binary_expression "param_1 + 0x28" (identifier "param_1") (+ "+") (number_literal "0x28")) () ")")))) (< "<") (cast_expression "(int)uVar3" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "uVar3"))) () ")")) (compound_statement "{\n    *(uint *)(param_1 + 0x28) = uVar3;\n  }" ({ "{") (expression_statement "*(uint *)(param_1 + 0x28) = uVar3;" (assignment_expression "*(uint *)(param_1 + 0x28) = uVar3" (pointer_expression "*(uint *)(param_1 + 0x28)" (* "*") (cast_expression "(uint *)(param_1 + 0x28)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x28)" (( "(") (binary_expression "param_1 + 0x28" (identifier "param_1") (+ "+") (number_literal "0x28")) () ")")))) (= "=") (identifier "uVar3")) (; ";")) (} "}"))) (return_statement "return ~param_5 + uVar3;" (return "return") (binary_expression "~param_5 + uVar3" (unary_expression "~param_5" (~ "~") (identifier "param_5")) (+ "+") (identifier "uVar3")) (; ";")) (} "}")))

int __regparm3
function_1
          (type_1 *pParse,type_2 *pTab,int var_9,type_3 p5,int var_4,type_3 *var_6,int *var_5,int *var_10
          )

{
  int var_12;
  type_4 *var_11;
  type_5 *var_2;
  int local_30;
  type_6 local_25;
  
  local_30 = -0x8000;
  local_25 = p5;
  if (pTab->pSchema != (type_7 *)0x0) {
    local_30 = var_1(pParse->db,pTab->pSchema);
  }
  var_2 = pParse->pVdbe;
  if (var_2 == (type_5 *)0x0) {
    var_2 = var_3(pParse);
  }
  if (var_4 < 0) {
    var_4 = pParse->nTab;
  }
  if (var_5 != (int *)0x0) {
    *var_5 = var_4;
  }
  if (((pTab->tabFlags & 0x80) == 0) && ((var_6 == (type_3 *)0x0 || (*var_6 != '\0')))) {
    var_7(pParse,var_4,local_30,pTab,var_9);
  }
  else {
    var_8(pParse,local_30,pTab->tnum,var_9 == 0x61,pTab->zName);
  }
  if (var_10 != (int *)0x0) {
    *var_10 = var_4 + 1;
  }
  var_12 = var_4 + 1;
  for (var_11 = pTab->pIndex; var_11 != (type_4 *)0x0; var_11 = var_11->pNext) {
    if ((((var_11->field_0x37 & 3) == 2) && ((pTab->tabFlags & 0x80) != 0)) &&
       (local_25 = 0, var_5 != (int *)0x0)) {
      *var_5 = var_12;
    }
    if ((var_6 == (type_3 *)0x0) || (var_6[var_12 + 1 + (-1 - var_4)] != '\0')) {
      var_13(var_2,var_9,var_12,var_11->tnum,local_30);
      var_14(pParse,var_11);
      if (0 < var_2->nOp) {
        var_2->aOp[var_2->nOp + -1].p5 = (type_8)local_25;
      }
    }
    var_12 = var_12 + 1;
  }
  if (pParse->nTab < var_12) {
    pParse->nTab = var_12;
  }
  return ~var_4 + var_12;
}


(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)) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))))) body: (compound_statement (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list (subscript_expression argument: (identifier) index: (number_literal)) (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: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))) (expression_statement (assignment_expression left: (identifier) right: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list (cast_expression type: (type_descriptor type: (primitive_type)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))) (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: (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: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))) (expression_statement (assignment_expression left: (identifier) right: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))))) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) right: (number_literal))) right: (parenthesized_expression (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal))) right: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (char_literal (escape_sequence))))))))) consequence: (compound_statement (expression_statement (call_expression function: (identifier) arguments: (argument_list (identifier) (identifier) (identifier) (identifier))))) alternative: (else_clause (compound_statement (expression_statement (call_expression function: (identifier) arguments: (argument_list (binary_expression left: (identifier) right: (number_literal)) (pointer_expression argument: (identifier)) (identifier) (identifier))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (for_statement initializer: (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal))) condition: (binary_expression left: (identifier) right: (number_literal)) update: (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)))))) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal)))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)) right: (char_literal (escape_sequence)))) right: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) right: (number_literal))))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (number_literal)) right: (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (number_literal))))))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal)))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (unary_expression argument: (identifier)))))) right: (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (parenthesized_expression (binary_expression left: (identifier) right: (unary_expression argument: (identifier))))) right: (identifier))))) right: (char_literal (escape_sequence))))))) consequence: (compound_statement (expression_statement (call_expression function: (identifier) arguments: (argument_list (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) (identifier) (identifier) (identifier)))) (expression_statement (call_expression function: (identifier) arguments: (argument_list))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) 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))))))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (binary_expression left: (binary_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: (number_literal)) 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)))))) right: (number_literal))))) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))))) (if_statement condition: (parenthesized_expression (binary_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: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (identifier))))) (return_statement (binary_expression left: (unary_expression argument: (identifier)) right: (identifier))))))

int __regparm3
MASKED(int param_1,undefined4 *param_2,int param_3,byte param_4,uint param_5,char *param_6,
            uint *param_7,uint *param_8)

{
  uint *puVar1;
  int extraout_ECX;
  int extraout_ECX_00;
  int iVar2;
  uint uVar3;
  undefined8 uVar4;
  int local_34;
  undefined4 local_30;
  byte local_25;
  
  uVar4 = CONCAT44(param_2[0x12],0xffff8000);
  local_25 = param_4;
  iVar2 = param_3;
  if (param_2[0x12] != 0) {
    uVar4 = FUN_0002a630();
    iVar2 = extraout_ECX;
  }
  local_30 = (undefined4)uVar4;
  uVar4 = CONCAT44((int)((ulonglong)uVar4 >> 0x20),*(int *)(param_1 + 8));
  if (*(int *)(param_1 + 8) == 0) {
    uVar4 = FUN_000318c0();
    iVar2 = extraout_ECX_00;
  }
  local_34 = (int)uVar4;
  if ((int)param_5 < 0) {
    param_5 = *(uint *)(param_1 + 0x28);
  }
  uVar3 = (uint)((ulonglong)uVar4 >> 0x20);
  if (param_7 != (uint *)0x0) {
    *param_7 = param_5;
    uVar3 = param_5;
  }
  if (((*(byte *)(param_2 + 9) & 0x80) == 0) && ((param_6 == (char *)0x0 || (*param_6 != '\0')))) {
    FUN_0004b430(param_2,param_3,iVar2,iVar2);
  }
  else {
    FUN_000309e0(param_3 == 0x61,*param_2,uVar3,uVar3);
  }
  if (param_8 != (uint *)0x0) {
    *param_8 = param_5 + 1;
  }
  uVar3 = param_5 + 1;
  for (iVar2 = param_2[2]; iVar2 != 0; iVar2 = *(int *)(iVar2 + 0x14)) {
    puVar1 = (uint *)(*(byte *)(iVar2 + 0x37) & 3);
    if ((((char)puVar1 == '\x02') && ((*(byte *)(param_2 + 9) & 0x80) != 0)) &&
       (local_25 = 0, param_7 != (uint *)0x0)) {
      *param_7 = uVar3;
      puVar1 = param_7;
    }
    if ((param_6 == (char *)0x0) ||
       (puVar1 = (uint *)(param_6 + -param_5), *(char *)((int)(param_6 + -param_5) + uVar3) != '\0')
       ) {
      FUN_000315c0(*(undefined4 *)(iVar2 + 0x2c),local_30,puVar1,puVar1);
      FUN_0004b400();
      if (0 < *(int *)(local_34 + 0x68)) {
        *(ushort *)(*(int *)(local_34 + 0x68) * 0x14 + *(int *)(local_34 + 100) + -0x12) =
             (ushort)local_25;
      }
    }
    uVar3 = uVar3 + 1;
  }
  if (*(int *)(param_1 + 0x28) < (int)uVar3) {
    *(uint *)(param_1 + 0x28) = uVar3;
  }
  return ~param_5 + uVar3;
}

