wcstoxlX

INT64 __stdcall wcstoxlX(
        localeinfo_struct *plocinfo,
        WCHAR *nptr,
        WCHAR **endptr,
        INT64 ibase,
        INT64 flags,
        INT64 AllowOverflow){
  unsigned int v6; 
  WCHAR v8; 
  WCHAR *v9; 
  unsigned int v10; 
  int v11; 
  unsigned int v12; 
  unsigned int v13; 
  int v14; 
  WCHAR *v15; 
  INT64 result; 
  v6 = ibase;
  if( endptr )
    *endptr = nptr;
  if( !nptr || (_DWORD)ibase && (unsigned int)(ibase - 2) > 0x22 )
  {
    xHalTimerWatchdogStop(0i64, 0i64);
    return 0i64;
  }
  v8 = *nptr;
  v9 = nptr + 1;
  v10 = 0;
  while( iswctype_l(v8, 8u, 0i64) )
    v8 = *v9++;
  v11 = flags;
  if( v8 == 45 )
  {
    v11 = flags | 2;
  }
  else if( v8 != 43 )
  {
    goto LABEL_13;
  }
  v8 = *v9++;
LABEL_13:
  if( v6 )
    goto LABEL_19;
  if( !(unsigned int)wchartodigit(v8) )
  {
    if( ((*v9 - 88) & 0xFFDF) != 0 )
    {
      v6 = 8;
      goto LABEL_23;
    }
    v6 = 16;
LABEL_19:
    if( v6 == 16 && !(unsigned int)wchartodigit(v8) && ((*v9 - 88) & 0xFFDF) == 0 )
    {
      v8 = v9[1];
      v9 += 2;
    }
    goto LABEL_23;
  }
  v6 = 10;
LABEL_23:
  v12 = 0xFFFFFFFF / v6;
  while( 1 )
  {
    v13 = wchartodigit(v8);
    if( v13 != -1 )
      goto LABEL_30;
    if( (unsigned __int16)(v8 - 65) > 0x19u && (unsigned __int16)(v8 - 97) > 0x19u )
      break;
    v14 = v8 - 32;
    if( (unsigned __int16)(v8 - 97) > 0x19u )
      v14 = v8;
    v13 = v14 - 55;
LABEL_30:
    if( v13 >= v6 )
      break;
    v11 |= 8u;
    if( (_DWORD)AllowOverflow || v10 < v12 || v10 == v12 && v13 <= 0xFFFFFFFF % v6 )
    {
      v10 = v13 + v6 * v10;
    }
    else
    {
      v11 |= 4u;
      if( !endptr )
        break;
    }
    v8 = *v9++;
  }
  v15 = v9 - 1;
  if( (v11 & 8) != 0 )
  {
    if( (v11 & 4) == 0 )
    {
      if( (v11 & 1) != 0 )
        goto LABEL_52;
      if( (v11 & 2) != 0 )
      {
        if( v10 <= 0x80000000 )
          goto LABEL_52;
      }
      else if( v10 <= 0x7FFFFFFF )
      {
        goto LABEL_52;
      }
    }
    if( !(_DWORD)AllowOverflow )
    {
      gbl_errno = 34;
      if( (v11 & 1) != 0 )
        v10 = -1;
      else
        v10 = ((v11 & 2) != 0) + 0x7FFFFFFF;
    }
  }
  else
  {
    if( endptr )
      v15 = nptr;
    v10 = 0;
  }
LABEL_52:
  if( endptr )
    *endptr = v15;
  result = -v10;
  if( (v11 & 2) == 0 )
    return v10;
  return result;
}

Referenced by:

wcstol
wcstolX
wcstoul