]> icculus.org git repositories - taylor/freespace2.git/blob - include/pstypes.h
make loading screen and title screen work with emterpreter async
[taylor/freespace2.git] / include / pstypes.h
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell 
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9 /*
10  * $Logfile: /Freespace2/code/GlobalIncs/PsTypes.h $
11  * $Revision$
12  * $Date$
13  * $Author$
14  *
15  * Header file containg global typedefs, constants and macros
16  *
17  * $Log$
18  * Revision 1.12  2005/10/01 21:38:32  taylor
19  * some reorg of includes to not requires the same headers in many different files
20  * handle FS1 specific language changes
21  * some OS X changes for paths and to handle socklen_t better
22  *
23  * Revision 1.11  2004/12/15 04:10:45  taylor
24  * outwnd_unix.cpp from fs2_open for logging to file in debug mode
25  * fixes for default function values
26  * always use vm_* functions for sanity sake
27  * make cfilearchiver 64-bit compatible
28  * fix crash on exit from double free()
29  * fix crash on startup from extra long GL extension string in debug
30  *
31  * Revision 1.10  2004/07/04 11:31:43  taylor
32  * amd64 support, compiler warning fixes, don't use software rendering
33  *
34  * Revision 1.9  2004/06/11 21:39:44  taylor
35  * x86 compile fixes for OSX patch
36  *
37  * Revision 1.8  2004/06/11 00:15:06  tigital
38  * byte-swapping changes for bigendian systems
39  *
40  * Revision 1.7  2002/07/13 19:47:02  theoddone33
41  * Fix some more warnings
42  *
43  * Change demo building, edit Makefile if you want the demo.
44  *
45  * Revision 1.6  2002/06/19 04:52:45  relnev
46  * MacOS X updates (Ryan)
47  *
48  * Revision 1.5  2002/06/17 06:33:08  relnev
49  * ryan's struct patch for gcc 2.95
50  *
51  * Revision 1.4  2002/06/09 04:41:14  relnev
52  * added copyright header
53  *
54  * Revision 1.3  2002/06/01 07:12:32  relnev
55  * a few NDEBUG updates.
56  *
57  * removed a few warnings.
58  *
59  * Revision 1.2  2002/05/28 06:28:20  theoddone33
60  * Filesystem mods, actually reads some data files now
61  *
62  * Revision 1.1.1.1  2002/05/03 03:28:12  root
63  * Initial import.
64  *
65  * 
66  * 34    6/16/00 3:16p Jefff
67  * sim of the year dvd version changes, a few german soty localization
68  * fixes
69  * 
70  * 33    10/05/99 2:29p Danw
71  * 
72  * 32    10/01/99 9:10a Daveb
73  * V 1.1 PATCH
74  * 
75  * 31    9/13/99 12:22a Dave
76  * Minor build update.
77  * 
78  * 30    8/28/99 4:54p Dave
79  * Fixed directives display for multiplayer clients for wings with
80  * multiple waves. Fixed hud threat indicator rendering color.
81  * 
82  * 29    8/09/99 4:18p Andsager
83  * Make french and german defines, needed specifically to enable language
84  * under launcher misc. tab
85  * 
86  * 28    7/20/99 1:49p Dave
87  * Peter Drake build. Fixed some release build warnings.
88  * 
89  * 27    7/18/99 5:19p Dave
90  * Jump node icon. Fixed debris fogging. Framerate warning stuff.
91  * 
92  * 26    7/15/99 9:21a Andsager
93  * FS2_DEMO check in
94  * 
95  * 25    7/09/99 9:51a Dave
96  * Added thick polyline code.
97  * 
98  * 24    6/29/99 10:35a Dave
99  * Interface polygon bitmaps! Whee!
100  * 
101  * 23    6/14/99 10:45a Dave
102  * Made beam weapons specify accuracy by skill level in the weapons.tbl
103  * 
104  * 22    6/03/99 10:15p Dave
105  * Put in temporary main hall screen.
106  * 
107  * 21    5/09/99 8:57p Dave
108  * Final E3 build preparations.
109  * 
110  * 20    4/25/99 7:43p Dave
111  * Misc small bug fixes. Made sun draw properly.
112  * 
113  * 19    4/25/99 3:03p Dave
114  * Removed E3_BUILD from pstypes
115  * 
116  * 18    4/25/99 3:02p Dave
117  * Build defines for the E3 build.
118  * 
119  * 17    4/15/99 1:29p Dave
120  * Remove multiplayer beta build define.
121  * 
122  * 16    4/15/99 1:24p Dave
123  * Final Beta 1 checkin.
124  * 
125  * 15    4/14/99 5:28p Dave
126  * Minor bug fixes.
127  * 
128  * 14    4/12/99 2:22p Dave
129  * More checks for dogfight stats.
130  * 
131  * 13    4/09/99 2:21p Dave
132  * Multiplayer beta stuff. CD checking.
133  * 
134  * 12    2/25/99 4:19p Dave
135  * Added multiplayer_beta defines. Added cd_check define. Fixed a few
136  * release build warnings. Added more data to the squad war request and
137  * response packets.
138  * 
139  * 11    2/23/99 2:29p Dave
140  * First run of oldschool dogfight mode. 
141  * 
142  * 10    2/07/99 8:51p Andsager
143  * Add inner bound to asteroid field.  Inner bound tries to stay astroid
144  * free.  Wrap when within and don't throw at ships inside.
145  * 
146  * 9     1/15/99 11:29a Neilk
147  * Fixed D3D screen/texture pixel formatting problem. 
148  * 
149  * 8     1/08/99 2:08p Dave
150  * Fixed software rendering for pofview. Super early support for AWACS and
151  * beam weapons.
152  * 
153  * 7     1/06/99 2:24p Dave
154  * Stubs and release build fixes.
155  * 
156  * 6     11/30/98 1:07p Dave
157  * 16 bit conversion, first run.
158  * 
159  * 5     11/05/98 4:18p Dave
160  * First run nebula support. Beefed up localization a bit. Removed all
161  * conditional compiles for foreign versions. Modified mission file
162  * format.
163  * 
164  * 4     10/13/98 9:28a Dave
165  * Started neatening up freespace.h. Many variables renamed and
166  * reorganized. Added AlphaColors.[h,cpp]
167  * 
168  * 3     10/07/98 11:28a Dave
169  * 
170  * 2     10/07/98 10:52a Dave
171  * Initial checkin.
172  * 
173  * 1     10/07/98 10:48a Dave
174  * 
175  * 75    8/20/98 5:30p Dave
176  * Put in handy multiplayer logfile system. Now need to put in useful
177  * applications of it all over the code.
178  * 
179  * 74    6/17/98 11:01a Lawrance
180  * set correct offset for English special font chars
181  * 
182  * 73    6/12/98 4:52p Hoffoss
183  * Added support for special characters in in forgeign languages.
184  * 
185  * 72    6/09/98 6:49p Lawrance
186  * Comment out UK_BUILD
187  * 
188  * 71    6/09/98 5:15p Lawrance
189  * French/German localization
190  * 
191  * 70    6/09/98 12:12p Hoffoss
192  * Added XSTR localization code.
193  * 
194  * 69    6/05/98 9:49a Lawrance
195  * OEM changes
196  * 
197  * 68    5/22/98 3:13p Allender
198  * no Int3()'s and Asserts
199  * 
200  * 67    5/20/98 12:59p John
201  * Turned optimizations on for debug builds.   Also turning on automatic
202  * function inlining.  Turned off the unreachable code warning.
203  * 
204  * 66    5/04/98 1:49p Allender
205  * make Int3's do nothing when InterplayQA is defined
206  * 
207  * 65    4/25/98 11:55p Lawrance
208  * compile out Int3() and SDL_assert() for release demo build
209  * 
210  *
211  * $NoKeywords: $
212  *
213  */
214
215 #ifndef _PSTYPES_H
216 #define _PSTYPES_H
217
218
219 // Build defines.  Comment in/out for whatever build is necessary:
220 // #define OEM_BUILD                                            // enable for OEM builds
221 // #define MULTIPLAYER_BETA_BUILD                               // enable for multiplayer beta build
222 // #define E3_BUILD                                                     // enable for 3dfx E3 build                                             
223 // #define PRESS_TOUR_BUILD                     // enable for press tour build
224 //#define FS2_DEMO                                      // enable demo build for FS2
225 // #define PD_BUILD                                             // fred documentation/evaluation build
226 //      #define FRENCH_BUILD                            // build for French (obsolete)
227 // #define GERMAN_BUILD                         // build for German (this is now used)
228 //#define RELEASE_REAL                                  // this means that it is an actual release candidate, not just an optimized/release build
229
230 // uncomment this #define for DVD version (makes popups say DVD instead of CD 2 or whatever): JCF 5/10/2000
231 // #define DVD_MESSAGE_HACK
232
233
234 #if defined(MULTIPLAYER_BETA_BUILD) || defined(E3_BUILD) || defined(RELEASE_REAL)
235         #define GAME_CD_CHECK
236 #endif
237
238
239 #include "SDL.h"
240
241 #include "platform.h"
242
243
244 // value to represent an uninitialized state in any int or uint
245 #define UNINITIALIZED 0x7f8e6d9c
246
247 #if defined(DEMO) || defined(OEM_BUILD) // no change for FS2_DEMO
248         #define MAX_PLAYERS     1
249 #else
250         #define MAX_PLAYERS     12
251 #endif
252
253 #define MAX_TEAMS               3
254
255 #define USE_INLINE_ASM 1                // Define this to use inline assembly
256
257
258 typedef Sint32 fix;
259 typedef Uint8 ubyte;
260 typedef Uint16 ushort;
261 typedef Uint32 uint;
262 typedef Sint32 fs_time_t;       // forced 32-bit version of time_t - **don't use this unless required**
263
264 // ptr_? is a value matching the size of a pointer on this specific platform
265 #if ( defined(__x86_64__) || defined(_WIN64) )
266 typedef Sint64 ptr_s;
267 typedef Uint64 ptr_u;
268 #else
269 typedef Sint32 ptr_s;
270 typedef Uint32 ptr_u;
271 #endif
272
273 //Stucture to store clipping codes in a word
274 typedef struct ccodes {
275         ubyte vor,vand; //or is low byte, and is high byte
276 } ccodes;
277
278 typedef struct vector {
279         union {
280                 struct {
281                         float x,y,z;
282                 } xyz;
283                 float a1d[3];
284         };
285 } vector;
286
287 // A vector referenced as an array
288 typedef struct vectora {
289         float   xyz[3];
290 } vectora;
291
292 typedef struct angles {
293         float   p, b, h;
294 } angles_t;
295
296 typedef struct matrix {
297         union {
298                 struct {
299                         vector  rvec, uvec, fvec;
300                 } v;
301                 float a2d[3][3];
302                 float a1d[9];
303         };
304 } matrix;
305
306 typedef struct uv_pair {
307         float u,v;
308 } uv_pair;
309
310 // Used to store rotated points for mines.
311 // Has flag to indicate if projected.
312 typedef struct vertex {
313         float           x, y, z;                                // world space position
314         float           sx, sy, sw;                     // screen space position (sw == 1/z)
315         float           u, v;                                   // texture position
316         ubyte           r, g, b, a;                     // color.  Use b for darkening;
317         ubyte           codes;                          // what sides of view pyramid this point is on/off.  0 = Inside view pyramid.
318         ubyte           flags;                          // Projection flags.  Indicates whether it is projected or not or if projection overflowed.
319         ubyte           pad[2];                         // pad structure to be 4 byte aligned.
320
321         vertex() : x(0.0f), y(0.0f), z(0.0f), sx(0.0f), sy(0.0f), sw(0.0f), u(0.0f),
322                 v(0.0f), r(0), g(0), b(0), a(0), codes(0), flags(0)
323         {
324         }
325 } vertex;
326
327 #define BMP_AABITMAP            (1<<0)                          // antialiased bitmap
328 #define BMP_TEX_XPARENT         (1<<1)                          // transparent texture
329 #define BMP_TEX_OTHER           (1<<2)                          // so we can identify all "normal" textures
330
331 // any texture type
332 #define BMP_TEX_ANY                             ( BMP_TEX_XPARENT | BMP_TEX_OTHER )
333
334 // max res == 1024x768. max texture size == 256
335 #define MAX_BMAP_SECTIONS_X                             4
336 #define MAX_BMAP_SECTIONS_Y                             3
337 #define MAX_BMAP_SECTION_SIZE                           256
338 typedef struct bitmap_section_info {
339         ushort sx[MAX_BMAP_SECTIONS_X];         // x offset of each section
340         ushort sy[MAX_BMAP_SECTIONS_Y];         // y offset of each section
341
342         ubyte num_x, num_y;                                             // number of x and y sections
343 } bitmap_section_info;
344
345 typedef struct bitmap {
346         short   w, h;           // Width and height
347         short   rowsize;        // What you need to add to go to next row
348         ubyte   bpp;            // How many bits per pixel it is. (7,8,15,16,24,32)
349         ubyte   flags;  // See the BMP_???? defines for values
350         ptr_u   data;           // Pointer to data, or maybe offset into VRAM.
351         ubyte *palette; // If bpp==8, this is pointer to palette.   If the BMP_NO_PALETTE_MAP flag
352                                                         // is not set, this palette just points to the screen palette. (gr_palette)
353
354         bitmap_section_info sections;
355 } bitmap;
356
357 //This are defined in MainWin.c
358 extern void __cdecl Error( const char * filename, int line, const char * format, ... );
359 extern void __cdecl Warning( const char * filename, int line, const char * format, ... );
360
361 #include "outwnd.h"
362
363 // To debug printf do this:
364 // mprintf(( "Error opening %s\n", filename ));
365 #ifndef NDEBUG
366 #define mprintf(args) outwnd_printf2 args
367 #define nprintf(args) outwnd_printf args
368 #else
369 #define mprintf(args) 
370 #define nprintf(args) 
371 #endif
372
373 #define LOCATION __FILE__,__LINE__
374
375 // To flag an error, you can do this:
376 // Error( __FILE__, __LINE__, "Error opening %s", filename );
377 // or, 
378 // Error( LOCATION, "Error opening %s", filename );
379
380 #if defined(NDEBUG)
381 #define STUB_FUNCTION
382 #else
383 void gr_activate(int);
384 #define STUB_FUNCTION mprintf(("STUB: %s at %s, line %d\n", __FUNCTION__, LOCATION))
385 #endif
386
387 //#define Int3() _asm { int 3 }
388
389 #ifdef INTERPLAYQA
390         // Interplay QA version of Int3
391         #define Int3() do { } while (0) 
392
393         // define to call from Warning function above since it calls Int3, so without this, we
394         // get put into infinite dialog boxes
395         #define AsmInt3() _asm { int 3 }
396
397 #else
398         #if defined(NDEBUG)
399                 // No debug version of Int3
400                 #define Int3() do { } while (0) 
401         #else
402                 void debug_int3();
403
404                 // Debug version of Int3
405                 #define Int3() debug_int3()
406         #endif  // NDEBUG && DEMO
407 #endif  // INTERPLAYQA
408
409 #define PI                                      3.141592654f
410 #define PI2                                     (3.141592654f*2.0f)     // PI*2
411 #define ANG_TO_RAD(x)   ((x)*PI/180)
412
413
414 extern int      Fred_running;  // Is Fred running, or FreeSpace?
415 extern int Pofview_running;
416 extern int Nebedit_running;
417 extern int Fonttool_running;
418
419
420 //======================================================================================
421 //======          D E B U G    C O N S O L E   S T U F F        ========================
422 //======================================================================================
423
424 // Here is a a sample command to toggle something that would
425 // be called by doing "toggle it" from the debug console command window/
426
427 /*
428 DCF(toggle_it,"description")
429 {
430         if (Dc_command) {
431                 This_var = !This_var;
432         }
433
434         if (Dc_help)    {
435                 dc_printf( "Usage: sample\nToggles This_var on/off.\n" );
436         }
437
438         if (Dc_status)  {
439                 dc_printf( "The status is %d.\n", This_var );
440         }
441 */
442
443 class debug_command {
444         public:
445         const char *name;
446         const char *help;
447         void (*func)();
448         debug_command(const char *name, const char *help, void (*func)());      // constructor
449 };
450
451 #define DCF(function_name,help_text)                    \
452                 void dcf_##function_name();     \
453                 debug_command dc_##function_name(#function_name,help_text,dcf_##function_name); \
454                 void dcf_##function_name()              
455
456 // Starts the debug console
457 extern void debug_console( void (*func)() = NULL );
458
459 // The next three variables tell your function what to do.  It should
460 // only change something if the dc_command is set.   A minimal function
461 // needs to process the dc_command.   Usually, these will be called in
462 // these combinations:
463 // dc_command=true, dc_status=true  means process it and show status
464 // dc_help=true means show help only
465 // dc_status=true means show status only
466 // I would recommend doing this in each function:
467 // if (dc_command) { process command }
468 // if (dc_help) { print out help }
469 // if (dc_status) { print out status }
470 // with the last two being optional
471
472 extern int Dc_command;  // If this is set, then process the command
473 extern int Dc_help;             // If this is set, then print out the help text in the form, "usage: ... \nLong description\n" );
474 extern int Dc_status;           // If this is set, then print out the current status of the command.
475
476 void dc_get_arg(uint flags);            // Gets the next argument.   If it doesn't match the flags, this function will print an error and not return.
477 extern char *Dc_arg;            // The (lowercased) string value of the argument retrieved from dc_arg
478 extern char *Dc_arg_org;        // Dc_arg before it got converted to lowercase
479 extern uint Dc_arg_type;        // The type of dc_arg.
480 extern const char *Dc_command_line;             // The rest of the command line, from the end of the last processed arg on.
481 extern int Dc_arg_int;          // If Dc_arg_type & ARG_INT or ARG_HEX is set, then this is the value
482 extern float Dc_arg_float;      // If Dc_arg_type & ARG_FLOAT is set, then this is the value
483
484 // Outputs text to the console
485 void dc_printf( const char *format, ... );
486
487 // Each dc_arg_type can have one or more of these flags set.
488 // This is because some things can fit into two catagories.
489 // Like 1 can be an integer, a float, a string, or a true boolean
490 // value.
491 #define ARG_NONE                (1<<0)  // no argument
492 #define ARG_ANY         0xFFFFFFFF      // Anything.
493 #define ARG_STRING      (1<<1)  // any valid string
494 #define ARG_QUOTE               (1<<2)  // a quoted string
495 #define ARG_INT         (1<<3)  // a valid integer
496 #define ARG_FLOAT               (1<<4)  // a valid floating point number
497
498 // some specific commonly used predefined types. Can add up to (1<<31)
499 #define ARG_HEX         (1<<5)  // a valid hexadecimal integer. Note that ARG_INT will always be set also in this case.
500 #define ARG_TRUE                (1<<6)  // on, true, non-zero number
501 #define ARG_FALSE               (1<<7)  // off, false, zero
502 #define ARG_PLUS                (1<<8)  // Plus sign
503 #define ARG_MINUS               (1<<9)  // Minus sign
504 #define ARG_COMMA               (1<<10) // a comma
505
506 // A shortcut for boolean only variables.
507 // Example:  
508 // DCF_BOOL( lighting, Show_lighting )
509 //
510 #define DCF_BOOL( function_name, bool_variable )        \
511         void dcf_##function_name();     \
512         debug_command dc_##function_name(#function_name,"Toggles "#bool_variable,dcf_##function_name ); \
513         void dcf_##function_name()      {       \
514         if ( Dc_command )       {       \
515                 dc_get_arg(ARG_TRUE|ARG_FALSE|ARG_NONE);                \
516                 if ( Dc_arg_type & ARG_TRUE )   bool_variable = 1;      \
517                 else if ( Dc_arg_type & ARG_FALSE ) bool_variable = 0;  \
518                 else if ( Dc_arg_type & ARG_NONE ) bool_variable ^= 1;  \
519         }       \
520         if ( Dc_help )  dc_printf( "Usage: %s [bool]\nSets %s to true or false.  If nothing passed, then toggles it.\n", #function_name, #bool_variable );      \
521         if ( Dc_status )        dc_printf( "%s is %s\n", #function_name, (bool_variable?"TRUE":"FALSE") );      \
522 }
523
524
525 //======================================================================================
526 //======================================================================================
527 //======================================================================================
528
529 #include "fix.h"
530 #include "floating.h"
531
532 // Some constants for stuff
533 #define MAX_FILENAME_LEN        32                      // Length for filenames, ie "title.pcx"
534 #define MAX_PATH_LEN            256                     // Length for pathnames, ie "c:\bitmaps\title.pcx"
535
536 // contants and defined for byteswapping routines (useful for mac)
537
538 #define INTEL_INT(x)    SDL_SwapLE32(x)
539 #define INTEL_SHORT(x)  SDL_SwapLE16(x)
540 #define INTEL_FLOAT(x)  SDL_SwapFloatLE(x)
541
542 #define TRUE    1
543 #define FALSE   0
544
545 #define MY_RAND_MAX             0x7fff
546 int myrand();
547
548
549
550 // Callback Loading function. 
551 // If you pass a function to this, that function will get called
552 // around 10x per second, so you can update the screen.
553 // Pass NULL to turn it off.
554 // Call this with the name of a function.  That function will
555 // then get called around 10x per second.  The callback function
556 // gets passed a 'count' which is how many times game_busy has
557 // been called since the callback was set.   It gets called
558 // one last time with count=-1 when you turn off the callback
559 // by calling game_busy_callback(NULL).   Game_busy_callback
560 // returns the current count, so you can tell how many times
561 // game_busy got called.
562 // If delta_step is above 0, then it will also make sure it 
563 // calls the callback each time count steps 'delta_step' even
564 // if 1/10th of a second hasn't elapsed.
565 extern "C" int game_busy_callback( void (*callback)(int count), int delta_step = -1 );
566
567 // Call whenever loading to display cursor
568 extern "C" void game_busy();
569
570
571 //=========================================================
572 // Functions to monitor performance
573 #ifndef NDEBUG
574
575 class monitor {
576         public:
577         const char      *name;                  
578         int     value;                  // Value that gets cleared to 0 each frame.
579         int     min, max, sum, cnt;             // Min & Max of value.  Sum is used to calculate average 
580         monitor(const char *name);      // constructor
581 };
582
583 // Creates a monitor variable
584 #define MONITOR(function_name)                          monitor mon_##function_name(#function_name)
585
586 // Increments a monitor variable
587 #define MONITOR_INC(function_name,inc)          do { mon_##function_name.value+=(inc); } while(0)
588
589 // Call this once per frame to update monitor file
590 void monitor_update();
591
592 #else
593
594 #define MONITOR(function_name)
595
596 #define MONITOR_INC(function_name,inc)          do { } while(0)
597
598 // Call this once per frame to update monitor file
599 #define monitor_update() do { } while(0)
600
601 #endif
602
603 #define NOX(s) s
604
605 const char *XSTR(const char *str, int index);
606
607 // Caps V between MN and MX.
608 template <class T> void CAP( T& v, T mn, T mx )
609 {
610         if ( v < mn )   {
611                 v = mn;
612         } else if ( v > mx )    {
613                 v = mx;
614         }
615 }
616
617 // ========================================================
618 // stamp checksum stuff
619 // ========================================================
620
621 // here is the define for the stamp for this set of code
622 #define STAMP_STRING "\001\001\001\001\002\002\002\002Read the Foundation Novels from Asimov.  I liked them." 
623 #define STAMP_STRING_LENGTH     80
624 #define DEFAULT_CHECKSUM_STRING         "\001\001\001\001"
625 #define DEFAULT_TIME_STRING                     "\002\002\002\002"
626
627 // macro to calculate the checksum for the stamp.  Put here so that we can use different methods
628 // for different applications.  Requires the local variable 'checksum' to be defined!!!
629 #define CALCULATE_STAMP_CHECKSUM() do { \
630                 int i, found;   \
631                                                         \
632                 checksum = 0;   \
633                 for ( i = 0; i < (int)strlen(ptr); i++ ) {      \
634                         found = 0;      \
635                         checksum += ptr[i];     \
636                         if ( checksum & 0x01 )  \
637                                 found = 1;      \
638                         checksum = checksum >> 1;       \
639                         if (found)      \
640                                 checksum |= 0x80000000; \
641                 }       \
642                 checksum |= 0x80000000; \
643         } while (0) ;
644
645 //=========================================================
646 // Memory management functions
647 //=========================================================
648
649 #ifndef NDEBUG
650         // Debug versions
651
652         // Returns 0 if not enough RAM.
653         int vm_init(int min_heap_size);
654
655         // Allocates some RAM.
656         void *vm_malloc( int size, const char *filename=NULL, int line=-1 );
657
658         // 
659         char *vm_strdup( const char *ptr, const char *filename, int line );
660
661         // Frees some RAM. 
662         void vm_free( void *ptr, const char *filename=NULL, int line=-1 );
663
664         // Frees all RAM.
665         void vm_free_all();
666
667         // Easy to use macros
668         #define VM_MALLOC(size) vm_malloc((size),__FILE__,__LINE__)
669         #define VM_FREE(ptr) vm_free((ptr),__FILE__,__LINE__)
670
671         #define malloc(size) vm_malloc((size),__FILE__,__LINE__)
672         #define free(ptr) vm_free((ptr),__FILE__,__LINE__)
673         #define strdup(ptr) vm_strdup((ptr),__FILE__,__LINE__)
674         
675 #else
676         // Release versions
677
678         // Returns 0 if not enough RAM.
679         int vm_init(int min_heap_size);
680
681         // Allocates some RAM.
682         void *vm_malloc( int size );
683
684         // 
685         char *vm_strdup( const char *ptr );
686
687         // Frees some RAM. 
688         void vm_free( void *ptr );
689
690         // Frees all RAM.
691         void vm_free_all();
692
693         // Easy to use macros
694         #define VM_MALLOC(size) vm_malloc(size)
695         #define VM_FREE(ptr) vm_free(ptr)
696
697         #define malloc(size) vm_malloc(size)
698         #define free(ptr) vm_free(ptr)
699         #define strdup(ptr) vm_strdup(ptr)
700
701 #endif
702
703
704 #endif          // PS_TYPES_H
705