/* WARNING: Removing unreachable block (ram,0x00404068) */
/* WARNING: Removing unreachable block (ram,0x004041b0) */

undefined4 get_chr_from_file(char *param_1,char param_2,ushort *param_3,undefined4 param_4)

{
  uint uVar1;
  bool bVar2;
  uint uVar3;
  ushort uVar4;
  char *__ptr;
  FILE *__stream;
  size_t sVar5;
  uint uVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  int iVar10;
  int iVar11;
  int iVar12;
  uint uVar13;
  int iVar14;
  uint uVar15;
  uint uVar16;
  undefined4 uVar17;
  uint uVar18;
  uint uVar19;
  uint uVar20;
  uint uVar21;
  
  if (((param_1 == (char *)0x0) || (param_3 == (ushort *)0x0)) ||
     (__ptr = (char *)malloc(10), __ptr == (char *)0x0)) {   //possible issue identified - semgrep
    __stream = (FILE *)0x0;
LAB_00404428:
    uVar17 = 0xffffffff;
    goto LAB_0040442c;
  }
  __stream = fopen(param_1,"rb")   //possible issue identified - semgrep
  if (((((__stream == (FILE *)0x0) || (sVar5 = fread(__ptr,10,1,__stream), sVar5 == 0)) ||   //possible issue identified - semgrep
       ((*__ptr != -2 || ((__ptr[1] != '5' || (__ptr[2] != '0')))))) || (__ptr[3] != '9')) ||
     (__ptr[4] != '9')) goto LAB_00404484;
  uVar4 = *(ushort *)(__ptr + 6);
  __ptr = (char *)realloc(__ptr,uVar4 + 9)   //possible issue identified - semgrep
  if (__ptr == (char *)0x0) goto LAB_00404428;
  fseek(__stream,0,2);
  uVar6 = ftell(__stream);
  if (uVar6 < *(ushort *)(__ptr + 6) + 9) {
LAB_00404484:
    uVar17 = 0xffffffff;
  }
  else {
    fseek(__stream,0,0);
    sVar5 = fread(__ptr,uVar4 + 9,1,__stream)   //possible issue identified - semgrep
    if (sVar5 != 1) goto LAB_00404484;
    iVar11 = (int)(char)(param_2 - 0x21U & (char)~((char)(param_2 - 0x21U) >> 7) >> 7);
    uVar18 = 0;
    uVar6 = 0;
    for (iVar12 = 0; iVar12 < (int)(uint)*(ushort *)(__ptr + 6); iVar12 = iVar12 + 1) {
      if (iVar12 == iVar11) {
        uVar6 = uVar18;
      }
      uVar18 = uVar18 + (byte)__ptr[iVar12 + 9] & 0xffff;
    }
    uVar7 = uVar6 >> 3;
    uVar9 = uVar6 + (byte)__ptr[iVar11 + 9] & 0xffff;
    uVar20 = uVar9 >> 3;
    uVar9 = uVar9 + uVar20 * -8 & 0xffff;
    iVar11 = alloc_image(param_3,(uint)(byte)__ptr[iVar11 + 9],__ptr[8]);
    if (iVar11 != 0) goto LAB_00404484;
    uVar21 = (uVar20 - uVar7) + 1 & 0xffff;
    fseek(__stream,uVar7 + 1,1);
    for (uVar20 = 0; uVar19 = 0, (int)uVar20 < (int)(uint)(byte)__ptr[8]; uVar20 = uVar20 + 1) {
      for (iVar11 = 0; iVar11 < (int)uVar21; iVar11 = iVar11 + 1) {
        uVar8 = fgetc(__stream)   //possible issue identified - semgrep
        uVar15 = uVar6 + uVar7 * -8 & 0xffff;
        if (iVar11 != 0) {
          uVar15 = 0;
        }
        bVar2 = uVar9 < uVar15;
        uVar16 = uVar9;
        if (iVar11 != uVar21 - 1) {
          uVar16 = 8;
          bVar2 = 8 < uVar15;
        }
        if (!bVar2) {
          uVar13 = 7 - uVar15;
          iVar12 = ((uVar19 & 0xffff) + (uVar20 & 0xffff) * (uint)*param_3) * 3;
          iVar14 = 0;
          while( true ) {
            uVar1 = uVar13 & 0x1f;
            iVar10 = iVar14 + uVar15;
            uVar3 = uVar13 & 0x1f;
            iVar14 = iVar14 + 1;
            uVar13 = uVar13 - 1;
            if ((int)uVar16 <= iVar10) break;
            if ((int)(1 << uVar1 & uVar8 & 0xff) >> uVar3 != 0) {
              *(char *)(*(int *)(param_3 + 2) + iVar12) = (char)param_4;
              *(char *)(*(int *)(param_3 + 2) + iVar12 + 1) = (char)((uint)param_4 >> 8);
              *(char *)(*(int *)(param_3 + 2) + iVar12 + 2) = (char)((uint)param_4 >> 0x10);
            }
            iVar12 = iVar12 + 3;
          }
        }
        uVar19 = uVar19 + (uVar16 - uVar15);
      }
      fseek(__stream,(uVar18 >> 3) - uVar21 & 0xffff,1);
    }
    uVar17 = 0;
  }
  free(__ptr);
LAB_0040442c:
  if (__stream != (FILE *)0x0) {
    fclose(__stream);
  }
  return uVar17;
}