-#if 0 /* FIXME: CJP */
-/*
- * There is a discrete number of comparison operators we can encounter:
- *
- * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
- */
-#define FG_NONE 0x0000
-#define FG_EQUAL 0x0001
-#define FG_NOT_EQUAL 0x0002
-#define FG_LESS 0x0003
-#define FG_MORE 0x0004
-#define FG_LESS_OR_EQUAL 0x0005
-#define FG_MORE_OR_EQUAL 0x0006
-#define FG_CLOSEST 0x0007
-
-/*
- * The caller can feed us with a number of capability tokens:
- *
- * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" | "depth" | "double" |
- * "green" | "index" | "num" | "red" | "rgba" | "rgb" | "luminance" | "stencil" |
- * "single" | "stereo" | "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
- * "xgrayscale" | "xstaticcolor" | "xpseudocolor" | "xtruecolor" | "xdirectcolor"
- */
-static gchar* g_Tokens[] =
-{
- "none", "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", "green",
- "index", "num", "red", "rgba", "rgb", "luminance", "stencil", "single", "stereo", "samples",
- "slow", "win32pdf", "xvisual", "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
- "xtruecolor", "xdirectcolor", NULL
-};
-
-/*
- * The structure to hold the parsed display string tokens
- */
-typedef struct tagSFG_Capability SFG_Capability;
-struct tagSFG_Capability
-{
- gint capability; /* the capability token enumerator */
- gint comparison; /* the comparison operator used */
- gint value; /* the value we're comparing to */
-};
-
-/*
- * The scanner configuration for the init display string
- */
-static GScannerConfig fgInitDisplayStringScannerConfig =
-{
- ( " \t\r\n" ) /* cset_skip_characters */,
- (
- G_CSET_a_2_z
- "_"
- G_CSET_A_2_Z
- ) /* cset_identifier_first */,
- (
- G_CSET_a_2_z
- "_0123456789"
- G_CSET_A_2_Z
- G_CSET_LATINS
- G_CSET_LATINC
- "<>!=~"
- ) /* cset_identifier_nth */,
- ( "#\n" ) /* cpair_comment_single */,
- FALSE /* case_sensitive */,
- TRUE /* skip_comment_multi */,
- TRUE /* skip_comment_single */,
- TRUE /* scan_comment_multi */,
- TRUE /* scan_identifier */,
- FALSE /* scan_identifier_1char */,
- FALSE /* scan_identifier_NULL */,
- TRUE /* scan_symbols */,
- FALSE /* scan_binary */,
- TRUE /* scan_octal */,
- TRUE /* scan_float */,
- TRUE /* scan_hex */,
- FALSE /* scan_hex_dollar */,
- TRUE /* scan_string_sq */,
- TRUE /* scan_string_dq */,
- TRUE /* numbers_2_int */,
- FALSE /* int_2_float */,
- FALSE /* identifier_2_string */,
- TRUE /* char_2_token */,
- FALSE /* symbol_2_token */,
- FALSE /* scope_0_fallback */,
-};
-
-/*
- * Sets the default display mode for all new windows using a string
- */
-void FGAPIENTRY glutInitDisplayString( char* displayMode )
-{
- /*
- * display_string ::= (switch)
- * switch ::= capability [comparison value]
- * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
- * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" |
- * "depth" | "double" | "green" | "index" | "num" | "red" | "rgba" |
- * "rgb" | "luminance" | "stencil" | "single" | "stereo" |
- * "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
- * "xgrayscale" | "xstaticcolor" | "xpseudocolor" |
- * "xtruecolor" | "xdirectcolor"
- * value ::= 0..9 [value]
- *
- * The display string grammar. This should be EBNF, but I couldn't find the definitions so, to
- * clarify: (expr) means 0 or more times the expression, [expr] means 0 or 1 times expr.
- *
- * Create a new GLib lexical analyzer to process the display mode string
- */
- GScanner* scanner = g_scanner_new( &fgInitDisplayStringScannerConfig );
- GList* caps = NULL;
- gint i;
-
- /*
- * Fail if the display mode string is empty or the scanner failed to initialize
- */
- freeglut_return_if_fail( (scanner != NULL) && (strlen( displayMode ) > 0) );
-
- /*
- * Set the scanner's input name (for debugging)
- */
- scanner->input_name = "glutInitDisplayString";
-
- /*
- * Start the lexical analysis of the extensions string
- */
- g_scanner_input_text( scanner, displayMode, strlen( displayMode ) );
-
- /*
- * While there are any more tokens to be checked...
- */
- while( !g_scanner_eof( scanner ) )
- {
- /*
- * Actually we're expecting only string tokens
- */
- GTokenType tokenType = g_scanner_get_next_token( scanner );
-
- /*
- * We are looking for identifiers
- */
- if( tokenType == G_TOKEN_IDENTIFIER )
- {
- gchar* capability = NULL; /* the capability identifier string (always present) */
- gint capID = 0; /* the capability identifier value (from g_Tokens) */
- gint comparison = 0; /* the comparison operator value, see definitions */
- gchar* valueString = NULL; /* if the previous one is present, this is needed */
- gint value = 0; /* the integer value converted using a strtol call */
- SFG_Capability* capStruct; /* the capability description structure */
-
- /*
- * OK. The general rule of thumb that we always should be getting a capability identifier
- * string (see the grammar description). If it is followed by a comparison identifier, then
- * there must follow an integer value we're comparing the capability to...
- *
- * Have the current token analyzed with that in mind...
- */
- for( i=0; i<(gint) strlen( scanner->value.v_identifier ); i++ )
- {
- gchar c = scanner->value.v_identifier[ i ];
-
- if( (c == '=') || (c == '!') || (c == '<') || (c == '>') || (c == '~') )
- break;
- }
-
- /*
- * Here we go with the length of the capability identifier string.
- * In the worst of cases, it is as long as the token identifier.
- */
- capability = g_strndup( scanner->value.v_identifier, i );
-
- /*
- * OK. Is there a chance for comparison and value identifiers to follow?
- * Note: checking against i+1 as this handles two cases: single character
- * comparison operator and first of value's digits, which must always be
- * there, or the two-character comparison operators.
- */
- if( (i + 1) < (gint) strlen( scanner->value.v_identifier ) )
- {
- /*
- * Yeah, indeed, it is the i-th character to start the identifier, then.
- */
- gchar c1 = scanner->value.v_identifier[ i + 0 ];
- gchar c2 = scanner->value.v_identifier[ i + 1 ];
-
- if( (c1 == '=') ) { i += 1; comparison = FG_EQUAL; } else
- if( (c1 == '!') && (c2 == '=') ) { i += 2; comparison = FG_NOT_EQUAL; } else
- if( (c1 == '<') && (c2 == '=') ) { i += 2; comparison = FG_LESS_OR_EQUAL; } else
- if( (c1 == '>') && (c2 == '=') ) { i += 2; comparison = FG_MORE_OR_EQUAL; } else
- if( (c1 == '<') ) { i += 1; comparison = FG_LESS; } else
- if( (c1 == '>') ) { i += 1; comparison = FG_MORE; } else
- if( (c1 == '~') ) { i += 1; comparison = FG_CLOSEST; } else
- g_warning( "invalid comparison operator in token `%s'", scanner->value.v_identifier );
- }
-
- /*
- * Grab the value string that must follow the comparison operator...
- */
- if( comparison != FG_NONE && i < (gint) strlen( scanner->value.v_identifier ) )
- valueString = strdup( scanner->value.v_identifier + i );
-
- /*
- * If there was a value string, convert it to integer...
- */
- if( comparison != FG_NONE && strlen( valueString ) > 0 )
- value = strtol( valueString, NULL, 0 );
-
- /*
- * Now we need to match the capability string and its ID
- */
- for( i=0; g_Tokens[ i ]!=NULL; i++ )
- {
- if( strcmp( capability, g_Tokens[ i ] ) == 0 )
- {
- /*
- * Looks like we've found the one we were looking for
- */
- capID = i;
- break;
- }
- }
-
- /*
- * Create a new capability description structure
- */
- capStruct = g_new0( SFG_Capability, 1 );
-
- /*
- * Fill in the cap's values, as we have parsed it:
- */
- capStruct->capability = capID;
- capStruct->comparison = comparison;
- capStruct->value = value;
-
- /*
- * Add the new capabaility to the caps list
- */
- caps = g_list_append( caps, capStruct );
-
- /*
- * Clean up the local mess and keep rolling on
- */
- g_free( valueString );
- g_free( capability );
- }
- }
-
- /*
- * Now that we have converted the string into somewhat more machine-friendly
- * form, proceed with matching the frame buffer configuration...
- *
- * The caps list could be passed to a function that would try finding the closest
- * matching pixel format, visual, frame buffer configuration or whatever. It would
- * be good to convert the glutInitDisplayMode() to use the same method.
- */
-#if 0
- g_message( "found %i capability preferences", g_list_length( caps ) );
-
- g_message( "token `%s': cap: %i, com: %i, val: %i",
- scanner->value.v_identifier,
- capStruct->capability,
- capStruct->comparison,
- capStruct->value
- );
-#endif
-
- /*
- * Free the capabilities we have parsed
- */
- for( i=0; i<(gint) g_list_length( caps ); i++ )
- g_free( g_list_nth( caps, i )->data );
-
- /*
- * Destroy the capabilities list itself
- */
- g_list_free( caps );
-
- /*
- * Free the lexical scanner now...
- */
- g_scanner_destroy( scanner );
-}
-#endif
-
-#define NUM_TOKENS 28