text: // A simple program to see if the GL implementation will accept a shader
  //  generated by MojoShader, as they could also fail to compile what
  //  we produce.
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <errno.h>
  
  #include "SDL.h"
  #include "mojoshader.h"
  
  static void * MOJOSHADERCALL get_proc_addr(const char *fnname, void *data)
  {
      return SDL_GL_GetProcAddress(fnname);
  }
  
  int main(int argc, char **argv)
  {
      int retval = 1;
      SDL_Window *sdlwindow = NULL;
      MOJOSHADER_glContext *mojo = NULL;
      int i;
  
      printf("MojoShader testglcompile\n");
      printf("Compiled against changeset %s\n", MOJOSHADER_CHANGESET);
      printf("Linked against changeset %s\n", MOJOSHADER_changeset());
      printf("\n");
  
      if (argc <= 2)
          printf("\n\nUSAGE: %s <profile> [file1] ... [fileN]\n\n", argv[0]);
      else if (SDL_Init(SDL_INIT_VIDEO) == -1)
          fprintf(stderr, "SDL_Init() error: %s\n", SDL_GetError());
      else if (SDL_GL_LoadLibrary(NULL) == -1)
          fprintf(stderr, "SDL_GL_LoadLibrary() error: %s\n", SDL_GetError());
      else if ((sdlwindow = SDL_CreateWindow(argv[0], SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL)) == NULL)
          fprintf(stderr, "SDL_CreateWindow() error: %s\n", SDL_GetError());
      else if (SDL_GL_CreateContext(sdlwindow) == NULL)
          fprintf(stderr, "SDL_GL_CreateContext() error: %s\n", SDL_GetError());
      else if ((mojo = MOJOSHADER_glCreateContext(argv[1], get_proc_addr, NULL, NULL, NULL, NULL)) == NULL)
          fprintf(stderr, "MOJOSHADER_glCreateContext() error: %s\n", MOJOSHADER_glGetError());
      else
          retval = 0;
  
      if (retval != 0)
      {
          SDL_Quit();
          return retval;
      } // if
  
      MOJOSHADER_glMakeContextCurrent(mojo);
  
      for (i = 2; i < argc; i++) {
          const char *fname = argv[i];
          static unsigned char buffer[1024 * 512];
          MOJOSHADER_glShader *shader;
          MOJOSHADER_glProgram *program;
          const MOJOSHADER_parseData *pd;
          int isvshader;
          FILE *io;
          size_t br;
  
          io = fopen(fname, "rb");
          if (!io) {
              fprintf(stderr, "Failed to open %s: %s\n", fname, strerror(errno));
              retval = 1;
              continue;
          }
  
          br = fread(buffer, 1, sizeof (buffer), io);
          fclose(io);
  
          shader = MOJOSHADER_glCompileShader(buffer, (unsigned int) br, NULL, 0, NULL, 0);
          if (!shader) {
              fprintf(stderr, "Compiling %s failed: %s\n", fname, MOJOSHADER_glGetError());
              retval = 1;
              continue;
          }
  
          shader = MOJOSHADER_glCompileShader(buffer, (unsigned int) br, NULL, 0, NULL, 0);
          if (!shader) {
              fprintf(stderr, "Compiling %s failed: %s\n", fname, MOJOSHADER_glGetError());
              retval = 1;
              continue;
          }
  
          pd = MOJOSHADER_glGetShaderParseData(shader);
          isvshader = (pd->shader_type == MOJOSHADER_TYPE_VERTEX);
          program = MOJOSHADER_glLinkProgram(isvshader ? shader : NULL, isvshader ? NULL : shader);
          if (!program) {
              fprintf(stderr, "Linking %s failed: %s\n", fname, MOJOSHADER_glGetError());
              retval = 1;
              MOJOSHADER_glDeleteShader(shader);
              continue;
          }
  
          printf("%s: okay\n", fname);
  
          MOJOSHADER_glDeleteProgram(program);
          MOJOSHADER_glDeleteShader(shader);
      }
  
      MOJOSHADER_glDestroyContext(mojo);
      SDL_Quit();
  
      return retval;
  }
  
  // end of testglcompile.c ...
  
  