|
Packit |
1c1d7e |
/****************************************************************************
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Global functions
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Created : 920604
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is part of the tools module of the Qt GUI Toolkit.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed under the terms of the Q Public License
|
|
Packit |
1c1d7e |
** as defined by Trolltech AS of Norway and appearing in the file
|
|
Packit |
1c1d7e |
** LICENSE.QPL included in the packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed and/or modified under the terms of the
|
|
Packit |
1c1d7e |
** GNU General Public License version 2 as published by the Free Software
|
|
Packit |
1c1d7e |
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
Packit |
1c1d7e |
** packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
|
|
Packit |
1c1d7e |
** licenses may use this file in accordance with the Qt Commercial License
|
|
Packit |
1c1d7e |
** Agreement provided with the Software.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
Packit |
1c1d7e |
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
|
Packit |
1c1d7e |
** information about Qt Commercial License Agreements.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Contact info@trolltech.com if any conditions of this licensing are
|
|
Packit |
1c1d7e |
** not clear to you.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**********************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qglobal.h"
|
|
Packit |
1c1d7e |
#include "qasciidict.h"
|
|
Packit |
1c1d7e |
#include "qstring.h"
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include <stdarg.h>
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// NOT REVISED
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
Returns the Qt version number for the library, typically "1.30"
|
|
Packit |
1c1d7e |
or "2.1.0".
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
const char *qVersion()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return QT_VERSION_STR;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
System detection routines
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool si_alreadyDone = FALSE;
|
|
Packit |
1c1d7e |
static int si_wordSize;
|
|
Packit |
1c1d7e |
static bool si_bigEndian;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
Obtains information about the system.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The system's word size in bits (typically 32) is returned in \e *wordSize.
|
|
Packit |
1c1d7e |
The \e *bigEndian is set to TRUE if this is a big-endian machine,
|
|
Packit |
1c1d7e |
or to FALSE if this is a little-endian machine.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This function calls qFatal() with a message if the computer is truly weird
|
|
Packit |
1c1d7e |
(i.e. different endianness for 16 bit and 32 bit integers).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool qSysInfo( int *wordSize, bool *bigEndian )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
ASSERT( wordSize != 0 );
|
|
Packit |
1c1d7e |
ASSERT( bigEndian != 0 );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( si_alreadyDone ) { // run it only once
|
|
Packit |
1c1d7e |
*wordSize = si_wordSize;
|
|
Packit |
1c1d7e |
*bigEndian = si_bigEndian;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
si_alreadyDone = TRUE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
si_wordSize = 0;
|
|
Packit |
1c1d7e |
uint n = (uint)(~0);
|
|
Packit |
1c1d7e |
while ( n ) { // detect word size
|
|
Packit |
1c1d7e |
si_wordSize++;
|
|
Packit |
1c1d7e |
n /= 2;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
*wordSize = si_wordSize;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( *wordSize != 64 &&
|
|
Packit |
1c1d7e |
*wordSize != 32 &&
|
|
Packit |
1c1d7e |
*wordSize != 16 ) { // word size: 16, 32 or 64
|
|
Packit |
1c1d7e |
#if defined(CHECK_RANGE)
|
|
Packit |
1c1d7e |
qFatal( "qSysInfo: Unsupported system word size %d", *wordSize );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( sizeof(Q_INT8) != 1 || sizeof(Q_INT16) != 2 || sizeof(Q_INT32) != 4 ||
|
|
Packit |
1c1d7e |
sizeof(float) != 4 || sizeof(double) != 8 ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_RANGE)
|
|
Packit |
1c1d7e |
qFatal( "qSysInfo: Unsupported system data type size" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool be16, be32; // determine byte ordering
|
|
Packit |
1c1d7e |
short ns = 0x1234;
|
|
Packit |
1c1d7e |
int nl = 0x12345678;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
unsigned char *p = (unsigned char *)(&ns); // 16-bit integer
|
|
Packit |
1c1d7e |
be16 = *p == 0x12;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
p = (unsigned char *)(&nl); // 32-bit integer
|
|
Packit |
1c1d7e |
if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
|
|
Packit |
1c1d7e |
be32 = TRUE;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
|
|
Packit |
1c1d7e |
be32 = FALSE;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
be32 = !be16;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( be16 != be32 ) { // strange machine!
|
|
Packit |
1c1d7e |
#if defined(CHECK_RANGE)
|
|
Packit |
1c1d7e |
qFatal( "qSysInfo: Inconsistent system byte order" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
*bigEndian = si_bigEndian = be32;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
Debug output routines
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn void qDebug( const char *msg, ... )
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
Prints a debug message, or calls the message handler (if it has been
|
|
Packit |
1c1d7e |
installed).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This function takes a format string and a list of arguments, similar to
|
|
Packit |
1c1d7e |
the C printf() function.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
qDebug( "my window handle = %x", myWidget->id() );
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Under X11, the text is printed to stderr. Under Windows, the text is
|
|
Packit |
1c1d7e |
sent to the debugger.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\warning The internal buffer is limited to 8196 bytes (including the
|
|
Packit |
1c1d7e |
0-terminator).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa qWarning(), qFatal(), qInstallMsgHandler(),
|
|
Packit |
1c1d7e |
\link debug.html Debugging\endlink
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn void qWarning( const char *msg, ... )
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
Prints a warning message, or calls the message handler (if it has been
|
|
Packit |
1c1d7e |
installed).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This function takes a format string and a list of arguments, similar to
|
|
Packit |
1c1d7e |
the C printf() function.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
void f( int c )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( c > 200 )
|
|
Packit |
1c1d7e |
qWarning( "f: bad argument, c == %d", c );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Under X11, the text is printed to stderr. Under Windows, the text is
|
|
Packit |
1c1d7e |
sent to the debugger.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\warning The internal buffer is limited to 8196 bytes (including the
|
|
Packit |
1c1d7e |
0-terminator).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa qDebug(), qFatal(), qInstallMsgHandler(),
|
|
Packit |
1c1d7e |
\link debug.html Debugging\endlink
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn void qFatal( const char *msg, ... )
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
Prints a fatal error message and exits, or calls the message handler (if it
|
|
Packit |
1c1d7e |
has been installed).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This function takes a format string and a list of arguments, similar to
|
|
Packit |
1c1d7e |
the C printf() function.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
int divide( int a, int b )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( b == 0 ) // program error
|
|
Packit |
1c1d7e |
qFatal( "divide: cannot divide by zero" );
|
|
Packit |
1c1d7e |
return a/b;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Under X11, the text is printed to stderr. Under Windows, the text is
|
|
Packit |
1c1d7e |
sent to the debugger.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\warning The internal buffer is limited to 8196 bytes (including the
|
|
Packit |
1c1d7e |
0-terminator).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa qDebug(), qWarning(), qInstallMsgHandler(),
|
|
Packit |
1c1d7e |
\link debug.html Debugging\endlink
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static msg_handler handler = 0; // pointer to debug handler
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#ifdef _OS_MAC_
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static FILE * mac_debug=0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qDebug( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mac_debug=fopen( "debug.txt", "a+" );
|
|
Packit |
1c1d7e |
if(mac_debug) {
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( mac_debug, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( mac_debug, "\n" ); // add newline
|
|
Packit |
1c1d7e |
fflush( mac_debug );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fclose(mac_debug);
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
exit(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// copied... this looks really bad.
|
|
Packit |
1c1d7e |
void debug( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mac_debug=fopen( "debug.txt", "a+" );
|
|
Packit |
1c1d7e |
if(mac_debug) {
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( mac_debug, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( mac_debug, "\n" ); // add newline
|
|
Packit |
1c1d7e |
fflush( mac_debug );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fclose(mac_debug);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qWarning( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mac_debug=fopen( "debug.txt", "a+" );
|
|
Packit |
1c1d7e |
if(mac_debug) {
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( mac_debug, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( mac_debug, "\n" ); // add newline
|
|
Packit |
1c1d7e |
fflush( mac_debug );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fclose(mac_debug);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// copied... this looks really bad.
|
|
Packit |
1c1d7e |
void warning( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mac_debug=fopen( "debug.txt", "a+" );
|
|
Packit |
1c1d7e |
if(mac_debug) {
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( mac_debug, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( mac_debug, "\n" ); // add newline
|
|
Packit |
1c1d7e |
fflush( mac_debug );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fclose(mac_debug);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qFatal( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mac_debug=fopen( "debug.txt", "a+");
|
|
Packit |
1c1d7e |
if(mac_debug) {
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( mac_debug, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( mac_debug, "\n" ); // add newline
|
|
Packit |
1c1d7e |
fflush( mac_debug );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fclose(mac_debug);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
exit(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// copied... this looks really bad.
|
|
Packit |
1c1d7e |
void fatal( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mac_debug=fopen( "debug.txt", "a+" );
|
|
Packit |
1c1d7e |
if(mac_debug) {
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( mac_debug, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( mac_debug, "\n" ); // add newline
|
|
Packit |
1c1d7e |
fflush( mac_debug );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fclose(mac_debug);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
exit(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qDebug( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap ); // ### vsnprintf would be great here
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( stderr, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( stderr, "\n" ); // add newline
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// copied... this looks really bad.
|
|
Packit |
1c1d7e |
void debug( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtDebugMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( stderr, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( stderr, "\n" ); // add newline
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qWarning( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtWarningMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( stderr, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( stderr, "\n" ); // add newline
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// again, copied
|
|
Packit |
1c1d7e |
void warning( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtWarningMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( stderr, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( stderr, "\n" ); // add newline
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qFatal( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtFatalMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( stderr, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( stderr, "\n" ); // add newline
|
|
Packit |
1c1d7e |
#if defined(_OS_UNIX_) && defined(DEBUG)
|
|
Packit |
1c1d7e |
abort(); // trap; generates core dump
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
exit( 1 ); // goodbye cruel world
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// yet again, copied
|
|
Packit |
1c1d7e |
void fatal( const char *msg, ... )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char buf[8196];
|
|
Packit |
1c1d7e |
va_list ap;
|
|
Packit |
1c1d7e |
va_start( ap, msg ); // use variable arg list
|
|
Packit |
1c1d7e |
if ( handler ) {
|
|
Packit |
1c1d7e |
vsprintf( buf, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
(*handler)( QtFatalMsg, buf );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
vfprintf( stderr, msg, ap );
|
|
Packit |
1c1d7e |
va_end( ap );
|
|
Packit |
1c1d7e |
fprintf( stderr, "\n" ); // add newline
|
|
Packit |
1c1d7e |
#if defined(_OS_UNIX_) && defined(DEBUG)
|
|
Packit |
1c1d7e |
abort(); // trap; generates core dump
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
exit( 1 ); // goodbye cruel world
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn void ASSERT( bool test )
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
Prints a warning message containing the source code file name and line number
|
|
Packit |
1c1d7e |
if \e test is FALSE.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This is really a macro defined in qglobal.h.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ASSERT is useful for testing required conditions in your program.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// File: div.cpp
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qglobal.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int divide( int a, int b )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ASSERT( b != 0 ); // this is line 9
|
|
Packit |
1c1d7e |
return a/b;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
If \c b is zero, the ASSERT statement will output the following message
|
|
Packit |
1c1d7e |
using the qWarning() function:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
ASSERT: "b == 0" in div.cpp (9)
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa qWarning(), \link debug.html Debugging\endlink
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn void CHECK_PTR( void *p )
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
If \e p is null, a fatal messages says that the program ran out of memory
|
|
Packit |
1c1d7e |
and exits. If \e p is not null, nothing happens.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This is really a macro defined in qglobal.h.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
int *a;
|
|
Packit |
1c1d7e |
CHECK_PTR( a = new int[80] ); // never do this!
|
|
Packit |
1c1d7e |
// do this instead:
|
|
Packit |
1c1d7e |
a = new int[80];
|
|
Packit |
1c1d7e |
CHECK_PTR( a ); // this is fine
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa qFatal(), \link debug.html Debugging\endlink
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// The CHECK_PTR macro calls this function to check if an allocation went ok.
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool qt_check_pointer( bool c, const char *n, int l )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( c )
|
|
Packit |
1c1d7e |
qFatal( "In file %s, line %d: Out of memory", n, l );
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool firstObsoleteWarning(const char *obj, const char *oldfunc )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static QAsciiDict<int> *obsoleteDict = 0;
|
|
Packit |
1c1d7e |
if ( !obsoleteDict ) { // first time func is called
|
|
Packit |
1c1d7e |
obsoleteDict = new QAsciiDict<int>;
|
|
Packit |
1c1d7e |
#if defined(DEBUG)
|
|
Packit |
1c1d7e |
qDebug(
|
|
Packit |
1c1d7e |
"You are using obsolete functions in the Qt library. Call the function\n"
|
|
Packit |
1c1d7e |
"qSuppressObsoleteWarnings() to suppress obsolete warnings.\n"
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString s( obj );
|
|
Packit |
1c1d7e |
s += "::";
|
|
Packit |
1c1d7e |
s += oldfunc;
|
|
Packit |
1c1d7e |
if ( obsoleteDict->find(s.data()) == 0 ) {
|
|
Packit |
1c1d7e |
obsoleteDict->insert( s.data(), (int*)1 ); // anything different from 0
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool suppressObsolete = FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qSuppressObsoleteWarnings( bool suppress )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
suppressObsolete = suppress;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qObsolete( const char *obj, const char *oldfunc, const char *newfunc )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( suppressObsolete )
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
if ( !firstObsoleteWarning(obj, oldfunc) )
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
if ( obj )
|
|
Packit |
1c1d7e |
qDebug( "%s::%s: This function is obsolete, use %s instead.",
|
|
Packit |
1c1d7e |
obj, oldfunc, newfunc );
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
qDebug( "%s: This function is obsolete, use %s instead.",
|
|
Packit |
1c1d7e |
oldfunc, newfunc );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qObsolete( const char *obj, const char *oldfunc )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( suppressObsolete )
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
if ( !firstObsoleteWarning(obj, oldfunc) )
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
if ( obj )
|
|
Packit |
1c1d7e |
qDebug( "%s::%s: This function is obsolete.", obj, oldfunc );
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
qDebug( "%s: This function is obsolete.", oldfunc );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void qObsolete( const char *message )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( suppressObsolete )
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
if ( !firstObsoleteWarning( "Qt", message) )
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
qDebug( "%s", message );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\relates QApplication
|
|
Packit |
1c1d7e |
Installs a Qt message handler. Returns a pointer to the message handler
|
|
Packit |
1c1d7e |
previously defined.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The message handler is a function that prints out debug messages,
|
|
Packit |
1c1d7e |
warnings and fatal error messages. The Qt library (debug version)
|
|
Packit |
1c1d7e |
contains hundreds of warning messages that are printed when internal
|
|
Packit |
1c1d7e |
errors (usually invalid function arguments) occur. If you implement
|
|
Packit |
1c1d7e |
your own message handler, you get total control of these messages.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The default message handler prints the message to the standard output
|
|
Packit |
1c1d7e |
under X11 or to the debugger under Windows. If it is a fatal message,
|
|
Packit |
1c1d7e |
the application aborts immediately.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Only one message handler can be defined, since this is usually done on
|
|
Packit |
1c1d7e |
an application-wide basis to control debug output.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
To restore the message handler, call \c qInstallMsgHandler(0).
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
#include <qapplication.h>
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void myMessageOutput( QtMsgType type, const char *msg )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch ( type ) {
|
|
Packit |
1c1d7e |
case QtDebugMsg:
|
|
Packit |
1c1d7e |
fprintf( stderr, "Debug: %s\n", msg );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case QtWarningMsg:
|
|
Packit |
1c1d7e |
fprintf( stderr, "Warning: %s\n", msg );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case QtFatalMsg:
|
|
Packit |
1c1d7e |
fprintf( stderr, "Fatal: %s\n", msg );
|
|
Packit |
1c1d7e |
abort(); // dump core on purpose
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int main( int argc, char **argv )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
qInstallMsgHandler( myMessageOutput );
|
|
Packit |
1c1d7e |
QApplication a( argc, argv );
|
|
Packit |
1c1d7e |
...
|
|
Packit |
1c1d7e |
return a.exec();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa qDebug(), qWarning(), qFatal(), \link debug.html Debugging\endlink
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
msg_handler qInstallMsgHandler( msg_handler h )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg_handler old = handler;
|
|
Packit |
1c1d7e |
handler = h;
|
|
Packit |
1c1d7e |
return old;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#ifdef _WS_WIN_
|
|
Packit |
1c1d7e |
bool qt_winunicode=FALSE;
|
|
Packit |
1c1d7e |
#endif
|