undefined4 FUN_004039e8(uint *param_1,ushort *param_2)

{
  undefined *puVar1;
  uint uVar2;
  uint uVar3;
  void *__src;
  undefined4 uVar4;
  size_t __n;
  int iVar5;
  
  if (*param_1 < (int)param_1[1] + 4U) {
    return 0;
  }
  memcpy(param_2,(void *)param_1[1],4)   //possible issue identified - semgrep
  if (*param_2 < 5) {
    return 0xffffffff;
  }
  uVar2 = (uint)param_2[1];
  if (uVar2 < 0x8c00) {
    uVar2 = uVar2 - 0x8b00;
    if (0x2d < uVar2) goto LAB_00403aac;
    puVar1 = &UNK_004072d0;
LAB_00403a9c:
    iVar5 = (int)(char)puVar1[uVar2];
  }
  else {
    uVar2 = uVar2 - 0x8c00;
    if (uVar2 < 5) {
      puVar1 = &UNK_00407300;
      goto LAB_00403a9c;
    }
LAB_00403aac:
    iVar5 = 0;
  }
  if ((uint)(&DAT_00407308)[iVar5] < 5) {
    uVar2 = param_1[1];
    uVar4 = 2;
  }
  else {
    __src = (void *)param_1[2];
    __n = (&DAT_00407308)[iVar5] - 4   //possible issue identified - semgrep
    if (__src == (void *)0x0) {
      __src = (void *)(param_1[1] + 4);
    }
    uVar2 = (int)__src + __n;
    if (uVar2 <= *param_1) {
      memcpy(param_2 + 2,__src,__n)   //possible issue identified - semgrep
      if (iVar5 != 8) {
        uVar3 = param_1[1] + (uint)*param_2;
        if (uVar3 < uVar2 + __n) {
          param_1[1] = uVar3;
          param_1[2] = 0;
        }
        else {
          param_1[2] = uVar2;
        }
        return 1;
      }
      if (__n == *param_2 - 4) {
        param_2[2] = 0;
        param_2[3] = 0;
      }
      else {
        *(uint *)(param_2 + 2) = uVar2;
      }
      uVar4 = 1;
      uVar2 = param_1[1] + (uint)*param_2;
      goto LAB_00403b6c;
    }
    uVar2 = param_1[1];
    uVar4 = 0xfffffffe;
  }
  uVar2 = uVar2 + *param_2;
LAB_00403b6c:
  param_1[1] = uVar2;
  return uVar4;
}