Example #1
0
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();
}
Example #2
0
/* 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;
}
Example #3
0
File: prefs.c Project: dimkr/dillo
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;
}