int FUN_00404320(byte *param_1,int param_2,int *param_3)

{
  byte bVar1;
  byte *pbVar2;
  char cVar3;
  char *pcVar4;
  int iVar5;
  byte *pbVar6;
  char local_18 [8];
  
  if ((param_1 == (byte *)0x0) || (param_2 == 0)) {
    *param_3 = 0;
    return 0;
  }
  pbVar2 = (byte *)FUN_0048470c(((int)(((uint)(param_2 * 3 >> 0x1f) >> 0x1e) + param_2 * 3) >> 2) +
                                4);
  *param_3 = (int)pbVar2;
  pbVar6 = param_1 + param_2;
LAB_0040447c:
  if (pbVar6 < param_1) {
    iVar5 = *param_3;
    *pbVar2 = 0;
    return (int)pbVar2 - iVar5;
  }
  iVar5 = 0;
  pcVar4 = local_18;
LAB_004043b8:
  do {
    bVar1 = *param_1;
    param_1 = param_1 + 1;
    if ((bVar1 - 0x2b & 0xff) < 0x50) {
      cVar3 = (&DAT_0048b225)[bVar1];
      if (cVar3 != '\0') {
        if (cVar3 == '$') goto LAB_004043f8;
        cVar3 = cVar3 + -0x3d   //possible issue identified - semgrep
      }
    }
    else {
LAB_004043f8:
      cVar3 = '\0';
    }
    if (pbVar6 < param_1) {
      *pcVar4 = '\0';
    }
    else {
      if (cVar3 == '\0') goto LAB_004043b8;
      *pcVar4 = cVar3 + -1;
      iVar5 = iVar5 + 1;
    }
    if ((pcVar4 == local_18 + 3) || (pcVar4 = pcVar4 + 1, pbVar6 < param_1)) break;
  } while( true );
  if (iVar5 != 0) {
    *pbVar2 = local_18[0] << 2 | (byte)local_18[1] >> 4;
    pbVar2[1] = local_18[1] << 4 | (byte)local_18[2] >> 2;
    pbVar2[2] = local_18[2] << 6 | local_18[3];
    pbVar2 = pbVar2 + iVar5 + -1;
  }
  goto LAB_0040447c;
}