wcstoxq

UINT64 __fastcall wcstoxq(
        localeinfo_struct *plocinfo,
        WCHAR *nptr,
        WCHAR **endptr,
        INT64 ibase,
        INT64 flags,
        INT64 *error){
  int v6; 
  unsigned __int16 v9; 
  WCHAR *v10; 
  UINT64 v11; 
  WCHAR i; 
  int v13; 
  unsigned __int64 v14; 
  unsigned int v15; 
  int v16; 
  __int64 v17; 
  WCHAR *v18; 
  UINT64 result; 
  v6 = ibase;
  if( endptr )
    *endptr = nptr;
  if( !nptr || (_DWORD)ibase && (unsigned int)(ibase - 2) > 0x22 )
  {
    xHalTimerWatchdogStop(0i64, 0i64);
    return 0i64;
  }
  v9 = *nptr;
  v10 = nptr + 1;
  v11 = 0i64;
  for( i = *nptr; iswctype_l(i, 8u, 0i64); v9 = i )
  {
    do
      i = *v10++;
    while( i == v9 );
  }
  v13 = flags;
  if( v9 == 45 )
  {
    v13 = flags | 2;
LABEL_13:
    v9 = *v10++;
    goto LABEL_14;
  }
  if( v9 == 43 )
    goto LABEL_13;
LABEL_14:
  if( v6 && (unsigned int)(v6 - 2) > 0x22 )
  {
    if( endptr )
      *endptr = nptr;
    return 0i64;
  }
  if( v6 )
    goto LABEL_24;
  if( !(unsigned int)wchartodigit(v9) )
  {
    if( ((*v10 - 88) & 0xFFDF) != 0 )
    {
      v6 = 8;
      goto LABEL_28;
    }
    v6 = 16;
LABEL_24:
    if( v6 == 16 && !(unsigned int)wchartodigit(v9) && ((*v10 - 88) & 0xFFDF) == 0 )
    {
      v9 = v10[1];
      v10 += 2;
    }
    goto LABEL_28;
  }
  v6 = 10;
LABEL_28:
  v14 = 0xFFFFFFFFFFFFFFFFui64 / v6;
  while( 1 )
  {
    v15 = wchartodigit(v9);
    if( v15 != -1 )
      goto LABEL_35;
    if( (unsigned __int16)(v9 - 65) > 0x19u && (unsigned __int16)(v9 - 97) > 0x19u )
      break;
    v16 = v9 - 32;
    if( (unsigned __int16)(v9 - 97) > 0x19u )
      v16 = v9;
    v15 = v16 - 55;
LABEL_35:
    if( v15 >= v6 )
      break;
    v13 |= 8u;
    if( v11 < v14 )
    {
      v17 = v15;
LABEL_45:
      v11 = v17 + v6 * v11;
      goto LABEL_46;
    }
    if( v11 == v14 )
    {
      v17 = v15;
      if( v15 <= 0xFFFFFFFFFFFFFFFFui64 % v6 )
        goto LABEL_45;
    }
    v13 |= 4u;
    if( !endptr )
      break;
LABEL_46:
    v9 = *v10++;
  }
  v18 = v10 - 1;
  if( (v13 & 8) != 0 )
  {
    if( (v13 & 4) == 0 )
    {
      if( (v13 & 1) != 0 )
        goto LABEL_59;
      if( (v13 & 2) != 0 )
      {
        if( v11 <= 0x8000000000000000ui64 )
          goto LABEL_59;
      }
      else if( v11 <= 0x7FFFFFFFFFFFFFFFi64 )
      {
        goto LABEL_59;
      }
    }
    if( error )
      *(_DWORD *)error = 34;
    else
      gbl_errno = 34;
    if( (v13 & 1) != 0 )
      v11 = -1i64;
    else
      v11 = ((v13 & 2) != 0) + 0x7FFFFFFFFFFFFFFFi64;
  }
  else
  {
    if( endptr )
      v18 = nptr;
    v11 = 0i64;
  }
LABEL_59:
  if( endptr )
    *endptr = v18;
  result = -(__int64)v11;
  if( (v13 & 2) == 0 )
    return v11;
  return result;
}

Referenced by:

GetOperandValue
LocalGetRelativeAttributeForString
LocalpConvertStringSidToSid
RtlUnicodeStringToInt64