wcstoxq

UINT64 __stdcall wcstoxq(
        localeinfo_struct *plocinfo,
        WCHAR *nptr,
        WCHAR **endptr,
        INT64 ibase,
        INT64 flags,
        INT64 *error,
        INT64 a7,
        INT64 a8){
  int v8; 
  unsigned __int16 v11; 
  WCHAR *v12; 
  UINT64 v13; 
  wint_t i; 
  int v15; 
  unsigned __int64 v16; 
  unsigned int v17; 
  int v18; 
  __int64 v19; 
  WCHAR *v20; 
  UINT64 result; 

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

Referenced by:

GetOperandValue
LocalGetRelativeAttributeForString
LocalpConvertStringSidToSid
RtlUnicodeStringToInt64