strtoxlX

UINT64 __stdcall strtoxlX(
        localeinfo_struct *plocinfo,
        PSTR nptr,
        PSTR *endptr,
        INT64 ibase,
        INT64 flags,
        INT64 AllowOverFlow){
  unsigned int v6; 
  __int64 v9; 
  PSTR v10; 
  unsigned int i; 
  int v12; 
  unsigned int v13; 
  unsigned int v14; 
  int v15; 
  CHAR *v16; 
  UINT64 result; 
  v6 = ibase;
  if( endptr )
    *endptr = nptr;
  if( !nptr || (_DWORD)ibase && (unsigned int)(ibase - 2) > 0x22 )
  {
    xHalTimerWatchdogStop(0i64, 0i64);
    return 0i64;
  }
  v9 = (unsigned __int8)*nptr;
  v10 = nptr + 1;
  for( i = 0; (_pctype_func()[v9] & 8) != 0; ++v10 )
    v9 = (unsigned __int8)*v10;
  v12 = flags;
  if( (_BYTE)v9 == 45 )
  {
    v12 = 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 0i64;
    }
    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:
  v13 = 0xFFFFFFFF / v6;
  while( 1 )
  {
    if( (_pctype_func()[(unsigned __int8)v9] & 4) != 0 )
    {
      v14 = (char)v9 - 48;
    }
    else
    {
      if( (_pctype_func()[(unsigned __int8)v9] & 0x103) == 0 )
        break;
      v15 = (char)v9 - 32;
      if( (unsigned __int8)(v9 - 97) > 0x19u )
        v15 = (char)v9;
      v14 = v15 - 55;
    }
    if( v14 >= v6 )
      break;
    v12 |= 8u;
    if( (_DWORD)AllowOverFlow || i < v13 || i == v13 && v14 <= 0xFFFFFFFF % v6 )
    {
      i = v14 + v6 * i;
    }
    else
    {
      v12 |= 4u;
      if( !endptr )
        break;
    }
    LOBYTE(v9) = *v10++;
  }
  v16 = v10 - 1;
  if( (v12 & 8) == 0 )
  {
    if( endptr )
      v16 = nptr;
    i = 0;
    goto LABEL_55;
  }
  if( (v12 & 4) != 0 )
    goto LABEL_51;
  if( (v12 & 1) == 0 )
  {
    if( (v12 & 2) != 0 )
    {
      if( i <= 0x80000000 )
        goto LABEL_55;
LABEL_51:
      if( !(_DWORD)AllowOverFlow )
      {
        gbl_errno = 34;
        if( (v12 & 1) != 0 )
          i = -1;
        else
          i = ((v12 & 2) != 0) + 0x7FFFFFFF;
      }
      goto LABEL_55;
    }
    if( i > 0x7FFFFFFF )
      goto LABEL_51;
  }
LABEL_55:
  if( endptr )
    *endptr = v16;
  result = -i;
  if( (v12 & 2) == 0 )
    return i;
  return result;
}

Referenced by:

strtol
strtolX
strtoul