text: #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
  #include <GL/glew.h>
  #include <GL/freeglut.h>
  #define WINDOW_TITLE_PREFIX "Chapter 1"
  
  int CurrentWidth = 800,
      CurrentHeight = 600,
      WindowHandle = 0;
  
  unsigned FrameCount = 0;
  
  void Initialize(int, char*[]);
  void InitWindow(int, char*[]);
  void ResizeFunction(int, int);
  void RenderFunction(void);
  void TimerFunction(int);
  void IdleFunction(void);
  
  int main(int argc, char* argv[])
  {
    Initialize(argc, argv);
  
    glutMainLoop();
    
    exit(EXIT_SUCCESS);
  }
  
  void Initialize(int argc, char* argv[])
  {
    GLenum GlewInitResult;
  
    InitWindow(argc, argv);
  
    GlewInitResult = glewInit();
  
    if (GLEW_OK != GlewInitResult) {
      fprintf(
        stderr,
        "ERROR: %s\n",
        glewGetErrorString(GlewInitResult)
      );
      exit(EXIT_FAILURE);
    }
    
    fprintf(
      stdout,
      "INFO: OpenGL Version: %s\n",
      glGetString(GL_VERSION)
    );
  
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  }
  
  void InitWindow(int argc, char* argv[])
  {
    glutInit(&argc, argv);
    
    glutInitContextVersion(3, 3);
    glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
    glutInitContextProfile(GLUT_CORE_PROFILE);
  
    glutSetOption(
      GLUT_ACTION_ON_WINDOW_CLOSE,
      GLUT_ACTION_GLUTMAINLOOP_RETURNS
    );
    
    glutInitWindowSize(CurrentWidth, CurrentHeight);
  
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  
    WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX);
  
    if(WindowHandle < 1) {
      fprintf(
        stderr,
        "ERROR: Could not create a new rendering window.\n"
      );
      exit(EXIT_FAILURE);
    }
    
    glutReshapeFunc(ResizeFunction);
    glutDisplayFunc(RenderFunction);
    glutIdleFunc(IdleFunction);
    glutTimerFunc(0, TimerFunction, 0);
  }
  
  void ResizeFunction(int Width, int Height)
  {
    CurrentWidth = Width;
    CurrentHeight = Height;
    glViewport(0, 0, CurrentWidth, CurrentHeight);
  }
  
  void RenderFunction(void)
  {
    ++FrameCount;
  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
    glutSwapBuffers();
  }
  
  void IdleFunction(void)
  {
    glutPostRedisplay();
  }
  
  void TimerFunction(int Value)
  {
    if (0 != Value) {
      char* TempString = (char*)
        malloc(512 + strlen(WINDOW_TITLE_PREFIX));
  
      sprintf(
        TempString,
        "%s: %d Frames Per Second @ %d x %d",
        WINDOW_TITLE_PREFIX,
        FrameCount * 4,
        CurrentWidth,
        CurrentHeight
      );
  
      glutSetWindowTitle(TempString);
      free(TempString);
    }
    
    FrameCount = 0;
    glutTimerFunc(250, TimerFunction, 1);
  }
  