#include <GL/freeglut.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <math.h>
-#ifdef WIN32
-#include <crtdbg.h> // DUMP MEMORY LEAKS
+#ifdef _MSC_VER
+/* DUMP MEMORY LEAKS */
+#include <crtdbg.h>
#endif
typedef struct
for ( i = 0; i < 10; i++ )
{
- int random = rand( );
- double new_x;
- double new_y;
- random = (((random >> 10)) & 2) + (((random >> 20) ) & 1);
- new_x = affine[random].a00 * current_x + affine[random].a01 * current_y + affine[random].b0 ;
- new_y = affine[random].a10 * current_x + affine[random].a11 * current_y + affine[random].b1 ;
+ int random = ( rand( ) >> 10 ) % num_trans;
+ double new_x = affine[random].a00 * current_x + affine[random].a01 * current_y + affine[random].b0 ;
+ double new_y = affine[random].a10 * current_x + affine[random].a11 * current_y + affine[random].b1 ;
glVertex2d ( new_x, new_y ) ;
current_x = new_x ;
}
+static void
+checkedFGets ( char *s, int size, FILE *stream )
+{
+ if ( fgets ( s, size, stream ) == NULL ) {
+ fprintf ( stderr, "fgets failed\n");
+ exit ( EXIT_FAILURE );
+ }
+}
+
+
void readConfigFile ( char *fnme )
{
FILE *fptr = fopen ( fnme, "rt" ) ;
if ( fptr )
{
/* Read a header line */
- fgets ( inputline, 256, fptr ) ;
+ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ;
/* Read a comment line */
- fgets ( inputline, 256, fptr ) ;
+ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ;
/* Read the window title */
- fgets ( inputline, 256, fptr ) ;
+ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ;
/* We assume here that this line will not exceed 79 characters plus a
newline (window_title is 80 characters long). That'll cause a buffer
overflow. For a simple program like this, though, we're letting it
sscanf ( inputline, "%[a-zA-Z0-9!@#$%^&*()+=/\\_-\" ]", window_title ) ;
/* Read a comment line */
- fgets ( inputline, 256, fptr ) ;
+ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ;
/* Read the number of affine transformations */
- fgets ( inputline, 256, fptr ) ;
+ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ;
sscanf ( inputline, "%d", &num_trans ) ;
affine = (AffineTrans *)malloc ( num_trans * sizeof(AffineTrans) ) ;
/* Read a comment line */
- fgets ( inputline, 256, fptr ) ;
+ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ;
for ( i = 0; i < num_trans; i++ )
{
/* Read an affine transformation definition */
- fgets ( inputline, 256, fptr ) ;
+ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ;
sscanf ( inputline, "%lf %lf %lf %lf %lf %lf", &affine[i].a00, &affine[i].a01,
&affine[i].a10, &affine[i].a11, &affine[i].b0, &affine[i].b1 ) ;
}
free ( affine ) ;
-#ifdef WIN32
- _CrtDumpMemoryLeaks () ; // DUMP MEMORY LEAK INFORMATION
+#ifdef _MSC_VER
+ /* DUMP MEMORY LEAK INFORMATION */
+ _CrtDumpMemoryLeaks () ;
#endif
return 0; /* ANSI C requires main to return int. */