Added some error-checking (particularly w.r.t. strdup()).
authorRichard Rauch <rkr@olib.org>
Sun, 26 Oct 2003 05:19:02 +0000 (05:19 +0000)
committerRichard Rauch <rkr@olib.org>
Sun, 26 Oct 2003 05:19:02 +0000 (05:19 +0000)
Deleted numerous 4-line "padding" sequences of C-as-English trans-
literation comments.

Re-indented some (but not all) code that is using 2-space indentation.
(Most of the freeglut code seems to be using 4-space indentation.)

I did not touch the "INIT DISPLAY STRING PARSING" code, since it is
filled with a ton of over-long lines and also appears to be in more
flux than the rest of the code.  (Well, I added one error-check
to a strdup().)

git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@240 7f0cb862-5218-0410-a997-914c9d46530a

src/freeglut_init.c

index 9949138..20fadab 100644 (file)
@@ -95,72 +95,39 @@ SFG_State fgState = { { -1, -1, FALSE },  /* Position */
 void fgInitialize( const char* displayName )
 {
 #if TARGET_HOST_UNIX_X11
-    /*
-     * Have the display created
-     */
     fgDisplay.Display = XOpenDisplay( displayName );
 
     if( fgDisplay.Display == NULL )
-    {
-        /*
-         * Failed to open a display. That's no good.
-         */
         fgError( "failed to open display '%s'", XDisplayName( displayName ) );
-    }
 
-    /*
-     * Check for the OpenGL GLX extension availability:
-     */
     if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) )
-    {
-        /*
-         * GLX extensions have not been found...
-         */
-        fgError( "OpenGL GLX extension not supported by display '%s'", XDisplayName( displayName ) );
-    }
+        fgError( "OpenGL GLX extension not supported by display '%s'",
+           XDisplayName( displayName ) );
 
-    /*
-     * Grab the default screen for the display we have just opened
-     */
     fgDisplay.Screen = DefaultScreen( fgDisplay.Display );
-
-    /*
-     * The same applying to the root window
-     */
     fgDisplay.RootWindow = RootWindow(
         fgDisplay.Display,
         fgDisplay.Screen
     );
 
-    /*
-     * Grab the logical screen's geometry
-     */
     fgDisplay.ScreenWidth  = DisplayWidth(
         fgDisplay.Display,
         fgDisplay.Screen
     );
-
     fgDisplay.ScreenHeight = DisplayHeight(
         fgDisplay.Display,
         fgDisplay.Screen
     );
 
-    /*
-     * Grab the physical screen's geometry
-     */
     fgDisplay.ScreenWidthMM = DisplayWidthMM(
         fgDisplay.Display,
         fgDisplay.Screen
     );
-
     fgDisplay.ScreenHeightMM = DisplayHeightMM(
-        fgDisplay.Display,
-        fgDisplay.Screen
+       fgDisplay.Display,
+       fgDisplay.Screen
     );
 
-    /*
-     * The display's connection number
-     */
     fgDisplay.Connection = ConnectionNumber( fgDisplay.Display );
 
     /*
@@ -182,19 +149,9 @@ void fgInitialize( const char* displayName )
      */
     fgDisplay.Instance = GetModuleHandle( NULL );
 
-    /*
-     * Check if the freeglut window class has been registered before...
-     */
     atom = GetClassInfo( fgDisplay.Instance, "FREEGLUT", &wc );
-
-    /*
-     * ...nope, it has not, and we have to do it right now:
-     */
     if( atom == 0 )
     {
-        /*
-         * Make sure the unitialized fields are reset to zero
-         */
         ZeroMemory( &wc, sizeof(WNDCLASS) );
 
         /*
@@ -228,29 +185,17 @@ void fgInitialize( const char* displayName )
     fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );
 
     {
-        /*
-         * Checking the display's size in millimeters isn't too hard, too:
-         */
         HWND desktop = GetDesktopWindow();
         HDC  context = GetDC( desktop );
 
-        /*
-         * Grab the appropriate values now (HORZSIZE and VERTSIZE respectably):
-         */
         fgDisplay.ScreenWidthMM  = GetDeviceCaps( context, HORZSIZE );
         fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
 
-        /*
-         * Whoops, forgot to release the device context :)
-         */
         ReleaseDC( desktop, context );
     }
 
 #endif
 
-    /*
-     * Have the joystick device initialized now
-     */
     fgJoystickInit( 0 );
 }
 
@@ -261,12 +206,10 @@ void fgDeinitialize( void )
 {
     SFG_Timer *timer;
 
-    /*
-     * Check if initialization has been performed before
-     */
     if( !fgState.Time.Set )
     {
-        fgWarning( "fgDeinitialize(): fgState.Timer is null => no valid initialization has been performed" );
+        fgWarning( "fgDeinitialize(): fgState.Timer is null => "
+           "no valid initialization has been performed" );
         return;
     }
 
@@ -279,29 +222,16 @@ void fgDeinitialize( void )
       fgStructure.MenuContext = NULL ;
     }
 
-    /*
-     * Perform the freeglut structure deinitialization
-     */
     fgDestroyStructure();
 
-    /*
-     * Delete all the timers and their storage list
-     */
     while ( (timer = (SFG_Timer *)fgState.Timers.First) != NULL )
     {
       fgListRemove ( &fgState.Timers, &timer->Node ) ;
       free ( timer ) ;
     }
 
-    /*
-     * Deinitialize the joystick device
-     */
     fgJoystickClose();
 
-    /*
-     * Reset the state structure
-     */
-
     fgState.Position.X = -1 ;
     fgState.Position.Y = -1 ;
     fgState.Position.Use = FALSE ;
@@ -310,9 +240,6 @@ void fgDeinitialize( void )
     fgState.Size.Y = 300 ;
     fgState.Size.Use = TRUE ;
 
-    /*
-     * The default display mode to be used
-     */
     fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;
 
     fgState.ForceDirectContext  = FALSE;
@@ -324,14 +251,8 @@ void fgDeinitialize( void )
     fgState.ActionOnWindowClose = GLUT_ACTION_EXIT ;
     fgState.ExecState           = GLUT_EXEC_STATE_INIT ;
 
-    /*
-     * Assume we want to ignore the automatic key repeat
-     */
     fgState.IgnoreKeyRepeat = TRUE;
 
-    /*
-     * Set the default game mode settings
-     */
     fgState.GameModeSize.X  = 640;
     fgState.GameModeSize.Y  = 480;
     fgState.GameModeDepth   =  16;
@@ -344,14 +265,10 @@ void fgDeinitialize( void )
     fgState.MenuStateCallback = (FGCBmenuState)NULL ;
     fgState.MenuStatusCallback = (FGCBmenuStatus)NULL ;
 
-    /*
-     * FPS display
-     */
     fgState.SwapCount   = 0;
     fgState.SwapTime    = 0;
     fgState.FPSInterval = 0;
 
-
 #if TARGET_HOST_UNIX_X11
 
     /*
@@ -383,25 +300,14 @@ void FGAPIENTRY glutInit( int* pargc, char** argv )
        fgState.ProgramName = strdup (*argv);
     else
        fgState.ProgramName = strdup ("");
-    /*
-     * Do not allow multiple initialization of the library
-     */
+    if (!fgState.ProgramName)
+       fgError ("Could not allocate space for the program's name.");
+
     if( fgState.Time.Set )
-    {
-        /*
-         * We can't have multiple initialization performed
-         */
-        fgError( "illegal glutInit() reinitialization attemp" );
-    }
+       fgError( "illegal glutInit() reinitialization attemp" );
 
-    /*
-     * Have the internal freeglut structure initialized now
-     */
     fgCreateStructure();
 
-    /*
-     * Remember the function's call time
-     */
 #if TARGET_HOST_UNIX_X11
     gettimeofday(&fgState.Time.Value, NULL);
 #elif TARGET_HOST_WIN32
@@ -420,180 +326,135 @@ void FGAPIENTRY glutInit( int* pargc, char** argv )
       }
     }
 
-    /*
-     * Grab the environment variable indicating the X display to use.
-     * This is harmless under Win32, so let's let it stay here...
-     */
 #if TARGET_HOST_WIN32
     if ( !getenv ( "DISPLAY" ) )
-      displayName = strdup ( "" ) ;
+       displayName = strdup ( "" ) ;
     else
 #endif
-    displayName = strdup( getenv( "DISPLAY" ) );
+       displayName = strdup( getenv( "DISPLAY" ) );
+    if (!displayName)
+       fgError ("Could not allocate space for display name.");
 
-    /*
-     * Have the program arguments parsed.
-     */
     for( i=1; i<argc; i++ )
     {
-        /*
-         * The X display name settings
-         */
         if( strcmp( argv[ i ], "-display" ) == 0 )
         {
-            /*
-             * Check for possible lack of the next argument
-             */
             if( ++i >= argc )
                 fgError( "-display parameter must be followed by display name" );
 
-            /*
-             * Release the previous display name (the one from app's environment)
-             */
-            free( displayName );
-
-            /*
-             * Make a working copy of the name for us to use
-             */
+            if( displayName )
+               free( displayName );
             displayName = strdup( argv[ i ] );
+           if (!displayName)
+               fgError( "Could not allocate space for display name (%s)",
+                   argv [i]);
 
-            /*
-             * Have both arguments removed
-             */
             argv[ i - 1 ] = NULL;
-            argv[   i   ] = NULL;
-            (* pargc) -= 2;
+            argv[ i     ] = NULL;
+            (*pargc) -= 2;
         }
-
-        /*
-         * The geometry settings
-         */
         else if( strcmp( argv[ i ], "-geometry" ) == 0 )
         {
-          int result, x, y;
-          unsigned int w, h;
-
-          /*
-           * Again, check if there is at least one more argument
-           */
-          if ( ++i >= argc )
-            fgError( "-geometry parameter must be followed by window geometry settings" );
-
-          /*
-           * Otherwise scan the geometry settings...
-           */
-          result = sscanf ( argv[i], "%dx%d+%d+%d", &x, &y, &w, &h );
-
-          /*
-           * Check what we have been supplied with...
-           */
-          if ( result > 3 )
-            fgState.Size.Y = h ;
-
-          if ( result > 2 )
-            fgState.Size.X = w ;
-
-          if( result > 1 )
-          {
-            if( y < 0 )
-              fgState.Position.Y = fgDisplay.ScreenHeight + y - fgState.Size.Y;
-            else
-              fgState.Position.Y = y;
-          }
-
-          if( result > 0 )
-          {
-            if( x < 0 )
-              fgState.Position.X = fgDisplay.ScreenWidth + x - fgState.Size.X;
-            else
-              fgState.Position.X = x;
-          }
-
-          /*
-           * Have both arguments removed
-           */
-          argv[ i - 1 ] = NULL;
-          argv[   i   ] = NULL;
-          (* pargc) -= 2;
-        }
+           int result, x, y;
+           unsigned int w, h;
 
-        /*
-         * The direct/indirect OpenGL contexts settings
-         */
+           if ( ++i >= argc )
+            fgError( "-geometry parameter must be followed by window "
+               "geometry settings" );
+           result = sscanf ( argv[i], "%dx%d+%d+%d", &x, &y, &w, &h );
+
+           if ( result > 3 )
+               fgState.Size.Y = h;
+           if ( result > 2 )
+               fgState.Size.X = w;
+
+           if( result > 1 )
+            {
+               if( y < 0 )
+                   fgState.Position.Y =
+                       fgDisplay.ScreenHeight + y - fgState.Size.Y;
+               else
+                   fgState.Position.Y = y;
+           }
+
+           if( result > 0 )
+            {
+               if( x < 0 )
+                   fgState.Position.X =
+                       fgDisplay.ScreenWidth + x - fgState.Size.X;
+               else
+                   fgState.Position.X = x;
+           }
+
+           argv[ i - 1 ] = NULL;
+           argv[ i     ] = NULL;
+           (*pargc) -= 2;
+        }
         else if( strcmp( argv[ i ], "-direct" ) == 0)
         {
-            /*
-             * We try to force direct rendering...
-             */
             if( fgState.TryDirectContext == FALSE )
-                fgError( "parameters ambiguity, -direct and -indirect cannot be both specified" );
+                fgError( "parameters ambiguity, -direct and -indirect "
+                   "cannot be both specified" );
 
             fgState.ForceDirectContext = TRUE;
             argv[ i ] = NULL;
-            (* pargc)--;
+            (*pargc)--;
         }
         else if( strcmp( argv[ i ], "-indirect" ) == 0 )
         {
-            /*
-             * We try to force indirect rendering...
-             */
             if( fgState.ForceDirectContext == TRUE )
-                fgError( "parameters ambiguity, -direct and -indirect cannot be both specified" );
+                fgError( "parameters ambiguity, -direct and -indirect "
+                   "cannot be both specified" );
 
             fgState.TryDirectContext = FALSE;
             argv[ i ] = NULL;
-            (* pargc)--;
+            (*pargc)--;
         }
-
-        /*
-         * The '-iconic' parameter makes all new top-level
-         * windows created in iconified state...
-         */
         else if( strcmp( argv[ i ], "-iconic" ) == 0 )
         {
             fgState.ForceIconic = TRUE;
             argv[ i ] = NULL;
-            (* pargc)--;
+            (*pargc)--;
         }
-
-        /*
-         * The '-gldebug' option activates some OpenGL state debugging features
-         */
         else if( strcmp( argv[ i ], "-gldebug" ) == 0 )
         {
             fgState.GLDebugSwitch = TRUE;
             argv[ i ] = NULL;
-            (* pargc)--;
+            (*pargc)--;
         }
-
-        /*
-         * The '-sync' option activates X protocol synchronization (for debugging purposes)
-         */
         else if( strcmp( argv[ i ], "-sync" ) == 0 )
         {
             fgState.XSyncSwitch = TRUE;
             argv[ i ] = NULL;
-            (* pargc)--;
+            (*pargc)--;
         }
     }
 
     /*
-     * Have the arguments list compacted now
+     * Compact {argv}.
      */
     j = 2 ;
     for( i = 1; i < *pargc; i++, j++ )
     {
-      if( argv[ i ] == NULL )
-      {
-        while ( argv[j] == NULL ) j++ ;  /* Guaranteed to end because there are "*pargc" arguments left */
-        argv[i] = argv[j] ;
-      }
+       if( argv[ i ] == NULL )
+        {
+           /* Guaranteed to end because there are "*pargc" arguments left */
+           while ( argv[j] == NULL )
+               j++;
+           argv[i] = argv[j] ;
+       }
     }
 
     /*
      * Have the display created now. As I am too lazy to implement
      * the program arguments parsing, we will have the DISPLAY
      * environment variable used for opening the X display:
+     *
+     * XXX The above comment is rather unclear.  We have just
+     * XXX completed parsing of the program arguments for GLUT
+     * XXX parameters.  We obviously canNOT parse the application-
+     * XXX specific parameters.  Can someone re-write the above
+     * XXX more clearly?
      */
     fgInitialize( displayName );
 
@@ -606,10 +467,8 @@ void FGAPIENTRY glutInit( int* pargc, char** argv )
     if( fgState.Size.X < 0 || fgState.Size.Y < 0 )
         fgState.Size.Use = FALSE;
 
-    /*
-     * Do not forget about releasing the display name string
-     */
-    free( displayName );
+    if( displayName )
+       free( displayName );
 }
 
 /*
@@ -617,23 +476,15 @@ void FGAPIENTRY glutInit( int* pargc, char** argv )
  */
 void FGAPIENTRY glutInitWindowPosition( int x, int y )
 {
-    /*
-     * The settings can be disables when both coordinates are negative
-     */
     if( (x >= 0) && (y >= 0) )
     {
-        /*
-         * We want to specify the initial position of each of the windows
-         */
+
         fgState.Position.X   =    x;
         fgState.Position.Y   =    y;
         fgState.Position.Use = TRUE;
     }
     else
     {
-        /*
-         * The initial position of each of the windows is specified by the wm
-         */
         fgState.Position.X   =    -1;
         fgState.Position.Y   =    -1;
         fgState.Position.Use = FALSE;
@@ -645,23 +496,14 @@ void FGAPIENTRY glutInitWindowPosition( int x, int y )
  */
 void FGAPIENTRY glutInitWindowSize( int width, int height )
 {
-    /*
-     * The settings can be disables when both values are negative
-     */
     if( (width > 0) && (height > 0) )
     {
-        /*
-         * We want to specify the initial size of each of the windows
-         */
         fgState.Size.X   =  width;
         fgState.Size.Y   = height;
         fgState.Size.Use =   TRUE;
     }
     else
     {
-        /*
-         * The initial size of each of the windows is specified by the wm (officially this is an error condition)
-         */
         fgState.Size.X   =    -1;
         fgState.Size.Y   =    -1;
         fgState.Size.Use = FALSE;
@@ -879,7 +721,11 @@ void FGAPIENTRY glutInitDisplayString( char* displayMode )
              * Grab the value string that must follow the comparison operator...
              */
             if( comparison != FG_NONE && i < (gint) strlen( scanner->value.v_identifier ) )
+            {
                 valueString = strdup( scanner->value.v_identifier + i );
+               if (!valueString)
+                   fgError ("Could not allocate an internal string.");
+           }           
 
             /*
              * If there was a value string, convert it to integer...