mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-24 10:52:51 +00:00
127 lines
4 KiB
C++
127 lines
4 KiB
C++
/****************************************************************************
|
|
**
|
|
** This file is based on sources of the Qt GUI Toolkit, used under the terms
|
|
** of the GNU General Public License version 2 (see the original copyright
|
|
** notice below).
|
|
** All further contributions to this file are (and are required to be)
|
|
** licensed under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation; either version 2 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** The original Qt license header follows:
|
|
**
|
|
**
|
|
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|
**
|
|
** This file is part of the kernel module of the Qt GUI Toolkit.
|
|
**
|
|
** This file may be distributed under the terms of the Q Public License
|
|
** as defined by Trolltech AS of Norway and appearing in the file
|
|
** LICENSE.QPL included in the packaging of this file.
|
|
**
|
|
** This file may be distributed and/or modified under the terms of the
|
|
** GNU General Public License version 2 as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
** packaging of this file.
|
|
**
|
|
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
|
|
** licenses may use this file in accordance with the Qt Commercial License
|
|
** Agreement provided with the Software.
|
|
**
|
|
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
**
|
|
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
|
** information about Qt Commercial License Agreements.
|
|
** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
|
** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
|
**
|
|
** Contact info@trolltech.com if any conditions of this licensing are
|
|
** not clear to you.
|
|
**
|
|
**********************************************************************/
|
|
|
|
#include "qglobal.h"
|
|
|
|
static bool si_alreadyDone = false;
|
|
static int si_wordSize;
|
|
static bool si_bigEndian;
|
|
|
|
/*!
|
|
\relates QApplication
|
|
|
|
Obtains information about the system.
|
|
|
|
The system's word size in bits (typically 32) is returned in \a
|
|
*wordSize. The \a *bigEndian is set to TRUE if this is a big-endian
|
|
machine, or to FALSE if this is a little-endian machine.
|
|
|
|
In debug mode, this function calls qFatal() with a message if the
|
|
computer is truly weird (i.e. different endianness for 16 bit and
|
|
32 bit integers); in release mode it returns FALSE.
|
|
*/
|
|
|
|
bool qSysInfo( int *wordSize, bool *bigEndian )
|
|
{
|
|
#if defined(QT_CHECK_NULL)
|
|
Q_ASSERT( wordSize != 0 );
|
|
Q_ASSERT( bigEndian != 0 );
|
|
#endif
|
|
|
|
if ( si_alreadyDone ) { // run it only once
|
|
*wordSize = si_wordSize;
|
|
*bigEndian = si_bigEndian;
|
|
return true;
|
|
}
|
|
|
|
si_wordSize = 0;
|
|
Q_ULONG n = (Q_ULONG)(~0);
|
|
while ( n ) { // detect word size
|
|
si_wordSize++;
|
|
n /= 2;
|
|
}
|
|
*wordSize = si_wordSize;
|
|
|
|
if ( *wordSize != 64 &&
|
|
*wordSize != 32 &&
|
|
*wordSize != 16 ) { // word size: 16, 32 or 64
|
|
#if defined(QT_CHECK_RANGE)
|
|
qFatal( "qSysInfo: Unsupported system word size %d", *wordSize );
|
|
#endif
|
|
return false;
|
|
}
|
|
if ( sizeof(Q_INT8) != 1 || sizeof(Q_INT16) != 2 || sizeof(Q_INT32) != 4 ||
|
|
sizeof(Q_ULONG)*8 != si_wordSize || sizeof(float) != 4 || sizeof(double) != 8 ) {
|
|
#if defined(QT_CHECK_RANGE)
|
|
qFatal( "qSysInfo: Unsupported system data type size" );
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool be16, be32; // determine byte ordering
|
|
short ns = 0x1234;
|
|
int nl = 0x12345678;
|
|
|
|
unsigned char *p = (unsigned char *)(&ns); // 16-bit integer
|
|
be16 = *p == 0x12;
|
|
|
|
p = (unsigned char *)(&nl); // 32-bit integer
|
|
if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
|
|
be32 = true;
|
|
else
|
|
if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
|
|
be32 = false;
|
|
else
|
|
be32 = !be16;
|
|
|
|
if ( be16 != be32 ) { // strange machine!
|
|
#if defined(QT_CHECK_RANGE)
|
|
qFatal( "qSysInfo: Inconsistent system byte order" );
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
*bigEndian = si_bigEndian = be32;
|
|
si_alreadyDone = true;
|
|
return true;
|
|
}
|