root/src/libs/glut/glutDstr.cpp
/***********************************************************
 *      Copyright (C) 1997, Be Inc.  Copyright (C) 1999, Jake Hamby.
 *
 * This program is freely distributable without licensing fees
 * and is provided without guarantee or warrantee expressed or
 * implied. This program is -not- in the public domain.
 *
 *
 *  FILE:       glutDstr.cpp
 *
 *      DESCRIPTION:    convert display string into a Be options variable
 ***********************************************************/

/***********************************************************
 *      Headers
 ***********************************************************/
#include <GL/glut.h>
#include <string.h>
#include <stdlib.h>
#include "glutint.h"
#include "glutState.h"

/***********************************************************
 *      FUNCTION:       glutInitDisplayString
 *
 *      DESCRIPTION:  sets the display string variable
 ***********************************************************/
void APIENTRY 
glutInitDisplayString(const char *string)
{
  if (gState.displayString) {
    free(gState.displayString);
  }
  if (string) {
    gState.displayString = strdup(string);
    if (!gState.displayString)
      __glutFatalError("out of memory.");
  } else
    gState.displayString = NULL;
}

/***********************************************************
 *      FUNCTION:       __glutConvertDisplayModeFromString
 *
 *      DESCRIPTION:  converts the current display mode into a BGLView
 *              display mode, printing warnings as appropriate.
 *
 *      PARAMETERS:      if options is non-NULL, the current display mode is
 *              returned in it.
 *
 *      RETURNS:        1 if the current display mode is possible, else 0
 ***********************************************************/
int __glutConvertDisplayModeFromString(unsigned long *options) {
        ulong newoptions = 0;
        
        char *word = strtok(gState.displayString, " \t");
        do {
                char *cstr = strpbrk(word, "=><!~");
                if(cstr)
                        *cstr = '\0';
                // this is the most minimal possible parser.  scan for
                // options that we support, and add them to newoptions
                // this will certainly cause it to accept things that we
                // don't actually support, but if we don't support it, the
                // program's probably not going to work anyway.
                if(!strcmp(word, "alpha")) {
                        newoptions |= BGL_ALPHA;
                } else if((!strcmp(word, "acc")) || (!strcmp(word, "acca"))) {
                        newoptions |= BGL_ACCUM;
                } else if(!strcmp(word, "depth")) {
                        newoptions |= BGL_DEPTH;
                } else if(!strcmp(word, "double")) {
                        newoptions |= BGL_DOUBLE;
                } else if(!strcmp(word, "stencil")) {
                        newoptions |= BGL_STENCIL;
                }
        } while((word = strtok(0, " \t")) != 0);

        if (options)
                *options = newoptions;

        return 1;       // assume we support it
}