1/***********************************************************
2 *      Copyright (C) 1997, Be Inc.  Copyright (C) 1999, Jake Hamby.
3 *
4 * This program is freely distributable without licensing fees
5 * and is provided without guarantee or warrantee expressed or
6 * implied. This program is -not- in the public domain.
7 *
8 *
9 *  FILE:	glutDstr.cpp
10 *
11 *	DESCRIPTION:	convert display string into a Be options variable
12 ***********************************************************/
13
14/***********************************************************
15 *	Headers
16 ***********************************************************/
17#include <GL/glut.h>
18#include <string.h>
19#include <stdlib.h>
20#include "glutint.h"
21#include "glutState.h"
22
23/***********************************************************
24 *	FUNCTION:	glutInitDisplayString
25 *
26 *	DESCRIPTION:  sets the display string variable
27 ***********************************************************/
28void APIENTRY
29glutInitDisplayString(const char *string)
30{
31  if (gState.displayString) {
32    free(gState.displayString);
33  }
34  if (string) {
35    gState.displayString = strdup(string);
36    if (!gState.displayString)
37      __glutFatalError("out of memory.");
38  } else
39    gState.displayString = NULL;
40}
41
42/***********************************************************
43 *	FUNCTION:	__glutConvertDisplayModeFromString
44 *
45 *	DESCRIPTION:  converts the current display mode into a BGLView
46 *		display mode, printing warnings as appropriate.
47 *
48 *	PARAMETERS:	 if options is non-NULL, the current display mode is
49 *		returned in it.
50 *
51 *	RETURNS:	1 if the current display mode is possible, else 0
52 ***********************************************************/
53int __glutConvertDisplayModeFromString(unsigned long *options) {
54	ulong newoptions = 0;
55
56	char *word = strtok(gState.displayString, " \t");
57	do {
58		char *cstr = strpbrk(word, "=><!~");
59		if(cstr)
60			*cstr = '\0';
61		// this is the most minimal possible parser.  scan for
62		// options that we support, and add them to newoptions
63		// this will certainly cause it to accept things that we
64		// don't actually support, but if we don't support it, the
65		// program's probably not going to work anyway.
66		if(!strcmp(word, "alpha")) {
67			newoptions |= BGL_ALPHA;
68		} else if((!strcmp(word, "acc")) || (!strcmp(word, "acca"))) {
69			newoptions |= BGL_ACCUM;
70		} else if(!strcmp(word, "depth")) {
71			newoptions |= BGL_DEPTH;
72		} else if(!strcmp(word, "double")) {
73			newoptions |= BGL_DOUBLE;
74		} else if(!strcmp(word, "stencil")) {
75			newoptions |= BGL_STENCIL;
76		}
77	} while((word = strtok(0, " \t")) != 0);
78
79	if (options)
80		*options = newoptions;
81
82	return 1;	// assume we support it
83}
84