static GtkSourceLanguage * process_language_node (xmlTextReaderPtr reader, const gchar *filename) { xmlChar *version; xmlChar *tmp; xmlChar *untranslated_name; GtkSourceLanguage *lang; lang = g_object_new (GTK_SOURCE_TYPE_LANGUAGE, NULL); lang->priv->lang_file_name = g_strdup (filename); tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "translation-domain"); lang->priv->translation_domain = g_strdup ((gchar*) tmp); xmlFree (tmp); tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "hidden"); if (tmp != NULL) lang->priv->hidden = string_to_bool ((gchar*) tmp); else lang->priv->hidden = FALSE; xmlFree (tmp); tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "mimetypes"); if (tmp != NULL) g_hash_table_insert (lang->priv->properties, g_strdup ("mimetypes"), g_strdup ((char*) tmp)); xmlFree (tmp); tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "globs"); if (tmp != NULL) g_hash_table_insert (lang->priv->properties, g_strdup ("globs"), g_strdup ((char*) tmp)); xmlFree (tmp); tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "_name"); if (tmp == NULL) { tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "name"); if (tmp == NULL) { g_warning ("Impossible to get language name from file '%s'", filename); g_object_unref (lang); return NULL; } lang->priv->name = g_strdup ((char*) tmp); untranslated_name = tmp; } else { lang->priv->name = _gtk_source_language_translate_string (lang, (gchar*) tmp); untranslated_name = tmp; } tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "id"); if (tmp != NULL) { lang->priv->id = g_ascii_strdown ((gchar*) tmp, -1); } else { lang->priv->id = g_ascii_strdown ((gchar*) untranslated_name, -1); } xmlFree (tmp); xmlFree (untranslated_name); tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "_section"); if (tmp == NULL) { tmp = xmlTextReaderGetAttribute (reader, BAD_CAST "section"); if (tmp == NULL) lang->priv->section = g_strdup (DEFAULT_SECTION); else lang->priv->section = g_strdup ((gchar *) tmp); xmlFree (tmp); } else { lang->priv->section = _gtk_source_language_translate_string (lang, (gchar*) tmp); xmlFree (tmp); } version = xmlTextReaderGetAttribute (reader, BAD_CAST "version"); if (version == NULL) { g_warning ("Impossible to get version number from file '%s'", filename); g_object_unref (lang); return NULL; } if (xmlStrcmp (version , BAD_CAST "1.0") == 0) { lang->priv->version = GTK_SOURCE_LANGUAGE_VERSION_1_0; } else if (xmlStrcmp (version, BAD_CAST "2.0") == 0) { lang->priv->version = GTK_SOURCE_LANGUAGE_VERSION_2_0; } else { g_warning ("Unsupported language spec version '%s' in file '%s'", (gchar*) version, filename); xmlFree (version); g_object_unref (lang); return NULL; } xmlFree (version); if (lang->priv->version == GTK_SOURCE_LANGUAGE_VERSION_2_0) process_properties (reader, lang); return lang; }
static void parse_style (ParserState *parser_state) { gchar *id; xmlChar *name, *map_to; xmlChar *tmp; gchar *lang_id = NULL; g_return_if_fail (parser_state->error == NULL); tmp = xmlTextReaderGetAttribute (parser_state->reader, BAD_CAST "id"); if (id_is_decorated ((gchar*) tmp, NULL)) id = g_strdup ((gchar*) tmp); else id = decorate_id (parser_state, (gchar*) tmp); xmlFree (tmp); name = xmlTextReaderGetAttribute (parser_state->reader, BAD_CAST "_name"); if (name != NULL) { gchar *tmp2 = _gtk_source_language_translate_string (parser_state->language, (gchar*) name); tmp = xmlStrdup (BAD_CAST tmp2); xmlFree (name); name = tmp; g_free (tmp2); } else { name = xmlTextReaderGetAttribute (parser_state->reader, BAD_CAST "name"); } map_to = xmlTextReaderGetAttribute (parser_state->reader, BAD_CAST "map-to"); if (map_to != NULL && !id_is_decorated ((gchar*) map_to, &lang_id)) { g_set_error (&parser_state->error, PARSER_ERROR, PARSER_ERROR_MALFORMED_MAP_TO, "the map-to attribute '%s' for the style '%s' lacks the prefix", map_to, id); } if (parser_state->error == NULL && lang_id != NULL && lang_id[0] == 0) { g_free (lang_id); lang_id = NULL; } if (parser_state->error == NULL && lang_id != NULL && !lang_id_is_already_loaded (parser_state, lang_id)) { parse_language_with_id (parser_state, lang_id); } DEBUG (g_message ("style %s (%s) to be mapped to '%s'", name, id, map_to ? (char*) map_to : "(null)")); if (map_to != NULL && g_hash_table_lookup (parser_state->styles_mapping, map_to) == NULL) { g_warning ("in file %s: style '%s' not defined", parser_state->filename, map_to); } if (parser_state->error == NULL) { GtkSourceStyleInfo *info; /* Remember the style name only if the style has been defined in * the lang file we are parsing */ if (g_str_has_prefix (id, parser_state->language_decoration)) info = _gtk_source_style_info_new ((gchar *) name, (gchar *) map_to); else info = _gtk_source_style_info_new (NULL, (gchar *) map_to); g_hash_table_insert (parser_state->styles_mapping, g_strdup (id), info); } g_free (lang_id); g_free (id); xmlFree (name); xmlFree (map_to); }
static void parseTag (GtkSourceLanguage *language, xmlNodePtr cur, GtkSourceContextData *ctx_data) { xmlChar *name; xmlChar *style; xmlChar *id; name = xmlGetProp (cur, BAD_CAST "_name"); if (name == NULL) { name = xmlGetProp (cur, BAD_CAST "name"); id = xmlStrdup (name); } else { gchar *tmp1 = _gtk_source_language_translate_string (language, (gchar*) name); xmlChar *tmp2 = xmlStrdup (BAD_CAST tmp1); id = name; name = tmp2; g_free (tmp1); } if (name == NULL) { return; } style = xmlGetProp (cur, BAD_CAST "style"); if (!xmlStrcmp (cur->name, (const xmlChar*) "line-comment")) { parseLineComment (cur, (gchar*) id, style, ctx_data, language); } else if (!xmlStrcmp (cur->name, (const xmlChar*) "block-comment")) { parseBlockComment (cur, (gchar*) id, style, ctx_data, language); } else if (!xmlStrcmp (cur->name, (const xmlChar*) "string")) { parseString (cur, (gchar*) id, style, ctx_data, language); } else if (!xmlStrcmp (cur->name, (const xmlChar*) "keyword-list")) { parseKeywordList (cur, (gchar*) id, style, ctx_data, language); } else if (!xmlStrcmp (cur->name, (const xmlChar*) "pattern-item")) { parsePatternItem (cur, (gchar*) id, style, ctx_data, language); } else if (!xmlStrcmp (cur->name, (const xmlChar*) "syntax-item")) { parseSyntaxItem (cur, (gchar*) id, style, ctx_data, language); } else { g_print ("Unknown tag: %s\n", cur->name); } xmlFree (name); xmlFree (style); xmlFree (id); }