XmStosOp

UINT64 __stdcall XmStosOp(INT64 a1){
  INT64 v2; 
  INT64 v3; 
  INT64 *StringAddress; 
  INT64 v5; 
  UINT64 result; 
  int v7; 
  int v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  bool v14; 
  int v15; 
  int v16; 
  int v17; 
  INT64 v18; 

  XmSetSourceValue(a1, (UINT16 *)(a1 + 24));
  if( !*(_BYTE *)(v2 + 139) )
  {
    StringAddress = XmGetStringAddress(v2, 0i64, 7ui64);
    v5 = *(unsigned int *)(a1 + 108);
    *(_QWORD *)(a1 + 88) = StringAddress;
    return(UINT64)XmStoreResult(a1, v5);
  }
  if( *(_BYTE *)(v2 + 137) )
  {
    v7 = *(_DWORD *)(v2 + 28);
    *(_DWORD *)(v2 + 28) = 0;
  }
  else
  {
    v7 = *(unsigned __int16 *)(v2 + 28);
    *(_WORD *)(v2 + 28) = 0;
  }
  v8 = *(_DWORD *)(v2 + 120);
  if( v8 )
  {
    if( v8 != 1 )
    {
      v9 = *(_DWORD *)(a1 + 108);
      goto LABEL_9;
    }
    v16 = *(unsigned __int16 *)(a1 + 108);
    v15 = v16 << 16;
  }
  else
  {
    v15 = *(unsigned __int8 *)(a1 + 108) | (*(unsigned __int8 *)(a1 + 108) << 8);
    v16 = v15 << 16;
  }
  v9 = v16 | v15;
LABEL_9:
  v10 = (unsigned int)(v8 + 1);
  result = 4 / v10;
  v11 = 4 % v10;
  v12 = 4 / v10;
  while( v7 )
  {
    LODWORD(v18) = v7;
    result = (UINT64)XmGetStringAddressRange(a1, v11, v3, &v18);
    v13 = v18;
    v7 -= v18;
    v14 = (*(_DWORD *)(a1 + 16) & 0x400) == 0;
    *(_QWORD *)(a1 + 88) = result;
    if( !v14 )
    {
      result -= v13 * (*(_DWORD *)(a1 + 120) + 1);
      *(_QWORD *)(a1 + 88) = result;
    }
    while( v13 )
    {
      if( v13 < (unsigned int)v12 || (result = *(_QWORD *)(a1 + 88), (result & 3) != 0) )
      {
        result = (UINT64)XmStoreResult(a1, v9);
        *(_QWORD *)(a1 + 88) += *(unsigned int *)(a1 + 120) + 1i64;
        v13 = v17 - 1;
      }
      else
      {
        *(_DWORD *)result = v9;
        *(_QWORD *)(a1 + 88) += 4i64;
        v13 -= v12;
      }
    }
  }
  return result;
}

Referenced by:

No references.