static void parse_language_with_id (ParserState *parser_state, gchar *lang_id) { GtkSourceLanguageManager *lm; GtkSourceLanguage *imported_language; g_return_if_fail (parser_state->error == NULL); lm = _gtk_source_language_get_language_manager (parser_state->language); imported_language = gtk_source_language_manager_get_language (lm, lang_id); if (imported_language == NULL) { g_set_error (&parser_state->error, PARSER_ERROR, PARSER_ERROR_WRONG_ID, "unable to resolve language '%s'", lang_id); } else { file_parse (imported_language->priv->lang_file_name, parser_state->language, parser_state->ctx_data, parser_state->defined_regexes, parser_state->styles_mapping, parser_state->loaded_lang_ids, parser_state->replacements, &parser_state->error); } }
static gboolean add_ref (ParserState *parser_state, const gchar *ref, GtkSourceContextRefOptions options, const gchar *style, GError **error) { gboolean all = FALSE; gchar *ref_id; gchar *lang_id = NULL; GError *tmp_error = NULL; /* Return if an error is already set */ g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (id_is_decorated (ref, &lang_id)) { if (!lang_id_is_already_loaded (parser_state, lang_id)) { GtkSourceLanguageManager *lm; GtkSourceLanguage *imported_language; lm = _gtk_source_language_get_language_manager (parser_state->language); imported_language = gtk_source_language_manager_get_language (lm, lang_id); if (imported_language == NULL) { g_set_error (&tmp_error, PARSER_ERROR, PARSER_ERROR_WRONG_ID, "unable to resolve language '%s' in ref '%s'", lang_id, ref); } else { file_parse (imported_language->priv->lang_file_name, parser_state->language, parser_state->ctx_data, parser_state->defined_regexes, parser_state->styles_mapping, parser_state->loaded_lang_ids, parser_state->replacements, &tmp_error); if (tmp_error != NULL) { GError *tmp_error2 = NULL; g_set_error (&tmp_error2, PARSER_ERROR, tmp_error->code, "In file '%s' referenced from '%s': %s", imported_language->priv->lang_file_name, parser_state->language->priv->lang_file_name, tmp_error->message); g_clear_error (&tmp_error); tmp_error = tmp_error2; } } } ref_id = g_strdup (ref); } else { ref_id = decorate_id (parser_state, ref); } if (tmp_error == NULL && parser_state->ctx_data != NULL) { if (g_str_has_suffix (ref, ":*")) { all = TRUE; ref_id [strlen (ref_id) - 2] = '\0'; } if (all && (options & (GTK_SOURCE_CONTEXT_IGNORE_STYLE | GTK_SOURCE_CONTEXT_OVERRIDE_STYLE))) { g_set_error (&tmp_error, PARSER_ERROR, PARSER_ERROR_WRONG_STYLE, "style override used with wildcard context reference" " in language '%s' in ref '%s'", lang_id != NULL ? lang_id : parser_state->current_lang_id, ref); } } if (tmp_error == NULL && parser_state->ctx_data != NULL) { gchar *container_id; container_id = g_queue_peek_head (parser_state->curr_parents); /* If the document is validated container_id is never NULL */ g_assert (container_id); _gtk_source_context_data_add_ref (parser_state->ctx_data, container_id, ref_id, options, style, all, &tmp_error); DEBUG (g_message ("appended %s in %s", ref_id, container_id)); } g_free (lang_id); g_free (ref_id); if (tmp_error != NULL) { g_propagate_error (error, tmp_error); return FALSE; } return TRUE; }
gboolean _gtk_source_language_file_parse_version2 (GtkSourceLanguage *language, GtkSourceContextData *ctx_data) { GHashTable *defined_regexes, *styles; gboolean success; GError *error = NULL; gchar *filename; GHashTable *loaded_lang_ids; GQueue *replacements; g_return_val_if_fail (ctx_data != NULL, FALSE); filename = language->priv->lang_file_name; /* TODO: as an optimization tell the parser to merge CDATA * as text nodes (XML_PARSE_NOCDATA), and to ignore blank * nodes (XML_PARSE_NOBLANKS), if it is possible with * xmlTextReader. */ xmlKeepBlanksDefault (0); xmlLineNumbersDefault (1); xmlSubstituteEntitiesDefault (1); DEBUG (xmlPedanticParserDefault (1)); defined_regexes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); styles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) _gtk_source_style_info_free); loaded_lang_ids = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) xmlFree, NULL); replacements = g_queue_new (); success = file_parse (filename, language, ctx_data, defined_regexes, styles, loaded_lang_ids, replacements, &error); if (success) success = _gtk_source_context_data_finish_parse (ctx_data, replacements->head, &error); if (success) g_hash_table_foreach_steal (styles, (GHRFunc) steal_styles_mapping, language->priv->styles); g_queue_foreach (replacements, (GFunc) _gtk_source_context_replace_free, NULL); g_queue_free (replacements); g_hash_table_destroy (loaded_lang_ids); g_hash_table_destroy (defined_regexes); g_hash_table_destroy (styles); if (!success) { g_warning ("Failed to load '%s': %s", filename, error->message); g_error_free (error); return FALSE; } return TRUE; }
int main(int argc, char *argv[]) { int ret = -1; int fd = 0; char *abs_path = (char *)NULL; PGconn *conn; /*arg*/ if (argc != 2) { fprintf(stderr, "Usage: %s rpl_logfile\n", argv[0]); exit(1); } // get absolute path of logfile abs_path = realpath(argv[1], NULL); if (abs_path == NULL) { fprintf(stderr, "realpath failed: %s\n", strerror(errno)); exit(1); } #ifdef PGSQL //connect log-pgsql database if ((conn = dbconn()) == NULL) { exit(1); } #endif // open logfile, and seek file-offset // TODO resume PS, USER, history if ((fd = logopen(abs_path)) < 0) exit(1); // init readline if ((my_init_readline(rl_name)) != 0) { fprintf(stderr, "readline init fail.\n"); exit(1); } if ((ret = file_parse(fd, conn, abs_path)) == 0) { update_off_mtime(abs_path, fd); } //TODO update log-offset in pg_offset if (fd != 0) close(fd); my_close_readline(rl_name); #ifdef PGSQL PQfinish(conn); #endif // myfree((void *)&realcmd); myfree((void *)&User); myfree((void *)&Time); myfree((void *)&Host); myfree((void *)&PS); /* assert(buf == NULL); assert(realcmd == NULL); assert(rdlinecmd == NULL); */ assert(User == NULL); assert(Time == NULL); assert(Host == NULL); assert(PS == NULL); exit(ret); }