diff options
Diffstat (limited to 'src/tools/tqglobal.cpp')
| -rw-r--r-- | src/tools/tqglobal.cpp | 889 | 
1 files changed, 889 insertions, 0 deletions
| diff --git a/src/tools/tqglobal.cpp b/src/tools/tqglobal.cpp new file mode 100644 index 000000000..d33bfdf95 --- /dev/null +++ b/src/tools/tqglobal.cpp @@ -0,0 +1,889 @@ +/**************************************************************************** +** +** Global functions +** +** Created : 920604 +** +** Copyright (C) 1992-2008 Trolltech ASA.  All rights reserved. +** +** This file is part of the tools module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file.  Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "qplatformdefs.h" + +#include "tqasciidict.h" +#include <tqdatetime.h> +#include <limits.h> +#include <stdio.h> +#include <limits.h> +#include <stdarg.h> +#include <stdlib.h> + +#if defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET) && !defined(Q_OS_TEMP) +#include <crtdbg.h> +#endif + + +/*! +    \relates TQApplication + +    Returns the TQt version number as a string, for example, "2.3.0" or +    "3.0.5". + +    The \c TQT_VERSION define has the numeric value in the form: +    0xmmiibb (m = major, i = minor, b = bugfix). For example, TQt +    3.0.5's \c TQT_VERSION is 0x030005. +*/ + +const char *tqVersion() +{ +    return TQT_VERSION_STR; +} + +bool tqSharedBuild() +{ +#ifdef QT_SHARED +    return TRUE; +#else +    return FALSE; +#endif +} + +/***************************************************************************** +  System detection routines + *****************************************************************************/ + +static bool si_alreadyDone = FALSE; +static int  si_wordSize; +static bool si_bigEndian; + +/*! +    \relates TQApplication + +    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 tqFatal() 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 tqSysInfo( 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; +    TQ_ULONG n = (TQ_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) +	tqFatal( "qSysInfo: Unsupported system word size %d", *wordSize ); +#endif +	return FALSE; +    } +    if ( sizeof(TQ_INT8) != 1 || sizeof(TQ_INT16) != 2 || sizeof(TQ_INT32) != 4 || +	 sizeof(TQ_ULONG)*8 != si_wordSize || sizeof(float) != 4 || sizeof(double) != 8 ) { +#if defined(QT_CHECK_RANGE) +	tqFatal( "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) +	tqFatal( "qSysInfo: Inconsistent system byte order" ); +#endif +	return FALSE; +    } + +    *bigEndian = si_bigEndian = be32; +    si_alreadyDone = TRUE; +    return TRUE; +} + +#if defined(Q_OS_MAC) + +#include "qt_mac.h" + +// This function has descended from Apple Source Code (FSpLocationFromFullPath), +// but changes have been made. [Creates a minimal alias from the full pathname] +OSErr qt_mac_create_fsspec(const TQString &file, FSSpec *spec) +{ +    FSRef fref; +    TQCString utfs = file.utf8(); +    OSErr ret = FSPathMakeRef((const UInt8 *)utfs.data(), &fref, NULL); +    if(ret == noErr) +	ret = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, spec, NULL); +    return ret; +} + +CFStringRef tqstring2cfstring(const TQString &str) +{ +    return CFStringCreateWithCharacters(0, (UniChar *)str.unicode(), str.length()); +} + +TQString cfstring2qstring(CFStringRef str) +{ +    if(!str) +	return TQString(); + +    CFIndex length = CFStringGetLength(str); +    if(const UniChar *chars = CFStringGetCharactersPtr(str)) +	return TQString((TQChar *)chars, length); +    UniChar *buffer = (UniChar*)malloc(length * sizeof(UniChar)); +    CFStringGetCharacters(str, CFRangeMake(0, length), buffer); +    TQString ret((TQChar *)buffer, length); +    free(buffer); +    return ret; +} + +unsigned char *p_str(const TQString &s) +{ +    CFStringRef cfstr = tqstring2cfstring(s); +    uchar *p = (uchar*)malloc(256); +    CFStringGetPascalString(cfstr, p, 256, CFStringGetSystemEncoding()); +    CFRelease(cfstr); +    return p; +} + +TQString p2qstring(const unsigned char *c) { +    CFStringRef cfstr = CFStringCreateWithPascalString(0, c, CFStringGetSystemEncoding()); +    TQString str = cfstring2qstring(cfstr); +    CFRelease(cfstr); +    return str; +} + +int qMacVersion() +{ +    static int macver = TQt::MV_Unknown; +    static bool first = TRUE; +    if(first) { +	first = FALSE; +	long gestalt_version; +	if(Gestalt(gestaltSystemVersion, &gestalt_version) == noErr) { +            macver = ((gestalt_version & 0x00f0) >> 4) + 2; + +	} +    } +    return macver; +} +TQt::MacintoshVersion qt_macver = (TQt::MacintoshVersion)qMacVersion(); + +// HFS+ filesystems use decomposing unicode for certain layers in unicode +// In general these don't look great as a user visible string. +// Therefore it is a good idea to normalize them ourselves. +// These technotes on Apple's website: +// http://developer.apple.com/qa/qa2001/qa1235.html +// http://developer.apple.com/qa/qa2001/qa1173.html +TQString qt_mac_precomposeFileName(const TQString &str) +{ +    if (str.isEmpty()) +        return str; +    int strLength = str.length(); +    CFMutableStringRef cfmstr = CFStringCreateMutable(0, strLength); +    CFStringAppendCharacters(cfmstr, (UniChar *)str.unicode(), strLength); +    CFStringNormalize(cfmstr, kCFStringNormalizationFormC); +    TQString newStr = cfstring2qstring(cfmstr); +    CFRelease(cfmstr); +    return newStr; +} +#elif defined(Q_OS_WIN32) || defined(Q_OS_CYGWIN) || defined(Q_OS_TEMP) +bool qt_winunicode; +# ifdef Q_OS_TEMP +  DWORD qt_cever = 0; +# endif // Q_OS_TEMP + +#include "qt_windows.h" + +int qWinVersion() +{ +#ifndef VER_PLATFORM_WIN32s +#define VER_PLATFORM_WIN32s	    0 +#endif +#ifndef VER_PLATFORM_WIN32_WINDOWS +#define VER_PLATFORM_WIN32_WINDOWS  1 +#endif +#ifndef VER_PLATFORM_WIN32_NT +#define VER_PLATFORM_WIN32_NT	    2 +#endif +#ifndef VER_PLATFORM_WIN32_CE +#define VER_PLATFORM_WIN32_CE	    3 +#endif + +    static int winver = TQt::WV_NT; +    static int t=0; +    if ( !t ) { +	t=1; +#ifndef Q_OS_TEMP +	OSVERSIONINFOA osver; +	osver.dwOSVersionInfoSize = sizeof(osver); +	GetVersionExA( &osver ); +#else +	OSVERSIONINFOW osver; +	osver.dwOSVersionInfoSize = sizeof(osver); +	GetVersionEx( &osver ); +	qt_cever = osver.dwMajorVersion * 100; +	qt_cever += osver.dwMinorVersion * 10; +#endif +	switch ( osver.dwPlatformId ) { +	case VER_PLATFORM_WIN32s: +	    winver = TQt::WV_32s; +	    break; +	case VER_PLATFORM_WIN32_WINDOWS: +	    // We treat Windows Me (minor 90) the same as Windows 98 +	    if ( osver.dwMinorVersion == 90 ) +		winver = TQt::WV_Me; +	    else if ( osver.dwMinorVersion == 10 ) +		winver = TQt::WV_98; +	    else +		winver = TQt::WV_95; +	    break; +	case VER_PLATFORM_WIN32_CE: +#ifdef Q_OS_TEMP +	    if ( qt_cever >= 400 ) +		winver = TQt::WV_CENET; +	    else +#endif +		winver = TQt::WV_CE; +	    break; +	default: // VER_PLATFORM_WIN32_NT +	    if ( osver.dwMajorVersion < 5 ) { +		winver = TQt::WV_NT; +	    } else if (osver.dwMajorVersion == 6) { +	    winver = TQt::WV_VISTA; +	    } else if ( osver.dwMinorVersion == 0 ) { +		winver = TQt::WV_2000; +	    } else if ( osver.dwMinorVersion == 1 ) { +		winver = TQt::WV_XP; +	    } else if ( osver.dwMinorVersion == 2 ) { +		winver = TQt::WV_2003; +	    } else { +		tqWarning("Untested Windows version detected!"); +		winver = TQt::WV_NT_based; +	    } +	} +    } + +#if defined(UNICODE) +    if ( winver & TQt::WV_NT_based ) +	qt_winunicode = TRUE; +    else +#endif +	qt_winunicode = FALSE; + +    return winver; +} + +TQt::WindowsVersion qt_winver = (TQt::WindowsVersion)qWinVersion(); +#endif + + +/***************************************************************************** +  Debug output routines + *****************************************************************************/ + +/*! +    \fn void tqDebug( const char *msg, ... ) + +    \relates TQApplication + +    Prints a debug message \a msg, or calls the message handler (if it +    has been installed). + +    This function takes a format string and a list of arguments, +    similar to the C printf() function. + +    Example: +    \code +	tqDebug( "my window handle = %x", myWidget->id() ); +    \endcode + +    Under X11, the text is printed to stderr. Under Windows, the text +    is sent to the debugger. + +    \warning The internal buffer is limited to 8196 bytes (including +    the '\0'-terminator). + +    \warning Passing (const char *)0 as argument to tqDebug might lead +    to crashes on certain platforms due to the platforms printf implementation. + +    \sa tqWarning(), tqFatal(), qInstallMsgHandler(), +	\link debug.html Debugging\endlink +*/ + +/*! +    \fn void tqWarning( const char *msg, ... ) + +    \relates TQApplication + +    Prints a warning message \a msg, or calls the message handler (if +    it has been installed). + +    This function takes a format string and a list of arguments, +    similar to the C printf() function. + +    Example: +    \code +	void f( int c ) +	{ +	    if ( c > 200 ) +		tqWarning( "f: bad argument, c == %d", c ); +	} +    \endcode + +    Under X11, the text is printed to stderr. Under Windows, the text +    is sent to the debugger. + +    \warning The internal buffer is limited to 8196 bytes (including +    the '\0'-terminator). + +    \warning Passing (const char *)0 as argument to tqWarning might lead +    to crashes on certain platforms due to the platforms printf implementation. + +    \sa tqDebug(), tqFatal(), qInstallMsgHandler(), +    \link debug.html Debugging\endlink +*/ + +/*! +    \fn void tqFatal( const char *msg, ... ) + +    \relates TQApplication + +    Prints a fatal error message \a msg and exits, or calls the +    message handler (if it has been installed). + +    This function takes a format string and a list of arguments, +    similar to the C printf() function. + +    Example: +    \code +	int divide( int a, int b ) +	{ +	    if ( b == 0 )				// program error +		tqFatal( "divide: cannot divide by zero" ); +	    return a/b; +	} +    \endcode + +    Under X11, the text is printed to stderr. Under Windows, the text +    is sent to the debugger. + +    \warning The internal buffer is limited to 8196 bytes (including +    the '\0'-terminator). + +    \warning Passing (const char *)0 as argument to tqFatal might lead +    to crashes on certain platforms due to the platforms printf implementation. + +    \sa tqDebug(), tqWarning(), qInstallMsgHandler(), +    \link debug.html Debugging\endlink +*/ + + +static TQtMsgHandler handler = 0;		// pointer to debug handler +static const int QT_BUFFER_LENGTH = 8196;	// internal buffer length + + +#ifdef Q_CC_MWERKS + +#include "qt_mac.h" + +extern bool tqt_is_gui_used; +static void mac_default_handler( const char *msg ) +{ +    if ( tqt_is_gui_used ) { +	const unsigned char *p = p_str(msg); +	DebugStr(p); +	free((void*)p); +    } else { +	fprintf( stderr, msg ); +    } +} + +#endif + +void handle_buffer(const char *buf, TQtMsgType msgType) +{ +    if ( handler ) { +	(*handler)( msgType, buf ); +    } else if (msgType == TQtFatalMsg) { +#if defined(Q_CC_MWERKS) +        mac_default_handler(buf); +#else +	fprintf( stderr, "%s\n", buf );		// add newline +#endif +#if defined(Q_OS_UNIX) && defined(QT_DEBUG) +	abort();				// trap; generates core dump +#elif defined(Q_OS_TEMP) && defined(QT_DEBUG) +	TQString fstr; +	fstr.sprintf( "%s:%s %s %s\n", __FILE__, __LINE__, TQT_VERSION_STR, buf ); +	OutputDebugString( fstr.ucs2() ); +#elif defined(_CRT_ERROR) && defined(_DEBUG) +	_CrtDbgReport( _CRT_ERROR, __FILE__, __LINE__, TQT_VERSION_STR, buf ); +#else +	exit( 1 );				// goodbye cruel world +#endif +    } else { +#if defined(Q_CC_MWERKS) +        mac_default_handler(buf); +#elif defined(Q_OS_TEMP) +	TQString fstr( buf ); +	OutputDebugString( (fstr + "\n").ucs2() ); +#else +	fprintf( stderr, "%s\n", buf );		// add newline +#endif +    } +} + +void tqDebug( const TQString &msg ) +{ +    char buf[QT_BUFFER_LENGTH]; +    strcpy( buf, TQDateTime::currentDateTime().toString("[yyyy/MM/dd hh:mm:ss.zzz] ").local8Bit() ); +    int len = strlen(buf); +    strncpy( &buf[len], msg.local8Bit(), QT_BUFFER_LENGTH - len - 1 ); +    len += msg.length(); +    if (len >= QT_BUFFER_LENGTH) { +        len = QT_BUFFER_LENGTH - 1; +    } +    buf[len] = '\0'; +    handle_buffer(buf, TQtDebugMsg); +} + +void tqDebug( const char *msg, ... ) +{ +    char buf[QT_BUFFER_LENGTH]; +    strcpy( buf, TQDateTime::currentDateTime().toString("[yyyy/MM/dd hh:mm:ss.zzz] ").local8Bit() ); +    int len = strlen(buf); +    va_list ap; +    va_start( ap, msg );			// use variable arg list +#if defined(QT_VSNPRINTF) +    QT_VSNPRINTF( &buf[len], QT_BUFFER_LENGTH-len, msg, ap ); +#else +    vsprintf( &buf[len], msg, ap ); +#endif +    va_end( ap ); +    handle_buffer(buf, TQtDebugMsg); +} + +void tqDebug( const TQCString &s ) +{ +    tqDebug("%s", s.data()); +} + +void tqWarning( const TQString &msg ) +{ +    char buf[QT_BUFFER_LENGTH]; +    strcpy( buf, TQDateTime::currentDateTime().toString("[yyyy/MM/dd hh:mm:ss.zzz] ").local8Bit() ); +    int len = strlen(buf); +    strncpy( &buf[len], msg.local8Bit(), QT_BUFFER_LENGTH - len - 1 ); +    len += msg.length(); +    if (len >= QT_BUFFER_LENGTH) { +        len = QT_BUFFER_LENGTH - 1; +    } +    buf[len] = '\0'; +    handle_buffer(buf, TQtWarningMsg); +} + +void tqWarning( const char *msg, ... ) +{ +    char buf[QT_BUFFER_LENGTH]; +    strcpy( buf, TQDateTime::currentDateTime().toString("[yyyy/MM/dd hh:mm:ss.zzz] ").local8Bit() ); +    int len = strlen(buf); +    va_list ap; +    va_start( ap, msg );			// use variable arg list +#if defined(QT_VSNPRINTF) +    QT_VSNPRINTF( &buf[len], QT_BUFFER_LENGTH-len, msg, ap ); +#else +    vsprintf( &buf[len], msg, ap ); +#endif +    va_end( ap ); +    handle_buffer(buf, TQtWarningMsg); +} + +void tqWarning( const TQCString &s ) +{ +    tqWarning("%s", s.data()); +} + +void tqFatal( const TQString &msg ) +{ +    char buf[QT_BUFFER_LENGTH]; +    strcpy( buf, TQDateTime::currentDateTime().toString("[yyyy/MM/dd hh:mm:ss.zzz] ").local8Bit() ); +    int len = strlen(buf); +    strncpy( &buf[len], msg.local8Bit(), QT_BUFFER_LENGTH - len - 1 ); +    len += msg.length(); +    if (len >= QT_BUFFER_LENGTH) { +        len = QT_BUFFER_LENGTH - 1; +    } +    buf[len] = '\0'; +    handle_buffer(buf, TQtFatalMsg); +} + +void tqFatal( const char *msg, ... ) +{ +    char buf[QT_BUFFER_LENGTH]; +    strcpy( buf, TQDateTime::currentDateTime().toString("[yyyy/MM/dd hh:mm:ss.zzz] ").local8Bit() ); +    int len = strlen(buf); +    va_list ap; +    va_start( ap, msg );			// use variable arg list +#if defined(QT_VSNPRINTF) +    QT_VSNPRINTF( &buf[len], QT_BUFFER_LENGTH-len, msg, ap ); +#else +    vsprintf( &buf[len], msg, ap ); +#endif +    va_end( ap ); +    handle_buffer(buf, TQtFatalMsg); +} + +void tqFatal( const TQCString &s ) +{ +    tqWarning("%s", s.data()); +} + +/*! +  \relates TQApplication + +  Prints the message \a msg and uses \a code to get a system specific +  error message. When \a code is -1 (the default), the system's last +  error code will be used if possible. Use this method to handle +  failures in platform specific API calls. + +  This function does nothing when TQt is built with \c TQT_NO_DEBUG +  defined. +*/ +void tqSystemWarning( const char* msg, int code ) +{ +#ifndef TQT_NO_DEBUG +#if defined(Q_OS_WIN32) +    if ( code == -1 ) +	code = GetLastError(); + +    if ( !code ) +	return; + +    unsigned short *string; +    QT_WA( { +	FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, +		       NULL, +		       code, +		       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), +		       (LPTSTR)&string, +		       0, +		       NULL ); + +	tqWarning( "%s\n\tError code %d - %s", msg, code, TQString::fromUcs2(string).latin1() ); +    }, { +	FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, +			NULL, +			code, +			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), +			(char*)&string, +			0, +			NULL ); + +	tqWarning( "%s\n\tError code %d - %s", msg, code, (const char*)string ); +    } ); +    LocalFree( (HLOCAL)string ); +#else +    if ( code != -1 ) +	tqWarning( "%s\n\tError code %d - %s", msg, code, strerror( code ) ); +    else +	tqWarning( "%s", msg ); +#endif +#else +    Q_UNUSED( msg ); +    Q_UNUSED( code ); +#endif +} + +/*! +    \fn void Q_ASSERT( bool test ) + +    \relates TQApplication + +    Prints a warning message containing the source code file name and +    line number if \a test is FALSE. + +    This is really a macro defined in \c tqglobal.h. + +    Q_ASSERT is useful for testing pre- and post-conditions. + +    Example: +    \code +	// +	// File: div.cpp +	// + +	#include <tqglobal.h> + +	int divide( int a, int b ) +	{ +	    Q_ASSERT( b != 0 );			// this is line 9 +	    return a/b; +	} +    \endcode + +    If \c b is zero, the Q_ASSERT statement will output the following +    message using the tqWarning() function: +    \code +	ASSERT: "b != 0" in div.cpp (9) +    \endcode + +    \sa tqWarning(), \link debug.html Debugging\endlink +*/ + + +/*! +    \fn void TQ_CHECK_PTR( void *p ) + +    \relates TQApplication + +    If \a p is 0, prints a warning message containing the source code file +    name and line number, saying that the program ran out of memory. + +    This is really a macro defined in \c tqglobal.h. + +    Example: +    \code +	int *a; + +	TQ_CHECK_PTR( a = new int[80] );  // WRONG! + +	a = new (nothrow) int[80];       // Right +	TQ_CHECK_PTR( a ); +    \endcode + +    \sa tqWarning(), \link debug.html Debugging\endlink +*/ + + +// +// The TQ_CHECK_PTR macro calls this function to check if an allocation went ok. +// +bool tqt_check_pointer( bool c, const char *n, int l ) +{ +    if ( c ) +	tqWarning( "In file %s, line %d: Out of memory", n, l ); +    return TRUE; +} + + +static bool firstObsoleteWarning(const char *obj, const char *oldfunc ) +{ +    static TQAsciiDict<int> *obsoleteDict = 0; +    if ( !obsoleteDict ) {			// first time func is called +	obsoleteDict = new TQAsciiDict<int>; +#if defined(QT_DEBUG) +	tqDebug( +      "You are using obsolete functions in the TQt library. Call the function\n" +      "qSuppressObsoleteWarnings() to suppress obsolete warnings.\n" +	     ); +#endif +    } +    TQCString s( obj ); +    s += "::"; +    s += oldfunc; +    if ( obsoleteDict->find(s.data()) == 0 ) { +	obsoleteDict->insert( s.data(), (int*)1 );	// anything different from 0 +	return TRUE; +    } +    return FALSE; +} + +static bool suppressObsolete = FALSE; + +void tqSuppressObsoleteWarnings( bool suppress ) +{ +    suppressObsolete = suppress; +} + +void tqObsolete(	 const char *obj, const char *oldfunc, const char *newfunc ) +{ +    if ( suppressObsolete ) +	return; +    if ( !firstObsoleteWarning(obj, oldfunc) ) +	return; +    if ( obj ) +	tqDebug( "%s::%s: This function is obsolete, use %s instead.", +	       obj, oldfunc, newfunc ); +    else +	tqDebug( "%s: This function is obsolete, use %s instead.", +	       oldfunc, newfunc ); +} + +void tqObsolete(	 const char *obj, const char *oldfunc ) +{ +    if ( suppressObsolete ) +	return; +    if ( !firstObsoleteWarning(obj, oldfunc) ) +	return; +    if ( obj ) +	tqDebug( "%s::%s: This function is obsolete.", obj, oldfunc ); +    else +	tqDebug( "%s: This function is obsolete.", oldfunc ); +} + +void tqObsolete(	 const char *message ) +{ +    if ( suppressObsolete ) +	return; +    if ( !firstObsoleteWarning( "TQt", message) ) +	return; +    tqDebug( "%s", message ); +} + + +/*! +    \relates TQApplication + +    Installs a TQt message handler \a h. Returns a pointer to the +    message handler previously defined. + +    The message handler is a function that prints out debug messages, +    warnings and fatal error messages. The TQt library (debug version) +    contains hundreds of warning messages that are printed when +    internal errors (usually invalid function arguments) occur. If you +    implement your own message handler, you get total control of these +    messages. + +    The default message handler prints the message to the standard +    output under X11 or to the debugger under Windows. If it is a +    fatal message, the application aborts immediately. + +    Only one message handler can be defined, since this is usually +    done on an application-wide basis to control debug output. + +    To restore the message handler, call \c qInstallMsgHandler(0). + +    Example: +    \code +	#include <ntqapplication.h> +	#include <stdio.h> +	#include <stdlib.h> + +	void myMessageOutput( TQtMsgType type, const char *msg ) +	{ +	    switch ( type ) { +		case TQtDebugMsg: +		    fprintf( stderr, "Debug: %s\n", msg ); +		    break; +		case TQtWarningMsg: +		    fprintf( stderr, "Warning: %s\n", msg ); +		    break; +		case TQtFatalMsg: +		    fprintf( stderr, "Fatal: %s\n", msg ); +		    abort();			// deliberately core dump +	    } +	} + +	int main( int argc, char **argv ) +	{ +	    qInstallMsgHandler( myMessageOutput ); +	    TQApplication a( argc, argv ); +	    ... +	    return a.exec(); +	} +    \endcode + +    \sa tqDebug(), tqWarning(), tqFatal(), \link debug.html Debugging\endlink +*/ + +TQtMsgHandler qInstallMsgHandler( TQtMsgHandler h ) +{ +    TQtMsgHandler old = handler; +    handler = h; +    return old; +} + + +/* +    Dijkstra's bisection algorithm to find the square root as an integer. +    Deliberately not exported as part of the TQt API, but used in +    tqsimplerichtext.cpp +*/ +unsigned int qt_int_sqrt( unsigned int n ) +{ +    // n must be in the range 0...UINT_MAX/2-1 +    if ( n >= ( UINT_MAX>>2 ) ) { +	unsigned int r = 2 * qt_int_sqrt( n / 4 ); +	unsigned int r2 = r + 1; +	return ( n >= r2 * r2 ) ? r2 : r; +    } +    uint h, p= 0, q= 1, r= n; +    while ( q <= n ) +        q <<= 2; +    while ( q != 1 ) { +        q >>= 2; +        h= p + q; +        p >>= 1; +        if ( r >= h ) { +            p += q; +            r -= h; +        } +    } +    return p; +} + | 
