-/**************************************************************************
+/* -*- Mode: C++ -*-
+ *
* fg_debug.c -- Flight Gear debug utility functions
*
* Written by Paul Bleisch, started January 1998.
* (Log is kept at end of this file)
**************************************************************************/
+
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <Include/cmdargs.h> // Line to command line arguments
#include <Main/fg_debug.h>
+
static int fg_DebugSem = 1;
fgDebugClass fg_DebugClass = FG_ALL; // Need visibility for
fgDebugPriority fg_DebugPriority = FG_INFO; // command line processing.
/* Used for convienence initialization from env variables.
*/
static struct {
- char *str;
- fgDebugClass dbg_class;
+ char *str;
+ fgDebugClass dbg_class;
} fg_DebugClasses[] = {
- { "FG_NONE", 0x00000000 },
- { "FG_TERRAIN", 0x00000001 },
- { "FG_ASTRO", 0x00000002 },
- { "FG_FLIGHT", 0x00000004 },
- { "FG_INPUT", 0x00000008 },
- { "FG_GL", 0x00000010 },
- { "FG_VIEW", 0x00000020 },
- { "FG_COCKPIT", 0x00000040 },
- { "FG_GENERAL", 0x00000080 },
- { "FG_MATH", 0x00000100 },
- { "FG_EVENT", 0x00000200 },
- { "FG_AIRCRAFT",0x00000400 },
-
- /* Do not edit below here, last entry should be null */
- { "FG_ALL", 0xFFFFFFFF },
- { NULL, 0 } };
+ { "FG_NONE", 0x00000000 },
+ { "FG_TERRAIN", 0x00000001 },
+ { "FG_ASTRO", 0x00000002 },
+ { "FG_FLIGHT", 0x00000004 },
+ { "FG_INPUT", 0x00000008 },
+ { "FG_GL", 0x00000010 },
+ { "FG_VIEW", 0x00000020 },
+ { "FG_COCKPIT", 0x00000040 },
+ { "FG_GENERAL", 0x00000080 },
+ { "FG_MATH", 0x00000100 },
+ { "FG_EVENT", 0x00000200 },
+ { "FG_AIRCRAFT",0x00000400 },
+
+ /* Do not edit below here, last entry should be null */
+ { "FG_ALL", 0xFFFFFFFF },
+ { NULL, 0 }
+};
static fgDebugClass fgDebugStrToClass( char *str );
/* fgInitDebug =============================================================*/
-void fgInitDebug( void )
-{
- char *pszClass, *pszPrio, *pszFile;
+void fgInitDebug( void ) {
+ char *pszClass, *pszPrio, *pszFile;
- // Support for log file/alt debug output via command line, environment or
- // reasonable default.
+ // Support for log file/alt debug output via command line, environment or
+ // reasonable default.
- if( strlen( logArgbuf ) > 3) { // First check for command line option
- fg_DebugOutput = fopen(logArgbuf, "a+" ); // Assumed that we will append.
+ if( strlen( logArgbuf ) > 3) { // First check for command line option
+ // Assumed that we will append.
+ fg_DebugOutput = fopen(logArgbuf, "a+" );
}
- if( !fg_DebugOutput ) { // If not set on command line, environment?
- pszFile = getenv( "FG_DEBUGFILE" );
- if( pszFile ) { // There is such an environmental variable.
- fg_DebugOutput = fopen( pszFile, "a+" );
- }
+ if( !fg_DebugOutput ) { // If not set on command line, environment?
+ pszFile = getenv( "FG_DEBUGFILE" );
+ if( pszFile ) { // There is such an environmental variable.
+ fg_DebugOutput = fopen( pszFile, "a+" );
+ }
}
- if( !fg_DebugOutput ) { // If neither command line nor environment
- 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;
+ if( !fg_DebugOutput ) { // If neither command line nor environment
+ fg_DebugOutput = stderr; // then we use the fallback position
}
- 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 );
- }
+
+ 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" );
+ 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)) {
- fg_DebugPriority = priorityArgValue;
- }
- else { // Either not set or out of range. We will not warn the user.
- pszClass = getenv( "FG_DEBUGCLASS" );
- if( pszClass ) {
- fg_DebugClass = fgDebugStrToClass( pszClass );
- fprintf( stderr,
- "fg_debug.c: Environment overrides default debug class (0x%08X)\n",
- fg_DebugClass );
- }
+ if ((debugArgValue >= FG_ALL) && (debugArgValue < FG_UNDEFD)) {
+ fg_DebugPriority = priorityArgValue;
+ } else { // Either not set or out of range. We will not warn the user.
+ pszClass = getenv( "FG_DEBUGCLASS" );
+ if( pszClass ) {
+ fg_DebugClass = fgDebugStrToClass( pszClass );
+ fprintf( stderr,
+ "fg_debug.c: Environment overrides default debug class (0x%08X)\n",
+ fg_DebugClass );
+ }
}
- FG_RELEASEDEBUGSEM;
+ FG_RELEASEDEBUGSEM;
}
/* fgDebugStrToClass ======================================================*/
-fgDebugClass fgDebugStrToClass( char *str )
-{
- char *hex = "0123456789ABCDEF";
- char *hexl = "0123456789abcdef";
- char *pt, *p, *ph, ps = 1;
- unsigned int val = 0, i;
+fgDebugClass fgDebugStrToClass( char *str ) {
+ char *hex = "0123456789ABCDEF";
+ char *hexl = "0123456789abcdef";
+ char *pt, *p, *ph, ps = 1;
+ unsigned int val = 0, i;
- if( str == NULL ) {
- return 0;
- }
-
- /* Check for 0xXXXXXX notation */
- if( (p = strstr( str, "0x")) ) {
- p++; p++;
- while (*p) {
- if( (ph = strchr(hex,*p)) || (ph = strchr(hexl,*p)) ){
- val <<= 4;
- val += ph-hex;
- p++;
- }
- else {
- /* fprintf( stderr, "Error in hex string '%s'\n", str );
- */
- return FG_NONE;
- }
+ if( str == NULL ) {
+ return 0;
}
- }
- 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;
- }
+
+ /* Check for 0xXXXXXX notation */
+ if( (p = strstr( str, "0x")) ) {
+ p++; p++;
+ while (*p) {
+ if( (ph = strchr(hex,*p)) || (ph = strchr(hexl,*p)) ){
+ val <<= 4;
+ val += ph-hex;
+ p++;
+ } else {
+ // fprintf( stderr, "Error in hex string '%s'\n", str );
+ 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;
+ return (fgDebugClass)val;
}
/* fgSetDebugOutput =======================================================*/
-void fgSetDebugOutput( FILE *out )
-{
- FG_GRABDEBUGSEM;
- fflush( fg_DebugOutput );
- fg_DebugOutput = out;
- FG_RELEASEDEBUGSEM;
+void fgSetDebugOutput( FILE *out ) {
+ FG_GRABDEBUGSEM;
+ fflush( fg_DebugOutput );
+ fg_DebugOutput = out;
+ FG_RELEASEDEBUGSEM;
}
/* fgSetDebugLevels =======================================================*/
-void fgSetDebugLevels( fgDebugClass dbg_class, fgDebugPriority prio )
-{
- FG_GRABDEBUGSEM;
- fg_DebugClass = dbg_class;
- fg_DebugPriority = prio;
- FG_RELEASEDEBUGSEM;
+void fgSetDebugLevels( fgDebugClass dbg_class, fgDebugPriority prio ) {
+ FG_GRABDEBUGSEM;
+ fg_DebugClass = dbg_class;
+ fg_DebugPriority = prio;
+ FG_RELEASEDEBUGSEM;
}
/* fgRegisterDebugCallback ================================================*/
-fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback )
-{
- fgDebugCallback old;
- FG_GRABDEBUGSEM;
- old = fg_DebugCallback;
- fg_DebugCallback = callback;
- FG_RELEASEDEBUGSEM;
- return old;
+fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback ) {
+ fgDebugCallback old;
+ FG_GRABDEBUGSEM;
+ old = fg_DebugCallback;
+ fg_DebugCallback = callback;
+ FG_RELEASEDEBUGSEM;
+ return old;
}
/* fgPrintf ===============================================================*/
-int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... )
-{
- char szOut[1024+1];
- va_list ap;
- int ret = 0;
-
- // If no action to take, then don't bother with the semaphore activity
- // Slight speed benefit.
-
- if( !(dbg_class & fg_DebugClass) || (prio < fg_DebugPriority) ) {
- return ret; // Its zero anyway. But we might think about changing
- // it upon some error condition?
- }
-
- 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);
+int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... ) {
+ char szOut[1024+1];
+ va_list ap;
+ int ret = 0;
+
+ // If no action to take, then don't bother with the semaphore
+ // activity Slight speed benefit.
+
+ if( !(dbg_class & fg_DebugClass) || (prio < fg_DebugPriority) ) {
+ // Its zero anyway. But we might think about changing
+ // it upon some error condition?
+ return ret;
}
- 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$
-/* 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.
+/* Revision 1.8 1998/03/09 22:11:00 curt
+/* Processed through the format-o-matic.
/*
+ * 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.
+ *
*/
-/**************************************************************************
+/* -*- Mode: C++ -*-
+ *
* fg_debug.h -- Flight Gear debug utility functions
*
* Written by Paul Bleisch, started January 1998.
#include <stdio.h>
-/* NB: To add a dbg_class, add it here, and add it to the structure
- in fg_debug.c
-*/
-typedef enum{
- FG_NONE = 0x00000000,
-
- FG_TERRAIN = 0x00000001,
- FG_ASTRO = 0x00000002,
- FG_FLIGHT = 0x00000004,
- FG_INPUT = 0x00000008,
- FG_GL = 0x00000010,
- FG_VIEW = 0x00000020,
- FG_COCKPIT = 0x00000040,
- FG_GENERAL = 0x00000080,
- FG_MATH = 0x00000100,
- FG_EVENT = 0x00000200,
- FG_AIRCRAFT= 0x00000400,
- FG_UNDEFD = 0x00001000, // For range checking
-
- FG_ALL = 0xFFFFFFFFL // -1!
- } fgDebugClass;
-
-/* NB: To add a priority, add it here.
-*/
+/* NB: To add a dbg_class, add it here, and add it to the structure in
+ fg_debug.c */
+typedef enum {
+ FG_NONE = 0x00000000,
+
+ FG_TERRAIN = 0x00000001,
+ FG_ASTRO = 0x00000002,
+ FG_FLIGHT = 0x00000004,
+ FG_INPUT = 0x00000008,
+ FG_GL = 0x00000010,
+ FG_VIEW = 0x00000020,
+ FG_COCKPIT = 0x00000040,
+ FG_GENERAL = 0x00000080,
+ FG_MATH = 0x00000100,
+ FG_EVENT = 0x00000200,
+ FG_AIRCRAFT= 0x00000400,
+ FG_UNDEFD = 0x00001000, // For range checking
+
+ FG_ALL = 0xFFFFFFFFL // -1!
+} fgDebugClass;
+
+/* NB: To add a priority, add it here. */
typedef enum {
- FG_BULK, /* For frequent messages */
- FG_DEBUG, /* Less frequent debug type messages */
- FG_INFO, /* Informatory messages */
- FG_WARN, /* Possible impending problem */
- FG_ALERT, /* Very possible impending problem */
- FG_EXIT, /* Problem (no core) */
- FG_ABORT /* Abandon ship (core) */
+ FG_BULK, /* For frequent messages */
+ FG_DEBUG, /* Less frequent debug type messages */
+ FG_INFO, /* Informatory messages */
+ FG_WARN, /* Possible impending problem */
+ FG_ALERT, /* Very possible impending problem */
+ FG_EXIT, /* Problem (no core) */
+ FG_ABORT /* Abandon ship (core) */
} fgDebugPriority;
+
/* Initialize the debuggin stuff. */
void fgInitDebug( void );
+
/* fgPrintf
Expects:
typedef int (*fgDebugCallback)( int DebugClass, int DebugPriority, char *outstr);
fgDebugCallback fgRegisterDebugCallback( fgDebugCallback callback );
+
// Leave these alone. Access intended for fg_debug and command line processing.
//
extern fgDebugClass fg_DebugClass;