#include <GL/freeglut.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <math.h>
typedef struct
AffineTrans ;
/* Number of levels to draw the fractal */
-static int num_levels = 0 ;
+static int num_levels = 4 ;
/* The definition of the fractal */
static int num_trans ;
static AffineTrans *affine ;
+/* Flag telling us to keep executing the main loop */
+static int continue_in_main_loop = 1;
+
/* the window title */
char window_title [ 80 ] ;
static void
Key(unsigned char key, int x, int y)
{
+ int need_redisplay = 1;
+
switch (key) {
case 27: /* Escape key */
- glutLeaveMainLoop () ;
+ continue_in_main_loop = 0 ;
break;
case '+' :
xwin = -1.0 ;
ywin = 0.0 ;
glTranslated ( xwin, ywin, -5.0 ) ;
-
break ;
- }
- glutPostRedisplay();
+ default:
+ need_redisplay = 0;
+ break;
+ }
+ if (need_redisplay)
+ glutPostRedisplay();
}
static void
Special(int key, int x, int y)
{
+ int need_redisplay = 1;
+
switch (key) {
case GLUT_KEY_UP :
glMatrixMode ( GL_MODELVIEW ) ;
glTranslated ( xwin, ywin, 0.0 ) ;
scale_factor *= 1.25 ;
break ;
+
+ default:
+ need_redisplay = 0;
+ break;
}
+ if (need_redisplay)
+ glutPostRedisplay();
+}
+
- glutPostRedisplay();
+static void
+checkedFGets ( char *s, int size, FILE *stream )
+{
+ if ( fgets ( s, size, stream ) == NULL ) {
+ fprintf ( stderr, "fgets failed\n");
+ exit ( EXIT_FAILURE );
+ }
}
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 ) ;
}
glutSpecialFunc(Special);
glutDisplayFunc(Display);
- glutMainLoop();
+#ifdef WIN32
+#endif
+
+ while ( continue_in_main_loop )
+ glutMainLoopEvent();
printf ( "Back from the 'freeglut' main loop\n" ) ;