static void player_filter_load_patterns (void) { char *fn; int fd; GScanner *scanner; int retval; int i; fn = file_in_dir (user_rcdir, PLAYERS_FILE); fd = open (fn, O_RDONLY); if (fd < 0) { g_free (fn); return; } scanner = g_scanner_new (&patterns_scanner_config); for (i = TOKEN_STRING; i <= TOKEN_REGEXP; i++) { g_scanner_add_symbol (scanner, mode_symbols[i - TOKEN_STRING], GINT_TO_POINTER(i)); } g_scanner_input_file (scanner, fd); do { retval = player_pattern_parse_statement (scanner, fn); } while (retval); g_scanner_destroy (scanner); g_free (fn); close (fd); if (filters[FILTER_PLAYER].changed != FILTER_NOT_CHANGED) filters[FILTER_PLAYER].last_changed = filter_time_inc(); }
/* create a scanner and tell it about the symbols we look for */ GScanner* init_scanner() { long i; GScanner *scan; scan = g_scanner_new(NULL); if (scan == NULL) return scan; scan->config->cpair_comment_single = ";\n"; scan->config->int_2_float = 1; scan->config->case_sensitive = 0; // scan->config->scan_symbols = 0; for (i=1; i<SYM_LAST; i++) { g_scanner_add_symbol(scan, symname[i], (gpointer)i); } return scan; }
static gint Prefs_load(void) { GScanner *scanner; gint fd; guint i, expected_token; gchar *file; /* Here we load and set options from dillorc */ file = a_Misc_prepend_user_home(".dillo/dillorc"); fd = open(file, O_RDONLY); g_free(file); if (fd < 0 && (fd = open(DILLORC_SYS, O_RDONLY)) < 0) return FILE_NOT_FOUND; fcntl(fd, F_SETFD, FD_CLOEXEC | fcntl(fd, F_GETFD)); scanner = g_scanner_new(NULL); /* Adjust lexing behaviour to suit our needs */ /* Specifies the chars which can be used in identifiers */ scanner->config->cset_identifier_nth = ( G_CSET_a_2_z "~+-_:&%#/.0123456789" G_CSET_A_2_Z G_CSET_LATINS /*??? I don't know if we need these two */ G_CSET_LATINC /*??? */ ); /* Specifies the chars which can start identifiers */ scanner->config->cset_identifier_first = ( G_CSET_a_2_z G_CSET_A_2_Z "_0123456789" ); /* Don't return G_TOKEN_SYMBOL, but the symbol's value */ scanner->config->symbol_2_token = TRUE; /* Don't return G_TOKEN_IDENTIFIER, but convert it to string */ scanner->config->identifier_2_string = TRUE; /* load symbols into the scanner */ g_scanner_freeze_symbol_table(scanner); for (i = 0; i < n_symbols; i++) g_scanner_add_symbol(scanner, symbols[i].name, GINT_TO_POINTER (symbols[i].token)); g_scanner_thaw_symbol_table(scanner); /* feed in the text */ g_scanner_input_file(scanner, fd); /* give the error handler an idea on how the input is named */ scanner->input_name = "dillorc"; /* * Scanning loop, we parse the input until it's end is reached, * the scanner encountered a lexing error, or our sub routine came * across invalid syntax */ do { expected_token = Prefs_parser(scanner); /* Give an error message upon syntax errors */ if (expected_token == G_TOKEN_SYMBOL) g_scanner_unexp_token (scanner, expected_token, NULL, "symbol", NULL, NULL, FALSE); else if (expected_token == G_TOKEN_STRING) g_scanner_unexp_token (scanner, expected_token, NULL, "string", NULL, NULL, FALSE); else if (expected_token == G_TOKEN_EQUAL_SIGN) g_scanner_unexp_token (scanner, expected_token, NULL, "=", NULL, NULL, FALSE); g_scanner_peek_next_token (scanner); } while ( /* expected_token == G_TOKEN_NONE && */ scanner->next_token != G_TOKEN_EOF && scanner->next_token != G_TOKEN_ERROR); /* give an error message upon syntax errors */ if (expected_token != G_TOKEN_NONE) g_scanner_unexp_token(scanner, expected_token, NULL, "symbol", NULL, NULL, TRUE); /* finish parsing */ g_scanner_destroy(scanner); close(fd); return PARSE_OK; }