int TCOD_lex_get_iden(TCOD_lex_t *lex) { char c = *lex->pos; int len = 0, key = 0; do { allocate_tok(lex, len); lex->tok[ len++ ] = c; c = *( ++ (lex->pos) ); } while ( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) || ( c >= '0' && c <= '9' ) || c == '_' ); allocate_tok(lex, len); lex->tok[len ] = 0; while ( key < lex->nb_keywords ) { if ( strcmp( lex->tok, lex->keywords[ key ] ) == 0 || ( lex->flags & TCOD_LEX_FLAG_NOCASE && TCOD_strcasecmp( lex->tok, lex->keywords[ key ] ) == 0 )) { lex->token_type = TCOD_LEX_KEYWORD; lex->token_idx = key; return TCOD_LEX_KEYWORD; } key ++; } lex->token_type = TCOD_LEX_IDEN; lex->token_idx = -1; return TCOD_LEX_IDEN; }
int TCOD_lex_parse_until_token_value(TCOD_lex_t *lex, const char *tokenValue) { int token; token = TCOD_lex_parse(lex); if ( token == TCOD_LEX_ERROR ) return token; { while ( token != TCOD_LEX_EOF ) if ( strcmp( lex->tok, tokenValue ) == 0 || ( ( lex->flags & TCOD_LEX_FLAG_NOCASE ) && TCOD_strcasecmp(lex->tok, tokenValue ) == 0 ) ) return token; token = TCOD_lex_parse(lex); if ( token == TCOD_LEX_ERROR ) return token; } return token; }
static void TCOD_sys_load_player_config() { const char *renderer; const char *font; int fullscreenWidth,fullscreenHeight; /* define file structure */ TCOD_parser_t parser=TCOD_parser_new(); TCOD_parser_struct_t libtcod = TCOD_parser_new_struct(parser, "libtcod"); TCOD_struct_add_property(libtcod, "renderer", TCOD_TYPE_STRING, false); TCOD_struct_add_property(libtcod, "font", TCOD_TYPE_STRING, false); TCOD_struct_add_property(libtcod, "fontInRow", TCOD_TYPE_BOOL, false); TCOD_struct_add_property(libtcod, "fontGreyscale", TCOD_TYPE_BOOL, false); TCOD_struct_add_property(libtcod, "fontTcodLayout", TCOD_TYPE_BOOL, false); TCOD_struct_add_property(libtcod, "fontNbCharHoriz", TCOD_TYPE_INT, false); TCOD_struct_add_property(libtcod, "fontNbCharVertic", TCOD_TYPE_INT, false); TCOD_struct_add_property(libtcod, "fullscreen", TCOD_TYPE_BOOL, false); TCOD_struct_add_property(libtcod, "fullscreenWidth", TCOD_TYPE_INT, false); TCOD_struct_add_property(libtcod, "fullscreenHeight", TCOD_TYPE_INT, false); /* parse file */ TCOD_parser_run(parser,"./libtcod.cfg",NULL); /* set user preferences */ renderer=TCOD_parser_get_string_property(parser, "libtcod.renderer"); if ( renderer != NULL ) { /* custom renderer */ if ( TCOD_strcasecmp(renderer,"GLSL") == 0 ) TCOD_ctx.renderer=TCOD_RENDERER_GLSL; else if ( TCOD_strcasecmp(renderer,"OPENGL") == 0 ) TCOD_ctx.renderer=TCOD_RENDERER_OPENGL; else if ( TCOD_strcasecmp(renderer,"SDL") == 0 ) TCOD_ctx.renderer=TCOD_RENDERER_SDL; else printf ("Warning : unknown renderer '%s' in libtcod.cfg\n", renderer); } font=TCOD_parser_get_string_property(parser, "libtcod.font"); if ( font != NULL ) { /* custom font */ FILE *f=fopen(font,"rb"); if (f) { int fontNbCharHoriz,fontNbCharVertic; fclose(f); strcpy(TCOD_ctx.font_file,font); TCOD_ctx.font_in_row=TCOD_parser_get_bool_property(parser,"libtcod.fontInRow"); TCOD_ctx.font_greyscale=TCOD_parser_get_bool_property(parser,"libtcod.fontGreyscale"); TCOD_ctx.font_tcod_layout=TCOD_parser_get_bool_property(parser,"libtcod.fontTcodLayout"); fontNbCharHoriz=TCOD_parser_get_int_property(parser,"libtcod.fontNbCharHoriz"); fontNbCharVertic=TCOD_parser_get_int_property(parser,"libtcod.fontNbCharVertic"); if ( fontNbCharHoriz > 0 ) TCOD_ctx.fontNbCharHoriz=fontNbCharHoriz; if ( fontNbCharVertic > 0 ) TCOD_ctx.fontNbCharVertic=fontNbCharVertic; if ( charmap ) { SDL_FreeSurface(charmap); charmap=NULL; } } else { printf ("Warning : font file '%s' does not exist\n",font); } } /* custom fullscreen resolution */ TCOD_ctx.fullscreen=TCOD_parser_get_bool_property(parser,"libtcod.fullscreen"); fullscreenWidth=TCOD_parser_get_int_property(parser,"libtcod.fullscreenWidth"); fullscreenHeight=TCOD_parser_get_int_property(parser,"libtcod.fullscreenHeight"); if ( fullscreenWidth > 0 ) TCOD_ctx.fullscreen_width=fullscreenWidth; if ( fullscreenHeight > 0 ) TCOD_ctx.fullscreen_height=fullscreenHeight; }