summaryrefslogtreecommitdiff
path: root/qmake/tools/qglobal.cpp
Unidiff
Diffstat (limited to 'qmake/tools/qglobal.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--qmake/tools/qglobal.cpp45
1 files changed, 39 insertions, 6 deletions
diff --git a/qmake/tools/qglobal.cpp b/qmake/tools/qglobal.cpp
index 47cd6bd..342005d 100644
--- a/qmake/tools/qglobal.cpp
+++ b/qmake/tools/qglobal.cpp
@@ -1,835 +1,868 @@
1/**************************************************************************** 1/****************************************************************************
2** $Id$ 2** $Id$
3** 3**
4** Global functions 4** Global functions
5** 5**
6** Created : 920604 6** Created : 920604
7** 7**
8** Copyright (C) 1992-2002 Trolltech AS. All rights reserved. 8** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
9** 9**
10** This file is part of the tools module of the Qt GUI Toolkit. 10** This file is part of the tools module of the Qt GUI Toolkit.
11** 11**
12** This file may be distributed under the terms of the Q Public License 12** This file may be distributed under the terms of the Q Public License
13** as defined by Trolltech AS of Norway and appearing in the file 13** as defined by Trolltech AS of Norway and appearing in the file
14** LICENSE.QPL included in the packaging of this file. 14** LICENSE.QPL included in the packaging of this file.
15** 15**
16** This file may be distributed and/or modified under the terms of the 16** This file may be distributed and/or modified under the terms of the
17** GNU General Public License version 2 as published by the Free Software 17** GNU General Public License version 2 as published by the Free Software
18** Foundation and appearing in the file LICENSE.GPL included in the 18** Foundation and appearing in the file LICENSE.GPL included in the
19** packaging of this file. 19** packaging of this file.
20** 20**
21** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition 21** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
22** licenses may use this file in accordance with the Qt Commercial License 22** licenses may use this file in accordance with the Qt Commercial License
23** Agreement provided with the Software. 23** Agreement provided with the Software.
24** 24**
25** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 25** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 26** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27** 27**
28** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for 28** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
29** information about Qt Commercial License Agreements. 29** information about Qt Commercial License Agreements.
30** See http://www.trolltech.com/qpl/ for QPL licensing information. 30** See http://www.trolltech.com/qpl/ for QPL licensing information.
31** See http://www.trolltech.com/gpl/ for GPL licensing information. 31** See http://www.trolltech.com/gpl/ for GPL licensing information.
32** 32**
33** Contact info@trolltech.com if any conditions of this licensing are 33** Contact info@trolltech.com if any conditions of this licensing are
34** not clear to you. 34** not clear to you.
35** 35**
36**********************************************************************/ 36**********************************************************************/
37 37
38#include "qplatformdefs.h" 38#include "qplatformdefs.h"
39 39
40#include "qasciidict.h" 40#include "qasciidict.h"
41#include <limits.h> 41#include <limits.h>
42#include <stdio.h> 42#include <stdio.h>
43#include <limits.h> 43#include <limits.h>
44#include <stdarg.h> 44#include <stdarg.h>
45#include <stdlib.h> 45#include <stdlib.h>
46 46
47 47
48/*! 48/*!
49 \relates QApplication 49 \relates QApplication
50 50
51 Returns the Qt version number as a string, for example, "2.3.0" or 51 Returns the Qt version number as a string, for example, "2.3.0" or
52 "3.0.5". 52 "3.0.5".
53 53
54 The \c QT_VERSION define has the numeric value in the form: 54 The \c QT_VERSION define has the numeric value in the form:
55 0xmmiibb (m = major, i = minor, b = bugfix). For example, Qt 55 0xmmiibb (m = major, i = minor, b = bugfix). For example, Qt
56 3.0.5's \c QT_VERSION is 0x030005. 56 3.0.5's \c QT_VERSION is 0x030005.
57*/ 57*/
58 58
59const char *qVersion() 59const char *qVersion()
60{ 60{
61 return QT_VERSION_STR; 61 return QT_VERSION_STR;
62} 62}
63 63
64 64
65/***************************************************************************** 65/*****************************************************************************
66 System detection routines 66 System detection routines
67 *****************************************************************************/ 67 *****************************************************************************/
68 68
69static bool si_alreadyDone = FALSE; 69static bool si_alreadyDone = FALSE;
70static int si_wordSize; 70static int si_wordSize;
71static bool si_bigEndian; 71static bool si_bigEndian;
72 72
73/*! 73/*!
74 \relates QApplication 74 \relates QApplication
75 75
76 Obtains information about the system. 76 Obtains information about the system.
77 77
78 The system's word size in bits (typically 32) is returned in \a 78 The system's word size in bits (typically 32) is returned in \a
79 *wordSize. The \a *bigEndian is set to TRUE if this is a big-endian 79 *wordSize. The \a *bigEndian is set to TRUE if this is a big-endian
80 machine, or to FALSE if this is a little-endian machine. 80 machine, or to FALSE if this is a little-endian machine.
81 81
82 In debug mode, this function calls qFatal() with a message if the 82 In debug mode, this function calls qFatal() with a message if the
83 computer is truly weird (i.e. different endianness for 16 bit and 83 computer is truly weird (i.e. different endianness for 16 bit and
84 32 bit integers); in release mode it returns FALSE. 84 32 bit integers); in release mode it returns FALSE.
85*/ 85*/
86 86
87bool qSysInfo( int *wordSize, bool *bigEndian ) 87bool qSysInfo( int *wordSize, bool *bigEndian )
88{ 88{
89#if defined(QT_CHECK_NULL) 89#if defined(QT_CHECK_NULL)
90 Q_ASSERT( wordSize != 0 ); 90 Q_ASSERT( wordSize != 0 );
91 Q_ASSERT( bigEndian != 0 ); 91 Q_ASSERT( bigEndian != 0 );
92#endif 92#endif
93 93
94 if ( si_alreadyDone ) { // run it only once 94 if ( si_alreadyDone ) { // run it only once
95 *wordSize = si_wordSize; 95 *wordSize = si_wordSize;
96 *bigEndian = si_bigEndian; 96 *bigEndian = si_bigEndian;
97 return TRUE; 97 return TRUE;
98 } 98 }
99 99
100 si_wordSize = 0; 100 si_wordSize = 0;
101 Q_ULONG n = (Q_ULONG)(~0); 101 Q_ULONG n = (Q_ULONG)(~0);
102 while ( n ) { // detect word size 102 while ( n ) { // detect word size
103 si_wordSize++; 103 si_wordSize++;
104 n /= 2; 104 n /= 2;
105 } 105 }
106 *wordSize = si_wordSize; 106 *wordSize = si_wordSize;
107 107
108 if ( *wordSize != 64 && 108 if ( *wordSize != 64 &&
109 *wordSize != 32 && 109 *wordSize != 32 &&
110 *wordSize != 16 ) { // word size: 16, 32 or 64 110 *wordSize != 16 ) { // word size: 16, 32 or 64
111#if defined(QT_CHECK_RANGE) 111#if defined(QT_CHECK_RANGE)
112 qFatal( "qSysInfo: Unsupported system word size %d", *wordSize ); 112 qFatal( "qSysInfo: Unsupported system word size %d", *wordSize );
113#endif 113#endif
114 return FALSE; 114 return FALSE;
115 } 115 }
116 if ( sizeof(Q_INT8) != 1 || sizeof(Q_INT16) != 2 || sizeof(Q_INT32) != 4 || 116 if ( sizeof(Q_INT8) != 1 || sizeof(Q_INT16) != 2 || sizeof(Q_INT32) != 4 ||
117 sizeof(Q_ULONG)*8 != si_wordSize || sizeof(float) != 4 || sizeof(double) != 8 ) { 117 sizeof(Q_ULONG)*8 != si_wordSize || sizeof(float) != 4 || sizeof(double) != 8 ) {
118#if defined(QT_CHECK_RANGE) 118#if defined(QT_CHECK_RANGE)
119 qFatal( "qSysInfo: Unsupported system data type size" ); 119 qFatal( "qSysInfo: Unsupported system data type size" );
120#endif 120#endif
121 return FALSE; 121 return FALSE;
122 } 122 }
123 123
124 bool be16, be32; // determine byte ordering 124 bool be16, be32; // determine byte ordering
125 short ns = 0x1234; 125 short ns = 0x1234;
126 int nl = 0x12345678; 126 int nl = 0x12345678;
127 127
128 unsigned char *p = (unsigned char *)(&ns);// 16-bit integer 128 unsigned char *p = (unsigned char *)(&ns);// 16-bit integer
129 be16 = *p == 0x12; 129 be16 = *p == 0x12;
130 130
131 p = (unsigned char *)(&nl); // 32-bit integer 131 p = (unsigned char *)(&nl); // 32-bit integer
132 if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 ) 132 if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
133 be32 = TRUE; 133 be32 = TRUE;
134 else 134 else
135 if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 ) 135 if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
136 be32 = FALSE; 136 be32 = FALSE;
137 else 137 else
138 be32 = !be16; 138 be32 = !be16;
139 139
140 if ( be16 != be32 ) { // strange machine! 140 if ( be16 != be32 ) { // strange machine!
141#if defined(QT_CHECK_RANGE) 141#if defined(QT_CHECK_RANGE)
142 qFatal( "qSysInfo: Inconsistent system byte order" ); 142 qFatal( "qSysInfo: Inconsistent system byte order" );
143#endif 143#endif
144 return FALSE; 144 return FALSE;
145 } 145 }
146 146
147 *bigEndian = si_bigEndian = be32; 147 *bigEndian = si_bigEndian = be32;
148 si_alreadyDone = TRUE; 148 si_alreadyDone = TRUE;
149 return TRUE; 149 return TRUE;
150} 150}
151 151
152#if defined(Q_OS_WIN32) || defined(Q_OS_CYGWIN) 152#if !defined(QWS) && defined(Q_OS_MAC)
153
154#include "qt_mac.h"
155
156int qMacVersion()
157{
158 static int macver = Qt::MV_Unknown;
159 static bool first = TRUE;
160 if(first) {
161 first = FALSE;
162 long gestalt_version;
163 if(Gestalt(gestaltSystemVersion, &gestalt_version) == noErr) {
164 if(gestalt_version >= 0x1020 && gestalt_version < 0x1030)
165 macver = Qt::MV_10_DOT_2;
166 else if(gestalt_version >= 0x1010 && gestalt_version < 0x1020)
167 macver = Qt::MV_10_DOT_1;
168 }
169 }
170 return macver;
171}
172Qt::MacintoshVersion qt_macver = (Qt::MacintoshVersion)qMacVersion();
173#elif defined(Q_OS_WIN32) || defined(Q_OS_CYGWIN)
153bool qt_winunicode; 174bool qt_winunicode;
154 175
155#include "qt_windows.h" 176#include "qt_windows.h"
156 177
157int qWinVersion() 178int qWinVersion()
158{ 179{
159#ifndef VER_PLATFORM_WIN32s 180#ifndef VER_PLATFORM_WIN32s
160 #define VER_PLATFORM_WIN32s 0 181 #define VER_PLATFORM_WIN32s 0
161#endif 182#endif
162#ifndef VER_PLATFORM_WIN32_WINDOWS 183#ifndef VER_PLATFORM_WIN32_WINDOWS
163#define VER_PLATFORM_WIN32_WINDOWS 1 184#define VER_PLATFORM_WIN32_WINDOWS 1
164#endif 185#endif
165#ifndef VER_PLATFORM_WIN32_NT 186#ifndef VER_PLATFORM_WIN32_NT
166 #define VER_PLATFORM_WIN32_NT 2 187 #define VER_PLATFORM_WIN32_NT 2
167#endif 188#endif
168 189
169 static int winver = Qt::WV_NT; 190 static int winver = Qt::WV_NT;
170 static int t=0; 191 static int t=0;
171 if ( !t ) { 192 if ( !t ) {
172 t=1; 193 t=1;
173#ifdef Q_OS_TEMP 194#ifdef Q_OS_TEMP
174 OSVERSIONINFOW osver; 195 OSVERSIONINFOW osver;
175 osver.dwOSVersionInfoSize = sizeof(osver); 196 osver.dwOSVersionInfoSize = sizeof(osver);
176 GetVersionEx( &osver ); 197 GetVersionEx( &osver );
177#else 198#else
178 OSVERSIONINFOA osver; 199 OSVERSIONINFOA osver;
179 osver.dwOSVersionInfoSize = sizeof(osver); 200 osver.dwOSVersionInfoSize = sizeof(osver);
180 GetVersionExA( &osver ); 201 GetVersionExA( &osver );
181#endif 202#endif
182 switch ( osver.dwPlatformId ) { 203 switch ( osver.dwPlatformId ) {
183 case VER_PLATFORM_WIN32s: 204 case VER_PLATFORM_WIN32s:
184 winver = Qt::WV_32s; 205 winver = Qt::WV_32s;
185 break; 206 break;
186 case VER_PLATFORM_WIN32_WINDOWS: 207 case VER_PLATFORM_WIN32_WINDOWS:
187 // We treat Windows Me (minor 90) the same as Windows 98 208 // We treat Windows Me (minor 90) the same as Windows 98
188 if ( ( osver.dwMinorVersion == 10 ) || ( osver.dwMinorVersion == 90 ) ) 209 if ( ( osver.dwMinorVersion == 10 ) || ( osver.dwMinorVersion == 90 ) )
189 winver = Qt::WV_98; 210 winver = Qt::WV_98;
190 else 211 else
191 winver = Qt::WV_95; 212 winver = Qt::WV_95;
192 break; 213 break;
193 default: // VER_PLATFORM_WIN32_NT 214 default: // VER_PLATFORM_WIN32_NT
194 if ( osver.dwMajorVersion < 5 ) { 215 if ( osver.dwMajorVersion < 5 ) {
195 winver = Qt::WV_NT; 216 winver = Qt::WV_NT;
196 } else if ( osver.dwMinorVersion == 0 ) { 217 } else if ( osver.dwMinorVersion == 0 ) {
197 winver = Qt::WV_2000; 218 winver = Qt::WV_2000;
198 } else { 219 } else {
199 winver = Qt::WV_XP; 220 winver = Qt::WV_XP;
200 } 221 }
201 } 222 }
202 } 223 }
203 224
204#if defined(UNICODE) 225#if defined(UNICODE)
205 if ( winver & Qt::WV_NT_based ) 226 if ( winver & Qt::WV_NT_based )
206 qt_winunicode = TRUE; 227 qt_winunicode = TRUE;
207 else 228 else
208#endif 229#endif
209 qt_winunicode = FALSE; 230 qt_winunicode = FALSE;
210 231
211 return winver; 232 return winver;
212} 233}
213 234
214Qt::WindowsVersion qt_winver = (Qt::WindowsVersion)qWinVersion(); 235Qt::WindowsVersion qt_winver = (Qt::WindowsVersion)qWinVersion();
215#endif 236#endif
216 237
217 238
218/***************************************************************************** 239/*****************************************************************************
219 Debug output routines 240 Debug output routines
220 *****************************************************************************/ 241 *****************************************************************************/
221 242
222/*! 243/*!
223 \fn void qDebug( const char *msg, ... ) 244 \fn void qDebug( const char *msg, ... )
224 245
225 \relates QApplication 246 \relates QApplication
226 247
227 Prints a debug message \a msg, or calls the message handler (if it 248 Prints a debug message \a msg, or calls the message handler (if it
228 has been installed). 249 has been installed).
229 250
230 This function takes a format string and a list of arguments, 251 This function takes a format string and a list of arguments,
231 similar to the C printf() function. 252 similar to the C printf() function.
232 253
233 Example: 254 Example:
234 \code 255 \code
235 qDebug( "my window handle = %x", myWidget->id() ); 256 qDebug( "my window handle = %x", myWidget->id() );
236 \endcode 257 \endcode
237 258
238 Under X11, the text is printed to stderr. Under Windows, the text 259 Under X11, the text is printed to stderr. Under Windows, the text
239 is sent to the debugger. 260 is sent to the debugger.
240 261
241 \warning The internal buffer is limited to 8196 bytes (including 262 \warning The internal buffer is limited to 8196 bytes (including
242 the '\0'-terminator). 263 the '\0'-terminator).
243 264
244 \warning Passing (const char *)0 as argument to qDebug might lead 265 \warning Passing (const char *)0 as argument to qDebug might lead
245 to crashes on certain platforms due to the platforms printf implementation. 266 to crashes on certain platforms due to the platforms printf implementation.
246 267
247 \sa qWarning(), qFatal(), qInstallMsgHandler(), 268 \sa qWarning(), qFatal(), qInstallMsgHandler(),
248 \link debug.html Debugging\endlink 269 \link debug.html Debugging\endlink
249*/ 270*/
250 271
251/*! 272/*!
252 \fn void qWarning( const char *msg, ... ) 273 \fn void qWarning( const char *msg, ... )
253 274
254 \relates QApplication 275 \relates QApplication
255 276
256 Prints a warning message \a msg, or calls the message handler (if 277 Prints a warning message \a msg, or calls the message handler (if
257 it has been installed). 278 it has been installed).
258 279
259 This function takes a format string and a list of arguments, 280 This function takes a format string and a list of arguments,
260 similar to the C printf() function. 281 similar to the C printf() function.
261 282
262 Example: 283 Example:
263 \code 284 \code
264 void f( int c ) 285 void f( int c )
265 { 286 {
266 if ( c > 200 ) 287 if ( c > 200 )
267 qWarning( "f: bad argument, c == %d", c ); 288 qWarning( "f: bad argument, c == %d", c );
268 } 289 }
269 \endcode 290 \endcode
270 291
271 Under X11, the text is printed to stderr. Under Windows, the text 292 Under X11, the text is printed to stderr. Under Windows, the text
272 is sent to the debugger. 293 is sent to the debugger.
273 294
274 \warning The internal buffer is limited to 8196 bytes (including 295 \warning The internal buffer is limited to 8196 bytes (including
275 the '\0'-terminator). 296 the '\0'-terminator).
276 297
277 \warning Passing (const char *)0 as argument to qWarning might lead 298 \warning Passing (const char *)0 as argument to qWarning might lead
278 to crashes on certain platforms due to the platforms printf implementation. 299 to crashes on certain platforms due to the platforms printf implementation.
279 300
280 \sa qDebug(), qFatal(), qInstallMsgHandler(), 301 \sa qDebug(), qFatal(), qInstallMsgHandler(),
281 \link debug.html Debugging\endlink 302 \link debug.html Debugging\endlink
282*/ 303*/
283 304
284/*! 305/*!
285 \fn void qFatal( const char *msg, ... ) 306 \fn void qFatal( const char *msg, ... )
286 307
287 \relates QApplication 308 \relates QApplication
288 309
289 Prints a fatal error message \a msg and exits, or calls the 310 Prints a fatal error message \a msg and exits, or calls the
290 message handler (if it has been installed). 311 message handler (if it has been installed).
291 312
292 This function takes a format string and a list of arguments, 313 This function takes a format string and a list of arguments,
293 similar to the C printf() function. 314 similar to the C printf() function.
294 315
295 Example: 316 Example:
296 \code 317 \code
297 int divide( int a, int b ) 318 int divide( int a, int b )
298 { 319 {
299 if ( b == 0 ) // program error 320 if ( b == 0 ) // program error
300 qFatal( "divide: cannot divide by zero" ); 321 qFatal( "divide: cannot divide by zero" );
301 return a/b; 322 return a/b;
302 } 323 }
303 \endcode 324 \endcode
304 325
305 Under X11, the text is printed to stderr. Under Windows, the text 326 Under X11, the text is printed to stderr. Under Windows, the text
306 is sent to the debugger. 327 is sent to the debugger.
307 328
308 \warning The internal buffer is limited to 8196 bytes (including 329 \warning The internal buffer is limited to 8196 bytes (including
309 the '\0'-terminator). 330 the '\0'-terminator).
310 331
311 \warning Passing (const char *)0 as argument to qFatal might lead 332 \warning Passing (const char *)0 as argument to qFatal might lead
312 to crashes on certain platforms due to the platforms printf implementation. 333 to crashes on certain platforms due to the platforms printf implementation.
313 334
314 \sa qDebug(), qWarning(), qInstallMsgHandler(), 335 \sa qDebug(), qWarning(), qInstallMsgHandler(),
315 \link debug.html Debugging\endlink 336 \link debug.html Debugging\endlink
316*/ 337*/
317 338
318 339
319 static QtMsgHandler handler = 0; // pointer to debug handler 340 static QtMsgHandler handler = 0; // pointer to debug handler
320 static const int QT_BUFFER_LENGTH = 8196;// internal buffer length 341 static const int QT_BUFFER_LENGTH = 8196;// internal buffer length
321 342
322 343
323#ifdef Q_OS_MAC 344#ifdef Q_OS_MAC
324const unsigned char * p_str(const char * c, int len=-1) 345QString cfstring2qstring(CFStringRef str)
346{
347 CFIndex length = CFStringGetLength(str);
348 if(const UniChar *chars = CFStringGetCharactersPtr(str))
349 return QString((QChar *)chars, length);
350 UniChar *buffer = (UniChar*)malloc(length * sizeof(UniChar));
351 CFStringGetCharacters(str, CFRangeMake(0, length), buffer);
352 QString ret((QChar *)buffer, length);
353 free(buffer);
354 return ret;
355}
356
357unsigned char * p_str(const char * c, int len=-1)
325{ 358{
326 const int maxlen = 255; 359 const int maxlen = 255;
327 if(len == -1) 360 if(len == -1)
328 len = qstrlen(c); 361 len = qstrlen(c);
329 if(len > maxlen) { 362 if(len > maxlen) {
330 qWarning( "p_str len must never exceed %d", maxlen ); 363 qWarning( "p_str len must never exceed %d", maxlen );
331 len = maxlen; 364 len = maxlen;
332 } 365 }
333 unsigned char *ret = (unsigned char*)malloc(len+2); 366 unsigned char *ret = (unsigned char*)malloc(len+2);
334 *ret=len; 367 *ret=len;
335 memcpy(((char *)ret)+1,c,len); 368 memcpy(((char *)ret)+1,c,len);
336 *(ret+len+1) = '\0'; 369 *(ret+len+1) = '\0';
337 return ret; 370 return ret;
338} 371}
339 372
340const unsigned char * p_str(const QString &s) 373unsigned char * p_str(const QString &s)
341{ 374{
342 return p_str(s, s.length()); 375 return p_str(s, s.length());
343} 376}
344 377
345QCString p2qstring(const unsigned char *c) { 378QCString p2qstring(const unsigned char *c) {
346 char *arr = (char *)malloc(c[0] + 1); 379 char *arr = (char *)malloc(c[0] + 1);
347 memcpy(arr, c+1, c[0]); 380 memcpy(arr, c+1, c[0]);
348 arr[c[0]] = '\0'; 381 arr[c[0]] = '\0';
349 QCString ret = arr; 382 QCString ret = arr;
350 delete arr; 383 delete arr;
351 return ret; 384 return ret;
352} 385}
353#endif 386#endif
354 387
355 388
356#ifdef Q_CC_MWERKS 389#ifdef Q_CC_MWERKS
357 390
358#include "qt_mac.h" 391#include "qt_mac.h"
359 392
360extern bool qt_is_gui_used; 393extern bool qt_is_gui_used;
361static void mac_default_handler( const char *msg ) 394static void mac_default_handler( const char *msg )
362{ 395{
363 if ( qt_is_gui_used ) { 396 if ( qt_is_gui_used ) {
364 const char *p = p_str(msg); 397 const char *p = p_str(msg);
365 DebugStr(p); 398 DebugStr(p);
366 free(p); 399 free(p);
367 } else { 400 } else {
368 fprintf( stderr, msg ); 401 fprintf( stderr, msg );
369 } 402 }
370} 403}
371 404
372#endif 405#endif
373 406
374 407
375void qDebug( const char *msg, ... ) 408void qDebug( const char *msg, ... )
376{ 409{
377 char buf[QT_BUFFER_LENGTH]; 410 char buf[QT_BUFFER_LENGTH];
378 va_list ap; 411 va_list ap;
379 va_start( ap, msg ); // use variable arg list 412 va_start( ap, msg ); // use variable arg list
380 if ( handler ) { 413 if ( handler ) {
381#if defined(QT_VSNPRINTF) 414#if defined(QT_VSNPRINTF)
382 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap ); 415 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap );
383#else 416#else
384 vsprintf( buf, msg, ap ); 417 vsprintf( buf, msg, ap );
385#endif 418#endif
386 va_end( ap ); 419 va_end( ap );
387 (*handler)( QtDebugMsg, buf ); 420 (*handler)( QtDebugMsg, buf );
388 } else { 421 } else {
389#if defined(Q_CC_MWERKS) 422#if defined(Q_CC_MWERKS)
390 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()? 423 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()?
391 va_end( ap ); 424 va_end( ap );
392 mac_default_handler(buf); 425 mac_default_handler(buf);
393#else 426#else
394 vfprintf( stderr, msg, ap ); 427 vfprintf( stderr, msg, ap );
395 va_end( ap ); 428 va_end( ap );
396 fprintf( stderr, "\n" ); // add newline 429 fprintf( stderr, "\n" ); // add newline
397#endif 430#endif
398 } 431 }
399} 432}
400 433
401// copied... this looks really bad. 434// copied... this looks really bad.
402void debug( const char *msg, ... ) 435void debug( const char *msg, ... )
403{ 436{
404 char buf[QT_BUFFER_LENGTH]; 437 char buf[QT_BUFFER_LENGTH];
405 va_list ap; 438 va_list ap;
406 va_start( ap, msg ); // use variable arg list 439 va_start( ap, msg ); // use variable arg list
407 if ( handler ) { 440 if ( handler ) {
408#if defined(QT_VSNPRINTF) 441#if defined(QT_VSNPRINTF)
409 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap ); 442 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap );
410#else 443#else
411 vsprintf( buf, msg, ap ); 444 vsprintf( buf, msg, ap );
412#endif 445#endif
413 va_end( ap ); 446 va_end( ap );
414 (*handler)( QtDebugMsg, buf ); 447 (*handler)( QtDebugMsg, buf );
415 } else { 448 } else {
416#ifdef Q_CC_MWERKS 449#ifdef Q_CC_MWERKS
417 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()? 450 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()?
418 va_end( ap ); 451 va_end( ap );
419 mac_default_handler(buf); 452 mac_default_handler(buf);
420#else 453#else
421 vfprintf( stderr, msg, ap ); 454 vfprintf( stderr, msg, ap );
422 va_end( ap ); 455 va_end( ap );
423 fprintf( stderr, "\n" ); // add newline 456 fprintf( stderr, "\n" ); // add newline
424#endif 457#endif
425 } 458 }
426} 459}
427 460
428void qWarning( const char *msg, ... ) 461void qWarning( const char *msg, ... )
429{ 462{
430 char buf[QT_BUFFER_LENGTH]; 463 char buf[QT_BUFFER_LENGTH];
431 va_list ap; 464 va_list ap;
432 va_start( ap, msg ); // use variable arg list 465 va_start( ap, msg ); // use variable arg list
433 if ( handler ) { 466 if ( handler ) {
434#if defined(QT_VSNPRINTF) 467#if defined(QT_VSNPRINTF)
435 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap ); 468 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap );
436#else 469#else
437 vsprintf( buf, msg, ap ); 470 vsprintf( buf, msg, ap );
438#endif 471#endif
439 va_end( ap ); 472 va_end( ap );
440 (*handler)( QtWarningMsg, buf ); 473 (*handler)( QtWarningMsg, buf );
441 } else { 474 } else {
442#ifdef Q_CC_MWERKS 475#ifdef Q_CC_MWERKS
443 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()? 476 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()?
444 va_end( ap ); 477 va_end( ap );
445 mac_default_handler(buf); 478 mac_default_handler(buf);
446#else 479#else
447 vfprintf( stderr, msg, ap ); 480 vfprintf( stderr, msg, ap );
448 va_end( ap ); 481 va_end( ap );
449 fprintf( stderr, "\n" ); // add newline 482 fprintf( stderr, "\n" ); // add newline
450#endif 483#endif
451 } 484 }
452} 485}
453 486
454 487
455// again, copied 488// again, copied
456void warning( const char *msg, ... ) 489void warning( const char *msg, ... )
457{ 490{
458 char buf[QT_BUFFER_LENGTH]; 491 char buf[QT_BUFFER_LENGTH];
459 va_list ap; 492 va_list ap;
460 va_start( ap, msg ); // use variable arg list 493 va_start( ap, msg ); // use variable arg list
461 if ( handler ) { 494 if ( handler ) {
462#if defined(QT_VSNPRINTF) 495#if defined(QT_VSNPRINTF)
463 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap ); 496 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap );
464#else 497#else
465 vsprintf( buf, msg, ap ); 498 vsprintf( buf, msg, ap );
466#endif 499#endif
467 va_end( ap ); 500 va_end( ap );
468 (*handler)( QtWarningMsg, buf ); 501 (*handler)( QtWarningMsg, buf );
469 } else { 502 } else {
470#ifdef Q_CC_MWERKS 503#ifdef Q_CC_MWERKS
471 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()? 504 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()?
472 va_end( ap ); 505 va_end( ap );
473 mac_default_handler(buf); 506 mac_default_handler(buf);
474#else 507#else
475 vfprintf( stderr, msg, ap ); 508 vfprintf( stderr, msg, ap );
476 va_end( ap ); 509 va_end( ap );
477 fprintf( stderr, "\n" ); // add newline 510 fprintf( stderr, "\n" ); // add newline
478#endif 511#endif
479 } 512 }
480} 513}
481 514
482void qFatal( const char *msg, ... ) 515void qFatal( const char *msg, ... )
483{ 516{
484 char buf[QT_BUFFER_LENGTH]; 517 char buf[QT_BUFFER_LENGTH];
485 va_list ap; 518 va_list ap;
486 va_start( ap, msg ); // use variable arg list 519 va_start( ap, msg ); // use variable arg list
487 if ( handler ) { 520 if ( handler ) {
488#if defined(QT_VSNPRINTF) 521#if defined(QT_VSNPRINTF)
489 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap ); 522 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap );
490#else 523#else
491 vsprintf( buf, msg, ap ); 524 vsprintf( buf, msg, ap );
492#endif 525#endif
493 va_end( ap ); 526 va_end( ap );
494 (*handler)( QtFatalMsg, buf ); 527 (*handler)( QtFatalMsg, buf );
495 } else { 528 } else {
496#ifdef Q_CC_MWERKS 529#ifdef Q_CC_MWERKS
497 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()? 530 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()?
498 va_end( ap ); 531 va_end( ap );
499 mac_default_handler(buf); 532 mac_default_handler(buf);
500#else 533#else
501 vfprintf( stderr, msg, ap ); 534 vfprintf( stderr, msg, ap );
502 va_end( ap ); 535 va_end( ap );
503 fprintf( stderr, "\n" ); // add newline 536 fprintf( stderr, "\n" ); // add newline
504#endif 537#endif
505#if defined(Q_OS_UNIX) && defined(QT_DEBUG) 538#if defined(Q_OS_UNIX) && defined(QT_DEBUG)
506 abort(); // trap; generates core dump 539 abort(); // trap; generates core dump
507#else 540#else
508 exit( 1 ); // goodbye cruel world 541 exit( 1 ); // goodbye cruel world
509#endif 542#endif
510 } 543 }
511} 544}
512 545
513// yet again, copied 546// yet again, copied
514void fatal( const char *msg, ... ) 547void fatal( const char *msg, ... )
515{ 548{
516 char buf[QT_BUFFER_LENGTH]; 549 char buf[QT_BUFFER_LENGTH];
517 va_list ap; 550 va_list ap;
518 va_start( ap, msg ); // use variable arg list 551 va_start( ap, msg ); // use variable arg list
519 if ( handler ) { 552 if ( handler ) {
520#if defined(QT_VSNPRINTF) 553#if defined(QT_VSNPRINTF)
521 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap ); 554 QT_VSNPRINTF( buf, QT_BUFFER_LENGTH, msg, ap );
522#else 555#else
523 vsprintf( buf, msg, ap ); 556 vsprintf( buf, msg, ap );
524#endif 557#endif
525 va_end( ap ); 558 va_end( ap );
526 (*handler)( QtFatalMsg, buf ); 559 (*handler)( QtFatalMsg, buf );
527 } else { 560 } else {
528#ifdef Q_CC_MWERKS 561#ifdef Q_CC_MWERKS
529 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()? 562 vsprintf( buf, msg, ap ); // ### is there no vsnprintf()?
530 va_end( ap ); 563 va_end( ap );
531 mac_default_handler(buf); 564 mac_default_handler(buf);
532#else 565#else
533 vfprintf( stderr, msg, ap ); 566 vfprintf( stderr, msg, ap );
534 va_end( ap ); 567 va_end( ap );
535 fprintf( stderr, "\n" ); // add newline 568 fprintf( stderr, "\n" ); // add newline
536#endif 569#endif
537#if defined(Q_OS_UNIX) && defined(QT_DEBUG) 570#if defined(Q_OS_UNIX) && defined(QT_DEBUG)
538 abort(); // trap; generates core dump 571 abort(); // trap; generates core dump
539#else 572#else
540 exit( 1 ); // goodbye cruel world 573 exit( 1 ); // goodbye cruel world
541#endif 574#endif
542 } 575 }
543} 576}
544 577
545/*! 578/*!
546 \relates QApplication 579 \relates QApplication
547 580
548 Prints the message \a msg and uses \a code to get a system specific 581 Prints the message \a msg and uses \a code to get a system specific
549 error message. When \a code is -1 (the default), the system's last 582 error message. When \a code is -1 (the default), the system's last
550 error code will be used if possible. Use this method to handle 583 error code will be used if possible. Use this method to handle
551 failures in platform specific API calls. 584 failures in platform specific API calls.
552 585
553 This function does nothing when Qt is built with \c QT_NO_DEBUG 586 This function does nothing when Qt is built with \c QT_NO_DEBUG
554 defined. 587 defined.
555*/ 588*/
556void qSystemWarning( const char* msg, int code ) 589void qSystemWarning( const char* msg, int code )
557{ 590{
558#ifndef QT_NO_DEBUG 591#ifndef QT_NO_DEBUG
559#if defined(Q_OS_WIN32) 592#if defined(Q_OS_WIN32)
560 if ( code == -1 ) 593 if ( code == -1 )
561 code = GetLastError(); 594 code = GetLastError();
562 595
563 if ( !code ) 596 if ( !code )
564 return; 597 return;
565 598
566#ifdef Q_OS_TEMP 599#ifdef Q_OS_TEMP
567 unsigned short *string; 600 unsigned short *string;
568 601
569 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 602 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
570 NULL, 603 NULL,
571 code, 604 code,
572 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 605 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
573 (LPTSTR)&string, 606 (LPTSTR)&string,
574 0, 607 0,
575 NULL ); 608 NULL );
576 609
577 qWarning( "%s\n\tError code %d - %s (###may need fixing in qglobal.h)", msg, code, (const char *)string ); 610 qWarning( "%s\n\tError code %d - %s (###may need fixing in qglobal.h)", msg, code, (const char *)string );
578#else 611#else
579 char* string; 612 char* string;
580 613
581 FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 614 FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
582 NULL, 615 NULL,
583 code, 616 code,
584 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 617 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
585 (char*)&string, 618 (char*)&string,
586 0, 619 0,
587 NULL ); 620 NULL );
588 621
589 qWarning( "%s\n\tError code %d - %s", msg, code, (const char*)string ); 622 qWarning( "%s\n\tError code %d - %s", msg, code, (const char*)string );
590#endif 623#endif
591 624
592 LocalFree( (HLOCAL)string ); 625 LocalFree( (HLOCAL)string );
593#else 626#else
594 if ( code != -1 ) 627 if ( code != -1 )
595 qWarning( "%s\n\tError code %d - %s", msg, code, strerror( code ) ); 628 qWarning( "%s\n\tError code %d - %s", msg, code, strerror( code ) );
596 else 629 else
597 qWarning( msg ); 630 qWarning( msg );
598#endif 631#endif
599#endif 632#endif
600} 633}
601 634
602/*! 635/*!
603 \fn void Q_ASSERT( bool test ) 636 \fn void Q_ASSERT( bool test )
604 637
605 \relates QApplication 638 \relates QApplication
606 639
607 Prints a warning message containing the source code file name and 640 Prints a warning message containing the source code file name and
608 line number if \a test is FALSE. 641 line number if \a test is FALSE.
609 642
610 This is really a macro defined in \c qglobal.h. 643 This is really a macro defined in \c qglobal.h.
611 644
612 Q_ASSERT is useful for testing pre- and post-conditions. 645 Q_ASSERT is useful for testing pre- and post-conditions.
613 646
614 Example: 647 Example:
615 \code 648 \code
616 // 649 //
617 // File: div.cpp 650 // File: div.cpp
618 // 651 //
619 652
620 #include <qglobal.h> 653 #include <qglobal.h>
621 654
622 int divide( int a, int b ) 655 int divide( int a, int b )
623 { 656 {
624 Q_ASSERT( b != 0 ); // this is line 9 657 Q_ASSERT( b != 0 ); // this is line 9
625 return a/b; 658 return a/b;
626 } 659 }
627 \endcode 660 \endcode
628 661
629 If \c b is zero, the Q_ASSERT statement will output the following 662 If \c b is zero, the Q_ASSERT statement will output the following
630 message using the qWarning() function: 663 message using the qWarning() function:
631 \code 664 \code
632 ASSERT: "b == 0" in div.cpp (9) 665 ASSERT: "b == 0" in div.cpp (9)
633 \endcode 666 \endcode
634 667
635 \sa qWarning(), \link debug.html Debugging\endlink 668 \sa qWarning(), \link debug.html Debugging\endlink
636*/ 669*/
637 670
638 671
639/*! 672/*!
640 \fn void Q_CHECK_PTR( void *p ) 673 \fn void Q_CHECK_PTR( void *p )
641 674
642 \relates QApplication 675 \relates QApplication
643 676
644 If \a p is null, a fatal messages says that the program ran out of 677 If \a p is 0, a fatal messages says that the program ran out of
645 memory and exits. If \e p is not null, nothing happens. 678 memory and exits. If \e p is not 0, nothing happens.
646 679
647 This is really a macro defined in \c qglobal.h. 680 This is really a macro defined in \c qglobal.h.
648 681
649 Example: 682 Example:
650 \code 683 \code
651 int *a; 684 int *a;
652 685
653 Q_CHECK_PTR( a = new int[80] ); // WRONG! 686 Q_CHECK_PTR( a = new int[80] ); // WRONG!
654 687
655 a = new int[80]; // Right 688 a = new (nothrow) int[80]; // Right
656 Q_CHECK_PTR( a ); 689 Q_CHECK_PTR( a );
657 \endcode 690 \endcode
658 691
659 \sa qFatal(), \link debug.html Debugging\endlink 692 \sa qFatal(), \link debug.html Debugging\endlink
660*/ 693*/
661 694
662 695
663// 696//
664// The Q_CHECK_PTR macro calls this function to check if an allocation went ok. 697// The Q_CHECK_PTR macro calls this function to check if an allocation went ok.
665// 698//
666#if (QT_VERSION-0 >= 0x040000) 699#if (QT_VERSION-0 >= 0x040000)
667#if defined(Q_CC_GNU) 700#if defined(Q_CC_GNU)
668#warning "Change Q_CHECK_PTR to '{if ((p)==0) qt_check_pointer(__FILE__,__LINE__);}'" 701#warning "Change Q_CHECK_PTR to '{if ((p)==0) qt_check_pointer(__FILE__,__LINE__);}'"
669#warning "No need for qt_check_pointer() to return a value - make it void!" 702#warning "No need for qt_check_pointer() to return a value - make it void!"
670#endif 703#endif
671#endif 704#endif
672bool qt_check_pointer( bool c, const char *n, int l ) 705bool qt_check_pointer( bool c, const char *n, int l )
673{ 706{
674 if ( c ) 707 if ( c )
675 qWarning( "In file %s, line %d: Out of memory", n, l ); 708 qWarning( "In file %s, line %d: Out of memory", n, l );
676 return TRUE; 709 return TRUE;
677} 710}
678 711
679 712
680static bool firstObsoleteWarning(const char *obj, const char *oldfunc ) 713static bool firstObsoleteWarning(const char *obj, const char *oldfunc )
681{ 714{
682 static QAsciiDict<int> *obsoleteDict = 0; 715 static QAsciiDict<int> *obsoleteDict = 0;
683 if ( !obsoleteDict ) { // first time func is called 716 if ( !obsoleteDict ) { // first time func is called
684 obsoleteDict = new QAsciiDict<int>; 717 obsoleteDict = new QAsciiDict<int>;
685#if defined(QT_DEBUG) 718#if defined(QT_DEBUG)
686 qDebug( 719 qDebug(
687 "You are using obsolete functions in the Qt library. Call the function\n" 720 "You are using obsolete functions in the Qt library. Call the function\n"
688 "qSuppressObsoleteWarnings() to suppress obsolete warnings.\n" 721 "qSuppressObsoleteWarnings() to suppress obsolete warnings.\n"
689 ); 722 );
690#endif 723#endif
691 } 724 }
692 QCString s( obj ); 725 QCString s( obj );
693 s += "::"; 726 s += "::";
694 s += oldfunc; 727 s += oldfunc;
695 if ( obsoleteDict->find(s.data()) == 0 ) { 728 if ( obsoleteDict->find(s.data()) == 0 ) {
696 obsoleteDict->insert( s.data(), (int*)1 );// anything different from 0 729 obsoleteDict->insert( s.data(), (int*)1 );// anything different from 0
697 return TRUE; 730 return TRUE;
698 } 731 }
699 return FALSE; 732 return FALSE;
700} 733}
701 734
702static bool suppressObsolete = FALSE; 735static bool suppressObsolete = FALSE;
703 736
704void qSuppressObsoleteWarnings( bool suppress ) 737void qSuppressObsoleteWarnings( bool suppress )
705{ 738{
706 suppressObsolete = suppress; 739 suppressObsolete = suppress;
707} 740}
708 741
709 void qObsolete( const char *obj, const char *oldfunc, const char *newfunc ) 742 void qObsolete( const char *obj, const char *oldfunc, const char *newfunc )
710{ 743{
711 if ( suppressObsolete ) 744 if ( suppressObsolete )
712 return; 745 return;
713 if ( !firstObsoleteWarning(obj, oldfunc) ) 746 if ( !firstObsoleteWarning(obj, oldfunc) )
714 return; 747 return;
715 if ( obj ) 748 if ( obj )
716 qDebug( "%s::%s: This function is obsolete, use %s instead.", 749 qDebug( "%s::%s: This function is obsolete, use %s instead.",
717 obj, oldfunc, newfunc ); 750 obj, oldfunc, newfunc );
718 else 751 else
719 qDebug( "%s: This function is obsolete, use %s instead.", 752 qDebug( "%s: This function is obsolete, use %s instead.",
720 oldfunc, newfunc ); 753 oldfunc, newfunc );
721} 754}
722 755
723 void qObsolete( const char *obj, const char *oldfunc ) 756 void qObsolete( const char *obj, const char *oldfunc )
724{ 757{
725 if ( suppressObsolete ) 758 if ( suppressObsolete )
726 return; 759 return;
727 if ( !firstObsoleteWarning(obj, oldfunc) ) 760 if ( !firstObsoleteWarning(obj, oldfunc) )
728 return; 761 return;
729 if ( obj ) 762 if ( obj )
730 qDebug( "%s::%s: This function is obsolete.", obj, oldfunc ); 763 qDebug( "%s::%s: This function is obsolete.", obj, oldfunc );
731 else 764 else
732 qDebug( "%s: This function is obsolete.", oldfunc ); 765 qDebug( "%s: This function is obsolete.", oldfunc );
733} 766}
734 767
735 void qObsolete( const char *message ) 768 void qObsolete( const char *message )
736{ 769{
737 if ( suppressObsolete ) 770 if ( suppressObsolete )
738 return; 771 return;
739 if ( !firstObsoleteWarning( "Qt", message) ) 772 if ( !firstObsoleteWarning( "Qt", message) )
740 return; 773 return;
741 qDebug( "%s", message ); 774 qDebug( "%s", message );
742} 775}
743 776
744 777
745/*! 778/*!
746 \relates QApplication 779 \relates QApplication
747 780
748 Installs a Qt message handler \a h. Returns a pointer to the 781 Installs a Qt message handler \a h. Returns a pointer to the
749 message handler previously defined. 782 message handler previously defined.
750 783
751 The message handler is a function that prints out debug messages, 784 The message handler is a function that prints out debug messages,
752 warnings and fatal error messages. The Qt library (debug version) 785 warnings and fatal error messages. The Qt library (debug version)
753 contains hundreds of warning messages that are printed when 786 contains hundreds of warning messages that are printed when
754 internal errors (usually invalid function arguments) occur. If you 787 internal errors (usually invalid function arguments) occur. If you
755 implement your own message handler, you get total control of these 788 implement your own message handler, you get total control of these
756 messages. 789 messages.
757 790
758 The default message handler prints the message to the standard 791 The default message handler prints the message to the standard
759 output under X11 or to the debugger under Windows. If it is a 792 output under X11 or to the debugger under Windows. If it is a
760 fatal message, the application aborts immediately. 793 fatal message, the application aborts immediately.
761 794
762 Only one message handler can be defined, since this is usually 795 Only one message handler can be defined, since this is usually
763 done on an application-wide basis to control debug output. 796 done on an application-wide basis to control debug output.
764 797
765 To restore the message handler, call \c qInstallMsgHandler(0). 798 To restore the message handler, call \c qInstallMsgHandler(0).
766 799
767 Example: 800 Example:
768 \code 801 \code
769 #include <qapplication.h> 802 #include <qapplication.h>
770 #include <stdio.h> 803 #include <stdio.h>
771 #include <stdlib.h> 804 #include <stdlib.h>
772 805
773 void myMessageOutput( QtMsgType type, const char *msg ) 806 void myMessageOutput( QtMsgType type, const char *msg )
774 { 807 {
775 switch ( type ) { 808 switch ( type ) {
776 case QtDebugMsg: 809 case QtDebugMsg:
777 fprintf( stderr, "Debug: %s\n", msg ); 810 fprintf( stderr, "Debug: %s\n", msg );
778 break; 811 break;
779 case QtWarningMsg: 812 case QtWarningMsg:
780 fprintf( stderr, "Warning: %s\n", msg ); 813 fprintf( stderr, "Warning: %s\n", msg );
781 break; 814 break;
782 case QtFatalMsg: 815 case QtFatalMsg:
783 fprintf( stderr, "Fatal: %s\n", msg ); 816 fprintf( stderr, "Fatal: %s\n", msg );
784 abort(); // deliberately core dump 817 abort(); // deliberately core dump
785 } 818 }
786 } 819 }
787 820
788 int main( int argc, char **argv ) 821 int main( int argc, char **argv )
789 { 822 {
790 qInstallMsgHandler( myMessageOutput ); 823 qInstallMsgHandler( myMessageOutput );
791 QApplication a( argc, argv ); 824 QApplication a( argc, argv );
792 ... 825 ...
793 return a.exec(); 826 return a.exec();
794 } 827 }
795 \endcode 828 \endcode
796 829
797 \sa qDebug(), qWarning(), qFatal(), \link debug.html Debugging\endlink 830 \sa qDebug(), qWarning(), qFatal(), \link debug.html Debugging\endlink
798*/ 831*/
799 832
800QtMsgHandler qInstallMsgHandler( QtMsgHandler h ) 833QtMsgHandler qInstallMsgHandler( QtMsgHandler h )
801{ 834{
802 QtMsgHandler old = handler; 835 QtMsgHandler old = handler;
803 handler = h; 836 handler = h;
804 return old; 837 return old;
805} 838}
806 839
807 840
808/* 841/*
809 Dijkstra's bisection algorithm to find the square root as an integer. 842 Dijkstra's bisection algorithm to find the square root as an integer.
810 Deliberately not exported as part of the Qt API, but used in both 843 Deliberately not exported as part of the Qt API, but used in both
811 qsimplerichtext.cpp and qgfxraster_qws.cpp 844 qsimplerichtext.cpp and qgfxraster_qws.cpp
812*/ 845*/
813unsigned int qt_int_sqrt( unsigned int n ) 846unsigned int qt_int_sqrt( unsigned int n )
814{ 847{
815 // n must be in the range 0...UINT_MAX/2-1 848 // n must be in the range 0...UINT_MAX/2-1
816 if ( n >= ( UINT_MAX>>2 ) ) { 849 if ( n >= ( UINT_MAX>>2 ) ) {
817 unsigned int r = 2 * qt_int_sqrt( n / 4 ); 850 unsigned int r = 2 * qt_int_sqrt( n / 4 );
818 unsigned int r2 = r + 1; 851 unsigned int r2 = r + 1;
819 return ( n >= r2 * r2 ) ? r2 : r; 852 return ( n >= r2 * r2 ) ? r2 : r;
820 } 853 }
821 uint h, p= 0, q= 1, r= n; 854 uint h, p= 0, q= 1, r= n;
822 while ( q <= n ) 855 while ( q <= n )
823 q <<= 2; 856 q <<= 2;
824 while ( q != 1 ) { 857 while ( q != 1 ) {
825 q >>= 2; 858 q >>= 2;
826 h= p + q; 859 h= p + q;
827 p >>= 1; 860 p >>= 1;
828 if ( r >= h ) { 861 if ( r >= h ) {
829 p += q; 862 p += q;
830 r -= h; 863 r -= h;
831 } 864 }
832 } 865 }
833 return p; 866 return p;
834} 867}
835 868