1 /********************************************************************************
2 *                                                                               *
3 *                     FOX Definitions, Types, and Macros                        *
4 *                                                                               *
5 *********************************************************************************
6 * Copyright (C) 1997,2006 by Jeroen van der Zijp.   All Rights Reserved.        *
7 *********************************************************************************
8 * This library is free software; you can redistribute it and/or                 *
9 * modify it under the terms of the GNU Lesser General Public                    *
10 * License as published by the Free Software Foundation; either                  *
11 * version 2.1 of the License, or (at your option) any later version.            *
12 *                                                                               *
13 * This library is distributed in the hope that it will be useful,               *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
16 * Lesser General Public License for more details.                               *
17 *                                                                               *
18 * You should have received a copy of the GNU Lesser General Public              *
19 * License along with this library; if not, write to the Free Software           *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
21 *********************************************************************************
22 * $Id: fxdefs.h 3297 2015-12-14 20:30:04Z arthurcnorman $                           *
23 ********************************************************************************/
24 #ifndef FXDEFS_H
25 #define FXDEFS_H
26 
27 
28 /********************************  Definitions  ********************************/
29 
30 // Truth values
31 #ifndef TRUE
32 #define TRUE 1
33 #endif
34 #ifndef FALSE
35 #define FALSE 0
36 #endif
37 #ifndef MAYBE
38 #define MAYBE 2
39 #endif
40 #ifndef NULL
41 #define NULL 0
42 #endif
43 
44 /// Pi
45 #ifndef PI
46 #define PI      3.1415926535897932384626433833
47 #endif
48 
49 /// Euler constant
50 #define EULER   2.7182818284590452353602874713
51 
52 /// Multiplier for degrees to radians
53 #define DTOR    0.0174532925199432957692369077
54 
55 /// Multiplier for radians to degrees
56 #define RTOD    57.295779513082320876798154814
57 
58 
59 // Path separator
60 #ifdef WIN32
61 #define PATHSEP '\\'
62 #define PATHSEPSTRING "\\"
63 #define PATHLISTSEP ';'
64 #define PATHLISTSEPSTRING ";"
65 #define ISPATHSEP(c) ((c)=='/' || (c)=='\\')
66 #else
67 #define PATHSEP '/'
68 #define PATHSEPSTRING "/"
69 #define PATHLISTSEP ':'
70 #define PATHLISTSEPSTRING ":"
71 #define ISPATHSEP(c) ((c)=='/')
72 #endif
73 
74 // End Of Line
75 #ifdef WIN32
76 #define ENDLINE "\r\n"
77 #else
78 #define ENDLINE "\n"
79 #endif
80 
81 
82 // For Windows
83 #ifdef _DEBUG
84 #ifndef DEBUG
85 #define DEBUG
86 #endif
87 #endif
88 #ifdef _NDEBUG
89 #ifndef NDEBUG
90 #define NDEBUG
91 #endif
92 #endif
93 
94 
95 // Shared library support
96 #ifdef WIN32
97 #define FXLOCAL
98 #define FXEXPORT __declspec(dllexport)
99 #define FXIMPORT __declspec(dllimport)
100 #else
101 #if defined(__GNUC__) && (__GNUC__ >= 4)
102 #define FXLOCAL  __attribute__ ((visibility("hidden")))
103 #define FXEXPORT __attribute__ ((visibility("default")))
104 #define FXIMPORT
105 #else
106 #define FXLOCAL
107 #define FXEXPORT
108 #define FXIMPORT
109 #endif
110 #endif
111 
112 // Define FXAPI for DLL builds
113 #ifdef FOXDLL
114 #ifdef FOXDLL_EXPORTS
115 #define FXAPI FXEXPORT
116 #define FXTEMPLATE_EXTERN
117 #else
118 #define FXAPI FXIMPORT
119 #define FXTEMPLATE_EXTERN extern
120 #endif
121 #else
122 #define FXAPI
123 #define FXTEMPLATE_EXTERN
124 #endif
125 
126 // Callback
127 #ifdef WIN32
128 #ifndef CALLBACK
129 #define CALLBACK __stdcall
130 #endif
131 #endif
132 
133 
134 // Disable some warnings in VC++
135 #ifdef _MSC_VER
136 #pragma warning(disable: 4251)
137 #pragma warning(disable: 4231)
138 #pragma warning(disable: 4244)
139 #endif
140 
141 // Checking printf and scanf format strings
142 #if defined(_CC_GNU_) || defined(__GNUG__) || defined(__GNUC__)
143 #define FX_PRINTF(fmt,arg) __attribute__((format(printf,fmt,arg)))
144 #define FX_SCANF(fmt,arg)  __attribute__((format(scanf,fmt,arg)))
145 #else
146 #define FX_PRINTF(fmt,arg)
147 #define FX_SCANF(fmt,arg)
148 #endif
149 
150 // Raw event type
151 #ifndef WIN32
152 union _XEvent;
153 #else
154 struct tagMSG;
155 #endif
156 
157 
158 namespace FX {
159 
160 
161 // FOX System Defined Selector Types
162 enum FXSelType {
163   SEL_NONE,
164   SEL_KEYPRESS,                         /// Key pressed
165   SEL_KEYRELEASE,                       /// Key released
166   SEL_LEFTBUTTONPRESS,                  /// Left mouse button pressed
167   SEL_LEFTBUTTONRELEASE,                /// Left mouse button released
168   SEL_MIDDLEBUTTONPRESS,                /// Middle mouse button pressed
169   SEL_MIDDLEBUTTONRELEASE,              /// Middle mouse button released
170   SEL_RIGHTBUTTONPRESS,                 /// Right mouse button pressed
171   SEL_RIGHTBUTTONRELEASE,               /// Right mouse button released
172   SEL_MOTION,                           /// Mouse motion
173   SEL_ENTER,                            /// Mouse entered window
174   SEL_LEAVE,                            /// Mouse left window
175   SEL_FOCUSIN,                          /// Focus into window
176   SEL_FOCUSOUT,                         /// Focus out of window
177   SEL_KEYMAP,
178   SEL_UNGRABBED,                        /// Lost the grab (Windows)
179   SEL_PAINT,                            /// Must repaint window
180   SEL_CREATE,
181   SEL_DESTROY,
182   SEL_UNMAP,                            /// Window was hidden
183   SEL_MAP,                              /// Window was shown
184   SEL_CONFIGURE,                        /// Resize
185   SEL_SELECTION_LOST,                   /// Widget lost selection
186   SEL_SELECTION_GAINED,                 /// Widget gained selection
187   SEL_SELECTION_REQUEST,                /// Inquire selection data
188   SEL_RAISED,                           /// Window to top of stack
189   SEL_LOWERED,                          /// Window to bottom of stack
190   SEL_CLOSE,                            /// Close window
191   SEL_DELETE,                           /// Delete window
192   SEL_MINIMIZE,                         /// Iconified
193   SEL_RESTORE,                          /// No longer iconified or maximized
194   SEL_MAXIMIZE,                         /// Maximized
195   SEL_UPDATE,                           /// GUI update
196   SEL_COMMAND,                          /// GUI command
197   SEL_CLICKED,                          /// Clicked
198   SEL_DOUBLECLICKED,                    /// Double-clicked
199   SEL_TRIPLECLICKED,                    /// Triple-clicked
200   SEL_MOUSEWHEEL,                       /// Mouse wheel
201   SEL_CHANGED,                          /// GUI has changed
202   SEL_VERIFY,                           /// Verify change
203   SEL_DESELECTED,                       /// Deselected
204   SEL_SELECTED,                         /// Selected
205   SEL_INSERTED,                         /// Inserted
206   SEL_REPLACED,                         /// Replaced
207   SEL_DELETED,                          /// Deleted
208   SEL_OPENED,                           /// Opened
209   SEL_CLOSED,                           /// Closed
210   SEL_EXPANDED,                         /// Expanded
211   SEL_COLLAPSED,                        /// Collapsed
212   SEL_BEGINDRAG,                        /// Start a drag
213   SEL_ENDDRAG,                          /// End a drag
214   SEL_DRAGGED,                          /// Dragged
215   SEL_LASSOED,                          /// Lassoed
216   SEL_TIMEOUT,                          /// Timeout occurred
217   SEL_SIGNAL,                           /// Signal received
218   SEL_CLIPBOARD_LOST,                   /// Widget lost clipboard
219   SEL_CLIPBOARD_GAINED,                 /// Widget gained clipboard
220   SEL_CLIPBOARD_REQUEST,                /// Inquire clipboard data
221   SEL_CHORE,                            /// Background chore
222   SEL_FOCUS_SELF,                       /// Focus on widget itself
223   SEL_FOCUS_RIGHT,                      /// Focus moved right
224   SEL_FOCUS_LEFT,                       /// Focus moved left
225   SEL_FOCUS_DOWN,                       /// Focus moved down
226   SEL_FOCUS_UP,                         /// Focus moved up
227   SEL_FOCUS_NEXT,                       /// Focus moved to next widget
228   SEL_FOCUS_PREV,                       /// Focus moved to previous widget
229   SEL_DND_ENTER,                        /// Drag action entering potential drop target
230   SEL_DND_LEAVE,                        /// Drag action leaving potential drop target
231   SEL_DND_DROP,                         /// Drop on drop target
232   SEL_DND_MOTION,                       /// Drag position changed over potential drop target
233   SEL_DND_REQUEST,                      /// Inquire drag and drop data
234   SEL_IO_READ,                          /// Read activity on a pipe
235   SEL_IO_WRITE,                         /// Write activity on a pipe
236   SEL_IO_EXCEPT,                        /// Except activity on a pipe
237   SEL_PICKED,                           /// Picked some location
238   SEL_QUERY_TIP,                        /// Message inquiring about tooltip
239   SEL_QUERY_HELP,                       /// Message inquiring about statusline help
240   SEL_DOCKED,                           /// Toolbar docked
241   SEL_FLOATED,                          /// Toolbar floated
242   SEL_SESSION_NOTIFY,                   /// Session is about to close
243   SEL_SESSION_CLOSED,                   /// Session is closed
244   SEL_LAST
245   };
246 
247 
248 /// FOX Keyboard and Button states
249 enum {
250   SHIFTMASK        = 0x001,           /// Shift key is down
251   CAPSLOCKMASK     = 0x002,           /// Caps Lock key is down
252   CONTROLMASK      = 0x004,           /// Ctrl key is down
253 #ifdef __APPLE__
254   ALTMASK          = 0x2000,          /// Alt key is down
255   METAMASK         = 0x10,            /// Meta key is down
256 #else
257   ALTMASK          = 0x008,           /// Alt key is down
258   METAMASK         = 0x040,           /// Meta key is down
259 #endif
260   NUMLOCKMASK      = 0x010,           /// Num Lock key is down
261   SCROLLLOCKMASK   = 0x0E0,           /// Scroll Lock key is down (seems to vary)
262   LEFTBUTTONMASK   = 0x100,           /// Left mouse button is down
263   MIDDLEBUTTONMASK = 0x200,           /// Middle mouse button is down
264   RIGHTBUTTONMASK  = 0x400            /// Right mouse button is down
265   };
266 
267 
268 /// FOX Mouse buttons
269 enum {
270   LEFTBUTTON       = 1,
271   MIDDLEBUTTON     = 2,
272   RIGHTBUTTON      = 3
273   };
274 
275 
276 /// FOX window crossing modes
277 enum {
278   CROSSINGNORMAL,		     /// Normal crossing event
279   CROSSINGGRAB,			     /// Crossing due to mouse grab
280   CROSSINGUNGRAB		     /// Crossing due to mouse ungrab
281   };
282 
283 
284 /// FOX window visibility modes
285 enum {
286   VISIBILITYTOTAL,
287   VISIBILITYPARTIAL,
288   VISIBILITYNONE
289   };
290 
291 
292 /// Options for fxfilematch
293 enum {
294   FILEMATCH_FILE_NAME   = 1,        /// No wildcard can ever match `/'
295   FILEMATCH_NOESCAPE    = 2,        /// Backslashes don't quote special chars
296   FILEMATCH_PERIOD      = 4,        /// Leading `.' is matched only explicitly
297   FILEMATCH_LEADING_DIR = 8,        /// Ignore `/...' after a match
298   FILEMATCH_CASEFOLD    = 16        /// Compare without regard to case
299   };
300 
301 
302 /// Drag and drop actions
303 enum FXDragAction {
304   DRAG_REJECT  = 0,                 /// Reject all drop actions
305   DRAG_ACCEPT  = 1,                 /// Accept any drop action
306   DRAG_COPY    = 2,                 /// Copy
307   DRAG_MOVE    = 3,                 /// Move
308   DRAG_LINK    = 4,                 /// Link
309   DRAG_PRIVATE = 5                  /// Private
310   };
311 
312 
313 /// Origin of data
314 enum FXDNDOrigin {
315   FROM_SELECTION  = 0,              /// Primary selection
316   FROM_CLIPBOARD  = 1,              /// Clipboard
317   FROM_DRAGNDROP  = 2               /// Drag and drop source
318   };
319 
320 
321 /// Exponent display
322 enum FXExponent {
323   EXP_NEVER=FALSE,                  /// Never use exponential notation
324   EXP_ALWAYS=TRUE,                  /// Always use exponential notation
325   EXP_AUTO=MAYBE                    /// Use exponential notation if needed
326   };
327 
328 
329 /// Search modes for search/replace dialogs
330 enum {
331   SEARCH_FORWARD      = 0,    /// Search forward (default)
332   SEARCH_BACKWARD     = 1,    /// Search backward
333   SEARCH_NOWRAP       = 0,    /// Don't wrap (default)
334   SEARCH_WRAP         = 2,    /// Wrap around to start
335   SEARCH_EXACT        = 0,    /// Exact match (default)
336   SEARCH_IGNORECASE   = 4,    /// Ignore case
337   SEARCH_REGEX        = 8,    /// Regular expression match
338   SEARCH_PREFIX       = 16    /// Prefix of subject string
339   };
340 
341 
342 /*********************************  Typedefs  **********************************/
343 
344 // Forward declarations
345 class                          FXObject;
346 class                          FXStream;
347 class                          FXString;
348 
349 
350 // Streamable types; these are fixed size!
351 typedef char                   FXchar;
352 typedef unsigned char          FXuchar;
353 typedef FXuchar                FXbool;
354 typedef unsigned short         FXushort;
355 typedef short                  FXshort;
356 typedef unsigned int           FXuint;
357 typedef int                    FXint;
358 typedef float                  FXfloat;
359 typedef double                 FXdouble;
360 typedef FXObject              *FXObjectPtr;
361 #if defined WIN32 || defined __CYGWIN__
362 typedef unsigned int           FXwchar;
363 #if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)
364 typedef unsigned short         FXnchar;
365 #elif defined(__WATCOM_INT64__)
366 typedef long char FXnchar;
367 #else
368 typedef wchar_t                FXnchar;
369 #endif
370 #else
371 typedef wchar_t                FXwchar;
372 typedef unsigned short         FXnchar;
373 #endif
374 #if defined(__LP64__) || defined(_LP64) || (_MIPS_SZLONG == 64) || (__WORDSIZE == 64)
375 typedef unsigned long          FXulong;
376 typedef long                   FXlong;
377 #elif defined(_MSC_VER) || (defined(__BCPLUSPLUS__) && __BORLANDC__ > 0x500) || defined(__WATCOM_INT64__)
378 typedef unsigned __int64       FXulong;
379 typedef __int64                FXlong;
380 #elif defined(__GNUG__) || defined(__GNUC__) || defined(__SUNPRO_CC) || defined(__MWERKS__) || defined(__SC__) || defined(_LONGLONG)
381 typedef unsigned long long     FXulong;
382 typedef long long              FXlong;
383 #else
384 #error "FXlong and FXulong not defined for this architecture!"
385 #endif
386 
387 // Integral types large enough to hold value of a pointer
388 #if defined(_MSC_VER) && defined(_WIN64)
389 typedef __int64                FXival;
390 typedef unsigned __int64       FXuval;
391 #elif defined(__GNUC__) && defined(_WIN64)
392 typedef long long              FXival;
393 typedef unsigned long long     FXuval;
394 #else
395 typedef long                   FXival;
396 typedef unsigned long          FXuval;
397 #endif
398 
399 
400 // Handle to something in server
401 #ifndef WIN32
402 typedef unsigned long          FXID;
403 #else
404 typedef void*                  FXID;
405 #endif
406 
407 // Time since January 1, 1970 (UTC)
408 typedef long                   FXTime;
409 
410 // Pixel type (could be color index)
411 typedef unsigned long          FXPixel;
412 
413 // RGBA pixel value
414 typedef FXuint                 FXColor;
415 
416 // Hot key
417 typedef FXuint                 FXHotKey;
418 
419 // Drag type
420 #ifndef WIN32
421 typedef FXID                   FXDragType;
422 #else
423 typedef FXushort               FXDragType;
424 #endif
425 
426 // Input source handle type
427 #ifndef WIN32
428 typedef FXint                  FXInputHandle;
429 #else
430 typedef void*                  FXInputHandle;
431 #endif
432 
433 // Raw event type
434 #ifndef WIN32
435 typedef _XEvent                FXRawEvent;
436 #else
437 typedef tagMSG                 FXRawEvent;
438 #endif
439 
440 
441 /**********************************  Macros  ***********************************/
442 
443 
444 /// Abolute value
445 #define FXABS(val) (((val)>=0)?(val):-(val))
446 
447 /// Return the maximum of a or b
448 #define FXMAX(a,b) (((a)>(b))?(a):(b))
449 
450 /// Return the minimum of a or b
451 #define FXMIN(a,b) (((a)>(b))?(b):(a))
452 
453 /// Return the minimum of x, y and z
454 #define FXMIN3(x,y,z) ((x)<(y)?FXMIN(x,z):FXMIN(y,z))
455 
456 /// Return the maximum of x, y and z
457 #define FXMAX3(x,y,z) ((x)>(y)?FXMAX(x,z):FXMAX(y,z))
458 
459 /// Return the minimum of x, y, z, and w
460 #define FXMIN4(x,y,z,w) (FXMIN(FXMIN(x,y),FXMIN(z,w)))
461 
462 /// Return the maximum of of x, y, z, and w
463 #define FXMAX4(x,y,z,w) (FXMAX(FXMAX(x,y),FXMAX(z,w)))
464 
465 /// Return minimum and maximum of a, b
466 #define FXMINMAX(lo,hi,a,b) ((a)<(b)?((lo)=(a),(hi)=(b)):((lo)=(b),(hi)=(a)))
467 
468 /// Clamp value x to range [lo..hi]
469 #define FXCLAMP(lo,x,hi) ((x)<(lo)?(lo):((x)>(hi)?(hi):(x)))
470 
471 /// Swap a pair of numbers
472 #define FXSWAP(a,b,t) ((t)=(a),(a)=(b),(b)=(t))
473 
474 /// Linear interpolation between a and b, where 0<=f<=1
475 #define FXLERP(a,b,f) ((a)+((b)-(a))*(f))
476 
477 /// Offset of member in a structure
478 #define STRUCTOFFSET(str,member) (((char *)(&(((str *)0)->member)))-((char *)0))
479 
480 /// Number of elements in a static array
481 #define ARRAYNUMBER(array) (sizeof(array)/sizeof(array[0]))
482 
483 /// Container class of a member class
484 #define CONTAINER(ptr,str,mem) ((str*)(((char*)(ptr))-STRUCTOFFSET(str,mem)))
485 
486 /// Make int out of two shorts
487 #define MKUINT(l,h) ((((FX::FXuint)(l))&0xffff) | (((FX::FXuint)(h))<<16))
488 
489 /// Make selector from message type and message id
490 #define FXSEL(type,id) ((((FX::FXuint)(id))&0xffff) | (((FX::FXuint)(type))<<16))
491 
492 /// Get type from selector
493 #define FXSELTYPE(s) ((FX::FXushort)(((s)>>16)&0xffff))
494 
495 /// Get ID from selector
496 #define FXSELID(s) ((FX::FXushort)((s)&0xffff))
497 
498 /// Reverse bits in byte
499 #define FXBITREVERSE(b) (((b&0x01)<<7)|((b&0x02)<<5)|((b&0x04)<<3)|((b&0x08)<<1)|((b&0x10)>>1)|((b&0x20)>>3)|((b&0x40)>>5)|((b&0x80)>>7))
500 
501 /// Test if character c is at the start of a utf8 sequence
502 #define FXISUTF(c) (((c)&0xC0)!=0x80)
503 
504 
505 // Definitions for big-endian machines
506 #if FOX_BIGENDIAN == 1
507 
508 /// Make RGBA color
509 #define FXRGBA(r,g,b,a)    (((FX::FXuint)(FX::FXuchar)(r)<<24) | ((FX::FXuint)(FX::FXuchar)(g)<<16) | ((FX::FXuint)(FX::FXuchar)(b)<<8) | ((FX::FXuint)(FX::FXuchar)(a)))
510 
511 /// Make RGB color
512 #define FXRGB(r,g,b)       (((FX::FXuint)(FX::FXuchar)(r)<<24) | ((FX::FXuint)(FX::FXuchar)(g)<<16) | ((FX::FXuint)(FX::FXuchar)(b)<<8) | 0x000000ff)
513 
514 /// Get red value from RGBA color
515 #define FXREDVAL(rgba)     ((FX::FXuchar)(((rgba)>>24)&0xff))
516 
517 /// Get green value from RGBA color
518 #define FXGREENVAL(rgba)   ((FX::FXuchar)(((rgba)>>16)&0xff))
519 
520 /// Get blue value from RGBA color
521 #define FXBLUEVAL(rgba)    ((FX::FXuchar)(((rgba)>>8)&0xff))
522 
523 /// Get alpha value from RGBA color
524 #define FXALPHAVAL(rgba)   ((FX::FXuchar)((rgba)&0xff))
525 
526 /// Get component value of RGBA color
527 #define FXRGBACOMPVAL(rgba,comp) ((FX::FXuchar)(((rgba)>>((3-(comp))<<3))&0xff))
528 
529 #endif
530 
531 
532 // Definitions for little-endian machines
533 #if FOX_BIGENDIAN == 0
534 
535 /// Make RGBA color
536 #define FXRGBA(r,g,b,a)    (((FX::FXuint)(FX::FXuchar)(r)) | ((FX::FXuint)(FX::FXuchar)(g)<<8) | ((FX::FXuint)(FX::FXuchar)(b)<<16) | ((FX::FXuint)(FX::FXuchar)(a)<<24))
537 
538 /// Make RGB color
539 #define FXRGB(r,g,b)       (((FX::FXuint)(FX::FXuchar)(r)) | ((FX::FXuint)(FX::FXuchar)(g)<<8) | ((FX::FXuint)(FX::FXuchar)(b)<<16) | 0xff000000)
540 
541 /// Get red value from RGBA color
542 #define FXREDVAL(rgba)     ((FX::FXuchar)((rgba)&0xff))
543 
544 /// Get green value from RGBA color
545 #define FXGREENVAL(rgba)   ((FX::FXuchar)(((rgba)>>8)&0xff))
546 
547 /// Get blue value from RGBA color
548 #define FXBLUEVAL(rgba)    ((FX::FXuchar)(((rgba)>>16)&0xff))
549 
550 /// Get alpha value from RGBA color
551 #define FXALPHAVAL(rgba)   ((FX::FXuchar)(((rgba)>>24)&0xff))
552 
553 /// Get component value of RGBA color
554 #define FXRGBACOMPVAL(rgba,comp) ((FX::FXuchar)(((rgba)>>((comp)<<3))&0xff))
555 
556 #endif
557 
558 
559 /**
560 * FXASSERT() prints out a message when the expression fails,
561 * and nothing otherwise.  Unlike assert(), FXASSERT() will not
562 * terminate the execution of the application.
563 * When compiling your application for release, all assertions
564 * are compiled out; thus there is no impact on execution speed.
565 */
566 #ifndef NDEBUG
567 #define FXASSERT(exp) ((exp)?((void)0):(void)FX::fxassert(#exp,__FILE__,__LINE__))
568 #else
569 #define FXASSERT(exp) ((void)0)
570 #endif
571 
572 
573 /**
574 * FXTRACE() allows you to trace the execution of your application
575 * with increasing levels of detail the higher the trace level.
576 * The trace level is determined by variable fxTraceLevel, which
577 * may be set from the command line with "-tracelevel <level>".
578 * When compiling your application for release, all trace statements
579 * are compiled out, just like FXASSERT.
580 * A statement like: FXTRACE((10,"The value of x=%d\n",x)) will
581 * generate output only if fxTraceLevel is set to 11 or greater.
582 * The default value fxTraceLevel=0 will block all trace outputs.
583 * Note the double parentheses!
584 */
585 #ifndef NDEBUG
586 #define FXTRACE(arguments) FX::fxtrace arguments
587 #else
588 #define FXTRACE(arguments) ((void)0)
589 #endif
590 
591 
592 /**
593 * Allocate a memory block of no elements of type and store a pointer
594 * to it into the address pointed to by ptr.
595 * Return FALSE if size!=0 and allocation fails, TRUE otherwise.
596 * An allocation of a zero size block returns a NULL pointer.
597 */
598 #define FXMALLOC(ptr,type,no)     (FX::fxmalloc((void **)(ptr),sizeof(type)*(no)))
599 
600 /**
601 * Allocate a zero-filled memory block no elements of type and store a pointer
602 * to it into the address pointed to by ptr.
603 * Return FALSE if size!=0 and allocation fails, TRUE otherwise.
604 * An allocation of a zero size block returns a NULL pointer.
605 */
606 #define FXCALLOC(ptr,type,no)     (FX::fxcalloc((void **)(ptr),sizeof(type)*(no)))
607 
608 /**
609 * Resize the memory block referred to by the pointer at the address ptr, to a
610 * hold no elements of type.
611 * Returns FALSE if size!=0 and reallocation fails, TRUE otherwise.
612 * If reallocation fails, pointer is left to point to old block; a reallocation
613 * to a zero size block has the effect of freeing it.
614 * The ptr argument must be the address where the pointer to the allocated
615 * block is to be stored.
616 */
617 #define FXRESIZE(ptr,type,no)     (FX::fxresize((void **)(ptr),sizeof(type)*(no)))
618 
619 /**
620 * Allocate and initialize memory from another block.
621 * Return FALSE if size!=0 and source!=NULL and allocation fails, TRUE otherwise.
622 * An allocation of a zero size block returns a NULL pointer.
623 * The ptr argument must be the address where the pointer to the allocated
624 * block is to be stored.
625 */
626 #define FXMEMDUP(ptr,src,type,no) (FX::fxmemdup((void **)(ptr),(const void*)(src),sizeof(type)*(no)))
627 
628 /**
629 * Free a block of memory allocated with either FXMALLOC, FXCALLOC, FXRESIZE, or FXMEMDUP.
630 * It is OK to call free a NULL pointer.  The argument must be the address of the
631 * pointer to the block to be released.  The pointer is set to NULL to prevent
632 * any further references to the block after releasing it.
633 */
634 #define FXFREE(ptr)               (FX::fxfree((void **)(ptr)))
635 
636 
637 /**
638 * These are some of the ISO C99 standard single-precision transcendental functions.
639 * On LINUX, specify _GNU_SOURCE or _ISOC99_SOURCE to enable native implementation;
640 * otherwise, these macros will be used.  Apple OS-X implements fabsf(x), ceilf(x),
641 * floorf(x), and fmodf(x,y).
642 * Define FLOAT_MATH_FUNCTIONS if these functions are available in some other
643 * library you're linking to.
644 */
645 #ifdef __OpenBSD__
646 #define FLOAT_MATH_FUNCTIONS
647 #endif
648 #ifndef FLOAT_MATH_FUNCTIONS
649 #ifndef __USE_ISOC99
650 #ifndef __APPLE__
651 #define fabsf(x)    ((float)fabs((double)(x)))
652 #define ceilf(x)    ((float)ceil((double)(x)))
653 #define floorf(x)   ((float)floor((double)(x)))
654 #define fmodf(x,y)  ((float)fmod((double)(x),(double)(y)))
655 #endif
656 #define sqrtf(x)    ((float)sqrt((double)(x)))
657 #define sinf(x)     ((float)sin((double)(x)))
658 #define cosf(x)     ((float)cos((double)(x)))
659 #define tanf(x)     ((float)tan((double)(x)))
660 #define asinf(x)    ((float)asin((double)(x)))
661 #define acosf(x)    ((float)acos((double)(x)))
662 #define atanf(x)    ((float)atan((double)(x)))
663 #define atan2f(y,x) ((float)atan2((double)(y),(double)(x)))
664 #define powf(x,y)   ((float)pow((double)(x),(double)(y)))
665 #define expf(x)     ((float)exp((double)(x)))
666 #define logf(x)     ((float)log((double)(x)))
667 #define log10f(x)   ((float)log10((double)(x)))
668 #endif
669 #endif
670 
671 
672 /**********************************  Globals  **********************************/
673 
674 /// Simple, thread-safe, random number generator
675 extern FXAPI FXuint fxrandom(FXuint& seed);
676 
677 /// Allocate memory
678 extern FXAPI FXint fxmalloc(void** ptr,unsigned long size);
679 
680 /// Allocate cleaned memory
681 extern FXAPI FXint fxcalloc(void** ptr,unsigned long size);
682 
683 /// Resize memory
684 extern FXAPI FXint fxresize(void** ptr,unsigned long size);
685 
686 /// Duplicate memory
687 extern FXAPI FXint fxmemdup(void** ptr,const void* src,unsigned long size);
688 
689 /// Free memory, resets ptr to NULL afterward
690 extern FXAPI void fxfree(void** ptr);
691 
692 /// Error routine
693 extern FXAPI void fxerror(const char* format,...) FX_PRINTF(1,2) ;
694 
695 /// Warning routine
696 extern FXAPI void fxwarning(const char* format,...) FX_PRINTF(1,2) ;
697 
698 /// Log message to [typically] stderr
699 extern FXAPI void fxmessage(const char* format,...) FX_PRINTF(1,2) ;
700 
701 /// Assert failed routine:- usually not called directly but called through FXASSERT
702 extern FXAPI void fxassert(const char* expression,const char* filename,unsigned int lineno);
703 
704 /// Trace printout routine:- usually not called directly but called through FXTRACE
705 extern FXAPI void fxtrace(unsigned int level,const char* format,...) FX_PRINTF(2,3) ;
706 
707 /// Sleep n microseconds
708 extern FXAPI void fxsleep(unsigned int n);
709 
710 /// Match a file name with a pattern
711 extern FXAPI bool fxfilematch(const char *pattern,const char *string,FXuint flags=(FILEMATCH_NOESCAPE|FILEMATCH_FILE_NAME));
712 
713 /// Get highlight color
714 extern FXAPI FXColor makeHiliteColor(FXColor clr);
715 
716 /// Get shadow color
717 extern FXAPI FXColor makeShadowColor(FXColor clr);
718 
719 /// Get process id
720 extern FXAPI FXint fxgetpid();
721 
722 /// Convert string of length len to MSDOS; return new string and new length
723 extern FXAPI bool fxtoDOS(FXchar*& string,FXint& len);
724 
725 /// Convert string of length len from MSDOS; return new string and new length
726 extern FXAPI bool fxfromDOS(FXchar*& string,FXint& len);
727 
728 /// Duplicate string
729 extern FXAPI FXchar *fxstrdup(const FXchar* str);
730 
731 /// Calculate a hash value from a string
732 extern FXAPI FXuint fxstrhash(const FXchar* str);
733 
734 /// Get RGB value from color name
735 extern FXAPI FXColor fxcolorfromname(const FXchar* colorname);
736 
737 /// Get name of (closest) color to RGB
738 extern FXAPI FXchar* fxnamefromcolor(FXchar *colorname,FXColor color);
739 
740 /// Convert RGB to HSV
741 extern FXAPI void fxrgb_to_hsv(FXfloat& h,FXfloat& s,FXfloat& v,FXfloat r,FXfloat g,FXfloat b);
742 
743 /// Convert HSV to RGB
744 extern FXAPI void fxhsv_to_rgb(FXfloat& r,FXfloat& g,FXfloat& b,FXfloat h,FXfloat s,FXfloat v);
745 
746 /// Floating point number classification: 0=OK, +/-1=Inf, +/-2=NaN
747 extern FXAPI FXint fxieeefloatclass(FXfloat number);
748 extern FXAPI FXint fxieeedoubleclass(FXdouble number);
749 
750 /// Convert keysym to unicode character
751 extern FXAPI FXwchar fxkeysym2ucs(FXwchar sym);
752 
753 /// Convert unicode character to keysym
754 extern FXAPI FXwchar fxucs2keysym(FXwchar ucs);
755 
756 /// Parse geometry, a-la X11 geometry specification
757 extern FXAPI FXint fxparsegeometry(const FXchar *string,FXint& x,FXint& y,FXint& w,FXint& h);
758 
759 /// True if executable with given path is a console application
760 extern FXAPI FXbool fxisconsole(const FXchar *path);
761 
762 /// Version number that the library has been compiled with
763 extern FXAPI const FXuchar fxversion[3];
764 
765 /// Controls tracing level
766 extern FXAPI unsigned int fxTraceLevel;
767 
768 /// Return wide character from utf8 string at ptr
769 extern FXAPI FXwchar wc(const FXchar *ptr);
770 
771 /// Return wide character from utf16 string at ptr
772 extern FXAPI FXwchar wc(const FXnchar *ptr);
773 
774 /// Return number of FXchar's of wide character at ptr
775 extern FXAPI FXint wclen(const FXchar *ptr);
776 
777 /// Return number of FXnchar's of narrow character at ptr
778 extern FXAPI FXint wclen(const FXnchar *ptr);
779 
780 /// Return start of utf8 character containing position
781 extern FXAPI FXint wcvalidate(const FXchar* string,FXint pos);
782 
783 /// Return start of utf16 character containing position
784 extern FXAPI FXint wcvalidate(const FXnchar *string,FXint pos);
785 
786 /// Advance to next utf8 character start
787 extern FXAPI FXint wcinc(const FXchar* string,FXint pos);
788 
789 /// Advance to next utf16 character start
790 extern FXAPI FXint wcinc(const FXnchar *string,FXint pos);
791 
792 /// Retreat to previous utf8 character start
793 extern FXAPI FXint wcdec(const FXchar* string,FXint pos);
794 
795 /// Retreat to previous utf16 character start
796 extern FXAPI FXint wcdec(const FXnchar *string,FXint pos);
797 
798 /// Length of utf8 representation of wide characters string str of length n
799 extern FXAPI FXint utfslen(const FXwchar *str,FXint n);
800 
801 /// Length of utf8 representation of wide character string str
802 extern FXAPI FXint utfslen(const FXwchar *str);
803 
804 /// Length of utf8 representation of narrow characters string str of length n
805 extern FXAPI FXint utfslen(const FXnchar *str,FXint n);
806 
807 /// Length of utf8 representation of narrow characters string str
808 extern FXAPI FXint utfslen(const FXnchar *str);
809 
810 /// Length of wide character representation of utf8 string str of length n
811 extern FXAPI FXint wcslen(const FXchar *str,FXint n);
812 
813 /// Length of wide character representation of utf8 string str
814 extern FXAPI FXint wcslen(const FXchar *str);
815 
816 /// Length of narrow character representation of utf8 string str of length n
817 extern FXAPI FXint ncslen(const FXchar *str,FXint n);
818 
819 /// Length of narrow character representation of utf8 string str
820 extern FXAPI FXint ncslen(const FXchar *str);
821 
822 /// Copy utf8 string of length n to wide character string dst
823 extern FXAPI FXint utf2wcs(FXwchar *dst,const FXchar *src,FXint n);
824 
825 /// Copy utf8 string to wide character string dst
826 extern FXAPI FXint utf2wcs(FXwchar *dst,const FXchar *src);
827 
828 /// Copy utf8 string of length n to narrow character string dst
829 extern FXAPI FXint utf2ncs(FXnchar *dst,const FXchar *src,FXint n);
830 
831 /// Copy utf8 string to narrow character string dst
832 extern FXAPI FXint utf2ncs(FXnchar *dst,const FXchar *src);
833 
834 /// Copy wide character substring of length n to dst
835 extern FXAPI FXint wc2utfs(FXchar* dst,const FXwchar *src,FXint n);
836 
837 /// Copy wide character string to dst
838 extern FXAPI FXint wc2utfs(FXchar* dst,const FXwchar *src);
839 
840 /// Copy narrow character substring of length n to dst
841 extern FXAPI FXint nc2utfs(FXchar* dst,const FXnchar *src,FXint n);
842 
843 /// Copy narrow character string to dst
844 extern FXAPI FXint nc2utfs(FXchar* dst,const FXnchar *src);
845 
846 
847 }
848 
849 #endif
850