strtoxlX

NTSTATUS __stdcall strtoxlX(
        localeinfo_struct *plocinfo,
        const INT8 *nptr,
        const INT8 **endptr,
        INT64 ibase,
        INT64 flags,
        INT64 AllowOverFlow){
  unsigned int v6; 
  __int64 v9; 
  const INT8 *v10; 
  unsigned int v11; 
  __int64 v12; 
  int v13; 
  unsigned int v14; 
  __int64 v15; 
  int v16; 
  const INT8 *v17; 
  NTSTATUS result; 

  v6 = ibase;
  if( endptr )
    *endptr = nptr;
  if( !nptr || (_DWORD)ibase && (unsigned int)(ibase - 2) > 0x22 )
  {
    xHalTimerWatchdogStop(0i64, 0i64);
    return 0;
  }
  v9 = *(unsigned __int8 *)nptr;
  v10 = nptr + 1;
  v11 = 0;
  if( (*(_BYTE *)(_pctype_func(plocinfo) + 2 * v9) & 8) != 0 )
  {
    do
      v9 = *(unsigned __int8 *)v10++;
    while( (*(_BYTE *)(_pctype_func(v12) + 2 * v9) & 8) != 0 );
  }
  v13 = flags;
  if( (_BYTE)v9 == 45 )
  {
    v13 = flags | 2;
  }
  else if( (_BYTE)v9 != 43 )
  {
    goto LABEL_12;
  }
  LOBYTE(v9) = *v10++;
LABEL_12:
  if( v6 )
  {
    if( v6 - 2 > 0x22 )
    {
      if( endptr )
        *endptr = nptr;
      return 0;
    }
    if( v6 == 16 && (_BYTE)v9 == 48 )
      goto LABEL_24;
  }
  else if( (_BYTE)v9 == 48 )
  {
    if( ((*v10 - 88) & 0xDF) == 0 )
    {
      v6 = 16;
LABEL_24:
      if( ((*v10 - 88) & 0xDF) == 0 )
      {
        LOBYTE(v9) = v10[1];
        v10 += 2;
      }
      goto LABEL_26;
    }
    v6 = 8;
  }
  else
  {
    v6 = 10;
  }
LABEL_26:
  v14 = 0xFFFFFFFF / v6;
  while( 1 )
  {
    if( (*(_BYTE *)(_pctype_func(v12) + 2i64 * (unsigned __int8)v9) & 4) != 0 )
    {
      v12 = (unsigned int)((char)v9 - 48);
    }
    else
    {
      if( (*(_WORD *)(_pctype_func(v15) + 2i64 * (unsigned __int8)v9) & 0x103) == 0 )
        break;
      v16 = (char)v9 - 32;
      if( (unsigned __int8)(v9 - 97) > 0x19u )
        v16 = (char)v9;
      v12 = (unsigned int)(v16 - 55);
    }
    if( (unsigned int)v12 >= v6 )
      break;
    v13 |= 8u;
    if( (_DWORD)AllowOverFlow || v11 < v14 || v11 == v14 && (unsigned int)v12 <= 0xFFFFFFFF % v6 )
    {
      v11 = v12 + v6 * v11;
    }
    else
    {
      v13 |= 4u;
      if( !endptr )
        break;
    }
    LOBYTE(v9) = *v10++;
  }
  v17 = v10 - 1;
  if( (v13 & 8) == 0 )
  {
    if( endptr )
      v17 = nptr;
    v11 = 0;
    goto LABEL_55;
  }
  if( (v13 & 4) != 0 )
    goto LABEL_51;
  if( (v13 & 1) == 0 )
  {
    if( (v13 & 2) != 0 )
    {
      if( v11 <= 0x80000000 )
        goto LABEL_55;
LABEL_51:
      if( !(_DWORD)AllowOverFlow )
      {
        gbl_errno = 34;
        if( (v13 & 1) != 0 )
          v11 = -1;
        else
          v11 = ((v13 & 2) != 0) + 0x7FFFFFFF;
      }
      goto LABEL_55;
    }
    if( v11 > 0x7FFFFFFF )
      goto LABEL_51;
  }
LABEL_55:
  if( endptr )
    *endptr = v17;
  result = -v11;
  if( (v13 & 2) == 0 )
    return v11;
  return result;
}

Referenced by:

strtol
strtolX
strtoul