Processed through the format-o-matic.
This commit is contained in:
parent
bc841826f0
commit
ae862a3ab5
2 changed files with 195 additions and 194 deletions
329
Main/fg_debug.c
329
Main/fg_debug.c
|
@ -1,4 +1,5 @@
|
||||||
/**************************************************************************
|
/* -*- Mode: C++ -*-
|
||||||
|
*
|
||||||
* fg_debug.c -- Flight Gear debug utility functions
|
* fg_debug.c -- Flight Gear debug utility functions
|
||||||
*
|
*
|
||||||
* Written by Paul Bleisch, started January 1998.
|
* Written by Paul Bleisch, started January 1998.
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
* (Log is kept at end of this file)
|
* (Log is kept at end of this file)
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
@ -31,6 +33,7 @@
|
||||||
#include <Include/cmdargs.h> // Line to command line arguments
|
#include <Include/cmdargs.h> // Line to command line arguments
|
||||||
#include <Main/fg_debug.h>
|
#include <Main/fg_debug.h>
|
||||||
|
|
||||||
|
|
||||||
static int fg_DebugSem = 1;
|
static int fg_DebugSem = 1;
|
||||||
fgDebugClass fg_DebugClass = FG_ALL; // Need visibility for
|
fgDebugClass fg_DebugClass = FG_ALL; // Need visibility for
|
||||||
fgDebugPriority fg_DebugPriority = FG_INFO; // command line processing.
|
fgDebugPriority fg_DebugPriority = FG_INFO; // command line processing.
|
||||||
|
@ -52,217 +55,213 @@ FILE *fg_DebugOutput = NULL; // Visibility needed for command line processor.
|
||||||
/* Used for convienence initialization from env variables.
|
/* Used for convienence initialization from env variables.
|
||||||
*/
|
*/
|
||||||
static struct {
|
static struct {
|
||||||
char *str;
|
char *str;
|
||||||
fgDebugClass dbg_class;
|
fgDebugClass dbg_class;
|
||||||
} fg_DebugClasses[] = {
|
} fg_DebugClasses[] = {
|
||||||
{ "FG_NONE", 0x00000000 },
|
{ "FG_NONE", 0x00000000 },
|
||||||
{ "FG_TERRAIN", 0x00000001 },
|
{ "FG_TERRAIN", 0x00000001 },
|
||||||
{ "FG_ASTRO", 0x00000002 },
|
{ "FG_ASTRO", 0x00000002 },
|
||||||
{ "FG_FLIGHT", 0x00000004 },
|
{ "FG_FLIGHT", 0x00000004 },
|
||||||
{ "FG_INPUT", 0x00000008 },
|
{ "FG_INPUT", 0x00000008 },
|
||||||
{ "FG_GL", 0x00000010 },
|
{ "FG_GL", 0x00000010 },
|
||||||
{ "FG_VIEW", 0x00000020 },
|
{ "FG_VIEW", 0x00000020 },
|
||||||
{ "FG_COCKPIT", 0x00000040 },
|
{ "FG_COCKPIT", 0x00000040 },
|
||||||
{ "FG_GENERAL", 0x00000080 },
|
{ "FG_GENERAL", 0x00000080 },
|
||||||
{ "FG_MATH", 0x00000100 },
|
{ "FG_MATH", 0x00000100 },
|
||||||
{ "FG_EVENT", 0x00000200 },
|
{ "FG_EVENT", 0x00000200 },
|
||||||
{ "FG_AIRCRAFT",0x00000400 },
|
{ "FG_AIRCRAFT",0x00000400 },
|
||||||
|
|
||||||
/* Do not edit below here, last entry should be null */
|
/* Do not edit below here, last entry should be null */
|
||||||
{ "FG_ALL", 0xFFFFFFFF },
|
{ "FG_ALL", 0xFFFFFFFF },
|
||||||
{ NULL, 0 } };
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
static fgDebugClass fgDebugStrToClass( char *str );
|
static fgDebugClass fgDebugStrToClass( char *str );
|
||||||
|
|
||||||
|
|
||||||
/* fgInitDebug =============================================================*/
|
/* fgInitDebug =============================================================*/
|
||||||
void fgInitDebug( void )
|
void fgInitDebug( void ) {
|
||||||
{
|
char *pszClass, *pszPrio, *pszFile;
|
||||||
char *pszClass, *pszPrio, *pszFile;
|
|
||||||
|
|
||||||
// Support for log file/alt debug output via command line, environment or
|
// Support for log file/alt debug output via command line, environment or
|
||||||
// reasonable default.
|
// reasonable default.
|
||||||
|
|
||||||
if( strlen( logArgbuf ) > 3) { // First check for command line option
|
if( strlen( logArgbuf ) > 3) { // First check for command line option
|
||||||
fg_DebugOutput = fopen(logArgbuf, "a+" ); // Assumed that we will append.
|
// Assumed that we will append.
|
||||||
|
fg_DebugOutput = fopen(logArgbuf, "a+" );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !fg_DebugOutput ) { // If not set on command line, environment?
|
if( !fg_DebugOutput ) { // If not set on command line, environment?
|
||||||
pszFile = getenv( "FG_DEBUGFILE" );
|
pszFile = getenv( "FG_DEBUGFILE" );
|
||||||
if( pszFile ) { // There is such an environmental variable.
|
if( pszFile ) { // There is such an environmental variable.
|
||||||
fg_DebugOutput = fopen( pszFile, "a+" );
|
fg_DebugOutput = fopen( pszFile, "a+" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !fg_DebugOutput ) { // If neither command line nor environment
|
if( !fg_DebugOutput ) { // If neither command line nor environment
|
||||||
fg_DebugOutput = stderr; // then we use the fallback position
|
fg_DebugOutput = stderr; // then we use the fallback position
|
||||||
}
|
|
||||||
|
|
||||||
FG_GRABDEBUGSEM;
|
|
||||||
fg_DebugSem = fg_DebugSem; /* shut up GCC */
|
|
||||||
|
|
||||||
// Test command line option overridge of debug priority. If the value
|
|
||||||
// is in range (properly optioned) the we will override both defaults
|
|
||||||
// and the environmental value.
|
|
||||||
|
|
||||||
if ((priorityArgValue >= FG_BULK) && (priorityArgValue <= FG_ABORT)) {
|
|
||||||
fg_DebugPriority = priorityArgValue;
|
|
||||||
}
|
}
|
||||||
else { // Either not set or out of range. We will not warn the user.
|
|
||||||
pszPrio = getenv( "FG_DEBUGPRIORITY" );
|
FG_GRABDEBUGSEM;
|
||||||
if( pszPrio ) {
|
fg_DebugSem = fg_DebugSem; /* shut up GCC */
|
||||||
fg_DebugPriority = atoi( pszPrio );
|
|
||||||
fprintf( stderr,
|
// Test command line option overridge of debug priority. If the value
|
||||||
"fg_debug.c: Environment overrides default debug priority (%d)\n",
|
// is in range (properly optioned) the we will override both defaults
|
||||||
fg_DebugPriority );
|
// and the environmental value.
|
||||||
}
|
|
||||||
|
if ((priorityArgValue >= FG_BULK) && (priorityArgValue <= FG_ABORT)) {
|
||||||
|
fg_DebugPriority = priorityArgValue;
|
||||||
|
} else { // Either not set or out of range. We will not warn the user.
|
||||||
|
pszPrio = getenv( "FG_DEBUGPRIORITY" );
|
||||||
|
if( pszPrio ) {
|
||||||
|
fg_DebugPriority = atoi( pszPrio );
|
||||||
|
fprintf( stderr,
|
||||||
|
"fg_debug.c: Environment overrides default debug priority (%d)\n",
|
||||||
|
fg_DebugPriority );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((debugArgValue >= FG_ALL) && (debugArgValue < FG_UNDEFD)) {
|
if ((debugArgValue >= FG_ALL) && (debugArgValue < FG_UNDEFD)) {
|
||||||
fg_DebugPriority = priorityArgValue;
|
fg_DebugPriority = priorityArgValue;
|
||||||
}
|
} else { // Either not set or out of range. We will not warn the user.
|
||||||
else { // Either not set or out of range. We will not warn the user.
|
pszClass = getenv( "FG_DEBUGCLASS" );
|
||||||
pszClass = getenv( "FG_DEBUGCLASS" );
|
if( pszClass ) {
|
||||||
if( pszClass ) {
|
fg_DebugClass = fgDebugStrToClass( pszClass );
|
||||||
fg_DebugClass = fgDebugStrToClass( pszClass );
|
fprintf( stderr,
|
||||||
fprintf( stderr,
|
"fg_debug.c: Environment overrides default debug class (0x%08X)\n",
|
||||||
"fg_debug.c: Environment overrides default debug class (0x%08X)\n",
|
fg_DebugClass );
|
||||||
fg_DebugClass );
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FG_RELEASEDEBUGSEM;
|
FG_RELEASEDEBUGSEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fgDebugStrToClass ======================================================*/
|
/* fgDebugStrToClass ======================================================*/
|
||||||
fgDebugClass fgDebugStrToClass( char *str )
|
fgDebugClass fgDebugStrToClass( char *str ) {
|
||||||
{
|
char *hex = "0123456789ABCDEF";
|
||||||
char *hex = "0123456789ABCDEF";
|
char *hexl = "0123456789abcdef";
|
||||||
char *hexl = "0123456789abcdef";
|
char *pt, *p, *ph, ps = 1;
|
||||||
char *pt, *p, *ph, ps = 1;
|
unsigned int val = 0, i;
|
||||||
unsigned int val = 0, i;
|
|
||||||
|
|
||||||
if( str == NULL ) {
|
if( str == NULL ) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for 0xXXXXXX notation */
|
/* Check for 0xXXXXXX notation */
|
||||||
if( (p = strstr( str, "0x")) ) {
|
if( (p = strstr( str, "0x")) ) {
|
||||||
p++; p++;
|
p++; p++;
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if( (ph = strchr(hex,*p)) || (ph = strchr(hexl,*p)) ){
|
if( (ph = strchr(hex,*p)) || (ph = strchr(hexl,*p)) ){
|
||||||
val <<= 4;
|
val <<= 4;
|
||||||
val += ph-hex;
|
val += ph-hex;
|
||||||
p++;
|
p++;
|
||||||
}
|
} else {
|
||||||
else {
|
// fprintf( stderr, "Error in hex string '%s'\n", str );
|
||||||
/* fprintf( stderr, "Error in hex string '%s'\n", str );
|
return FG_NONE;
|
||||||
*/
|
}
|
||||||
return FG_NONE;
|
}
|
||||||
}
|
} else {
|
||||||
|
/* Must be in string format */
|
||||||
|
p = str;
|
||||||
|
ps = 1;
|
||||||
|
while( ps ) {
|
||||||
|
while( *p && (*p==' ' || *p=='\t') ) p++; /* remove whitespace */
|
||||||
|
pt = p; /* mark token */
|
||||||
|
while( *p && (*p!='|') ) p++; /* find OR or EOS */
|
||||||
|
ps = *p; /* save value at p so we can attempt to be bounds safe */
|
||||||
|
*p++ = 0; /* terminate token */
|
||||||
|
/* determine value for token */
|
||||||
|
i=0;
|
||||||
|
while( fg_DebugClasses[i].str &&
|
||||||
|
strncmp( fg_DebugClasses[i].str, pt,
|
||||||
|
strlen(fg_DebugClasses[i].str)) ) i++;
|
||||||
|
if( fg_DebugClasses[i].str == NULL ) {
|
||||||
|
fprintf( stderr,
|
||||||
|
"fg_debug.c: Could not find message class '%s'\n",
|
||||||
|
pt );
|
||||||
|
} else {
|
||||||
|
val |= fg_DebugClasses[i].dbg_class;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return (fgDebugClass)val;
|
||||||
else {
|
|
||||||
/* Must be in string format */
|
|
||||||
p = str;
|
|
||||||
ps = 1;
|
|
||||||
while( ps ) {
|
|
||||||
while( *p && (*p==' ' || *p=='\t') ) p++; /* remove whitespace */
|
|
||||||
pt = p; /* mark token */
|
|
||||||
while( *p && (*p!='|') ) p++; /* find OR or EOS */
|
|
||||||
ps = *p; /* save value at p so we can attempt to be bounds safe */
|
|
||||||
*p++ = 0; /* terminate token */
|
|
||||||
/* determine value for token */
|
|
||||||
i=0;
|
|
||||||
while( fg_DebugClasses[i].str &&
|
|
||||||
strncmp( fg_DebugClasses[i].str, pt, strlen(fg_DebugClasses[i].str)) ) i++;
|
|
||||||
if( fg_DebugClasses[i].str == NULL ) {
|
|
||||||
fprintf( stderr, "fg_debug.c: Could not find message class '%s'\n", pt );
|
|
||||||
} else {
|
|
||||||
val |= fg_DebugClasses[i].dbg_class;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (fgDebugClass)val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fgSetDebugOutput =======================================================*/
|
/* fgSetDebugOutput =======================================================*/
|
||||||
void fgSetDebugOutput( FILE *out )
|
void fgSetDebugOutput( FILE *out ) {
|
||||||
{
|
FG_GRABDEBUGSEM;
|
||||||
FG_GRABDEBUGSEM;
|
fflush( fg_DebugOutput );
|
||||||
fflush( fg_DebugOutput );
|
fg_DebugOutput = out;
|
||||||
fg_DebugOutput = out;
|
FG_RELEASEDEBUGSEM;
|
||||||
FG_RELEASEDEBUGSEM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fgSetDebugLevels =======================================================*/
|
/* fgSetDebugLevels =======================================================*/
|
||||||
void fgSetDebugLevels( fgDebugClass dbg_class, fgDebugPriority prio )
|
void fgSetDebugLevels( fgDebugClass dbg_class, fgDebugPriority prio ) {
|
||||||
{
|
FG_GRABDEBUGSEM;
|
||||||
FG_GRABDEBUGSEM;
|
fg_DebugClass = dbg_class;
|
||||||
fg_DebugClass = dbg_class;
|
fg_DebugPriority = prio;
|
||||||
fg_DebugPriority = prio;
|
FG_RELEASEDEBUGSEM;
|
||||||
FG_RELEASEDEBUGSEM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fgRegisterDebugCallback ================================================*/
|
/* fgRegisterDebugCallback ================================================*/
|
||||||
fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback )
|
fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback ) {
|
||||||
{
|
fgDebugCallback old;
|
||||||
fgDebugCallback old;
|
FG_GRABDEBUGSEM;
|
||||||
FG_GRABDEBUGSEM;
|
old = fg_DebugCallback;
|
||||||
old = fg_DebugCallback;
|
fg_DebugCallback = callback;
|
||||||
fg_DebugCallback = callback;
|
FG_RELEASEDEBUGSEM;
|
||||||
FG_RELEASEDEBUGSEM;
|
return old;
|
||||||
return old;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* fgPrintf ===============================================================*/
|
/* fgPrintf ===============================================================*/
|
||||||
int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... )
|
int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... ) {
|
||||||
{
|
char szOut[1024+1];
|
||||||
char szOut[1024+1];
|
va_list ap;
|
||||||
va_list ap;
|
int ret = 0;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
// If no action to take, then don't bother with the semaphore activity
|
// If no action to take, then don't bother with the semaphore
|
||||||
// Slight speed benefit.
|
// activity Slight speed benefit.
|
||||||
|
|
||||||
if( !(dbg_class & fg_DebugClass) || (prio < fg_DebugPriority) ) {
|
if( !(dbg_class & fg_DebugClass) || (prio < fg_DebugPriority) ) {
|
||||||
return ret; // Its zero anyway. But we might think about changing
|
// Its zero anyway. But we might think about changing
|
||||||
// it upon some error condition?
|
// it upon some error condition?
|
||||||
}
|
return ret;
|
||||||
|
|
||||||
FG_GRABDEBUGSEM;
|
|
||||||
|
|
||||||
/* ret = vsprintf( szOut, fmt, (&fmt+1)); (but it didn't work, thus ... */
|
|
||||||
va_start (ap, fmt);
|
|
||||||
ret = vsprintf( szOut, fmt, ap);
|
|
||||||
va_end (ap);
|
|
||||||
|
|
||||||
if( fg_DebugCallback!=NULL && fg_DebugCallback(dbg_class, prio, szOut) ) {
|
|
||||||
FG_RELEASEDEBUGSEM;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf( fg_DebugOutput, szOut );
|
|
||||||
FG_RELEASEDEBUGSEM;
|
|
||||||
if( prio == FG_EXIT ) {
|
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
else if( prio == FG_ABORT ) {
|
|
||||||
abort();
|
FG_GRABDEBUGSEM;
|
||||||
|
|
||||||
|
/* ret = vsprintf( szOut, fmt, (&fmt+1)); (but it didn't work, thus ... */
|
||||||
|
va_start (ap, fmt);
|
||||||
|
ret = vsprintf( szOut, fmt, ap);
|
||||||
|
va_end (ap);
|
||||||
|
|
||||||
|
if( fg_DebugCallback!=NULL && fg_DebugCallback(dbg_class, prio, szOut) ) {
|
||||||
|
FG_RELEASEDEBUGSEM;
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
fprintf( fg_DebugOutput, szOut );
|
||||||
|
FG_RELEASEDEBUGSEM;
|
||||||
|
if( prio == FG_EXIT ) {
|
||||||
|
exit(0);
|
||||||
|
} else if( prio == FG_ABORT ) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return ret;
|
||||||
return ret;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* $Log$
|
/* $Log$
|
||||||
/* Revision 1.7 1998/02/16 13:39:43 curt
|
/* Revision 1.8 1998/03/09 22:11:00 curt
|
||||||
/* Miscellaneous weekend tweaks. Fixed? a cache problem that caused whole
|
/* Processed through the format-o-matic.
|
||||||
/* tiles to occasionally be missing.
|
|
||||||
/*
|
/*
|
||||||
|
* Revision 1.7 1998/02/16 13:39:43 curt
|
||||||
|
* Miscellaneous weekend tweaks. Fixed? a cache problem that caused whole
|
||||||
|
* tiles to occasionally be missing.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/**************************************************************************
|
/* -*- Mode: C++ -*-
|
||||||
|
*
|
||||||
* fg_debug.h -- Flight Gear debug utility functions
|
* fg_debug.h -- Flight Gear debug utility functions
|
||||||
*
|
*
|
||||||
* Written by Paul Bleisch, started January 1998.
|
* Written by Paul Bleisch, started January 1998.
|
||||||
|
@ -28,43 +29,43 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
/* NB: To add a dbg_class, add it here, and add it to the structure
|
/* NB: To add a dbg_class, add it here, and add it to the structure in
|
||||||
in fg_debug.c
|
fg_debug.c */
|
||||||
*/
|
typedef enum {
|
||||||
typedef enum{
|
FG_NONE = 0x00000000,
|
||||||
FG_NONE = 0x00000000,
|
|
||||||
|
|
||||||
FG_TERRAIN = 0x00000001,
|
FG_TERRAIN = 0x00000001,
|
||||||
FG_ASTRO = 0x00000002,
|
FG_ASTRO = 0x00000002,
|
||||||
FG_FLIGHT = 0x00000004,
|
FG_FLIGHT = 0x00000004,
|
||||||
FG_INPUT = 0x00000008,
|
FG_INPUT = 0x00000008,
|
||||||
FG_GL = 0x00000010,
|
FG_GL = 0x00000010,
|
||||||
FG_VIEW = 0x00000020,
|
FG_VIEW = 0x00000020,
|
||||||
FG_COCKPIT = 0x00000040,
|
FG_COCKPIT = 0x00000040,
|
||||||
FG_GENERAL = 0x00000080,
|
FG_GENERAL = 0x00000080,
|
||||||
FG_MATH = 0x00000100,
|
FG_MATH = 0x00000100,
|
||||||
FG_EVENT = 0x00000200,
|
FG_EVENT = 0x00000200,
|
||||||
FG_AIRCRAFT= 0x00000400,
|
FG_AIRCRAFT= 0x00000400,
|
||||||
FG_UNDEFD = 0x00001000, // For range checking
|
FG_UNDEFD = 0x00001000, // For range checking
|
||||||
|
|
||||||
FG_ALL = 0xFFFFFFFFL // -1!
|
FG_ALL = 0xFFFFFFFFL // -1!
|
||||||
} fgDebugClass;
|
} fgDebugClass;
|
||||||
|
|
||||||
/* NB: To add a priority, add it here.
|
/* NB: To add a priority, add it here. */
|
||||||
*/
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FG_BULK, /* For frequent messages */
|
FG_BULK, /* For frequent messages */
|
||||||
FG_DEBUG, /* Less frequent debug type messages */
|
FG_DEBUG, /* Less frequent debug type messages */
|
||||||
FG_INFO, /* Informatory messages */
|
FG_INFO, /* Informatory messages */
|
||||||
FG_WARN, /* Possible impending problem */
|
FG_WARN, /* Possible impending problem */
|
||||||
FG_ALERT, /* Very possible impending problem */
|
FG_ALERT, /* Very possible impending problem */
|
||||||
FG_EXIT, /* Problem (no core) */
|
FG_EXIT, /* Problem (no core) */
|
||||||
FG_ABORT /* Abandon ship (core) */
|
FG_ABORT /* Abandon ship (core) */
|
||||||
} fgDebugPriority;
|
} fgDebugPriority;
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the debuggin stuff. */
|
/* Initialize the debuggin stuff. */
|
||||||
void fgInitDebug( void );
|
void fgInitDebug( void );
|
||||||
|
|
||||||
|
|
||||||
/* fgPrintf
|
/* fgPrintf
|
||||||
|
|
||||||
Expects:
|
Expects:
|
||||||
|
@ -130,6 +131,7 @@ void fgSetDebugOutput( FILE *out );
|
||||||
typedef int (*fgDebugCallback)( int DebugClass, int DebugPriority, char *outstr);
|
typedef int (*fgDebugCallback)( int DebugClass, int DebugPriority, char *outstr);
|
||||||
fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback );
|
fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback );
|
||||||
|
|
||||||
|
|
||||||
// Leave these alone. Access intended for fg_debug and command line processing.
|
// Leave these alone. Access intended for fg_debug and command line processing.
|
||||||
//
|
//
|
||||||
extern fgDebugClass fg_DebugClass;
|
extern fgDebugClass fg_DebugClass;
|
||||||
|
|
Loading…
Add table
Reference in a new issue