[yum-cvs] yum-metadata-parser xml-parser.c,1.10,1.11
James Bowes
jbowes at linux.duke.edu
Sun Jun 3 15:37:06 UTC 2007
Update of /home/groups/yum/cvs/yum-metadata-parser
In directory login1.linux.duke.edu:/tmp/cvs-serv1292
Modified Files:
xml-parser.c
Log Message:
Extract out a common set of SAXContext members for the three file types, and
use them with primary.
Index: xml-parser.c
===================================================================
RCS file: /home/groups/yum/cvs/yum-metadata-parser/xml-parser.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- xml-parser.c 3 Jun 2007 15:36:24 -0000 1.10
+++ xml-parser.c 3 Jun 2007 15:37:04 -0000 1.11
@@ -50,6 +50,19 @@
return z;
}
+typedef struct {
+ xmlParserCtxt *xml_context;
+ GError **error;
+ CountFn count_fn;
+ PackageFn package_fn;
+ gpointer user_data;
+
+ Package *current_package;
+
+ gboolean want_text;
+ GString *text_buffer;
+} SAXContext;
+
typedef enum {
PRIMARY_PARSER_TOPLEVEL = 0,
PRIMARY_PARSER_PACKAGE,
@@ -58,19 +71,12 @@
} PrimarySAXContextState;
typedef struct {
- xmlParserCtxt *xml_context;
+ SAXContext sctx;
+
PrimarySAXContextState state;
- GError **error;
- CountFn count_fn;
- PackageFn package_fn;
- gpointer user_data;
- Package *current_package;
GSList **current_dep_list;
PackageFile *current_file;
-
- gboolean want_text;
- GString *text_buffer;
} PrimarySAXContext;
static void
@@ -78,15 +84,17 @@
const char *name,
const char **attrs)
{
+ SAXContext *sctx = &ctx->sctx;
+
if (!strcmp (name, "package")) {
- g_assert (ctx->current_package == NULL);
+ g_assert (sctx->current_package == NULL);
ctx->state = PRIMARY_PARSER_PACKAGE;
- ctx->current_package = package_new ();
+ sctx->current_package = package_new ();
}
- else if (ctx->count_fn && !strcmp (name, "metadata")) {
+ else if (sctx->count_fn && !strcmp (name, "metadata")) {
int i;
const char *attr;
const char *value;
@@ -96,8 +104,8 @@
value = attrs[++i];
if (!strcmp (attr, "packages")) {
- ctx->count_fn (string_to_guint32_with_default (value, 0),
- ctx->user_data);
+ sctx->count_fn (string_to_guint32_with_default (value, 0),
+ sctx->user_data);
break;
}
}
@@ -129,14 +137,16 @@
const char *name,
const char **attrs)
{
- Package *p = ctx->current_package;
+ SAXContext *sctx = &ctx->sctx;
+
+ Package *p = sctx->current_package;
int i;
const char *attr;
const char *value;
g_assert (p != NULL);
- ctx->want_text = TRUE;
+ sctx->want_text = TRUE;
if (!strcmp (name, "format")) {
ctx->state = PRIMARY_PARSER_FORMAT;
@@ -200,7 +210,9 @@
const char *name,
const char **attrs)
{
- Package *p = ctx->current_package;
+ SAXContext *sctx = &ctx->sctx;
+
+ Package *p = sctx->current_package;
int i;
const char *attr;
const char *value;
@@ -221,16 +233,16 @@
else if (!strcmp (name, "rpm:provides")) {
ctx->state = PRIMARY_PARSER_DEP;
- ctx->current_dep_list = &ctx->current_package->provides;
+ ctx->current_dep_list = &sctx->current_package->provides;
} else if (!strcmp (name, "rpm:requires")) {
ctx->state = PRIMARY_PARSER_DEP;
- ctx->current_dep_list = &ctx->current_package->requires;
+ ctx->current_dep_list = &sctx->current_package->requires;
} else if (!strcmp (name, "rpm:obsoletes")) {
ctx->state = PRIMARY_PARSER_DEP;
- ctx->current_dep_list = &ctx->current_package->obsoletes;
+ ctx->current_dep_list = &sctx->current_package->obsoletes;
} else if (!strcmp (name, "rpm:conflicts")) {
ctx->state = PRIMARY_PARSER_DEP;
- ctx->current_dep_list = &ctx->current_package->conflicts;
+ ctx->current_dep_list = &sctx->current_package->conflicts;
}
else if (!strcmp (name, "file")) {
@@ -252,6 +264,8 @@
const char *name,
const char **attrs)
{
+ SAXContext *sctx = &ctx->sctx;
+
const char *tmp_name = NULL;
const char *tmp_version = NULL;
const char *tmp_release = NULL;
@@ -288,7 +302,7 @@
}
if (!ignore) {
- GStringChunk *chunk = ctx->current_package->chunk;
+ GStringChunk *chunk = sctx->current_package->chunk;
dep = dependency_new ();
dep->name = g_string_chunk_insert (chunk, tmp_name);
@@ -312,9 +326,10 @@
primary_sax_start_element (void *data, const char *name, const char **attrs)
{
PrimarySAXContext *ctx = (PrimarySAXContext *) data;
+ SAXContext *sctx = &ctx->sctx;
- if (ctx->text_buffer->len)
- g_string_truncate (ctx->text_buffer, 0);
+ if (sctx->text_buffer->len)
+ g_string_truncate (sctx->text_buffer, 0);
switch (ctx->state) {
case PRIMARY_PARSER_TOPLEVEL:
@@ -338,89 +353,93 @@
static void
primary_parser_package_end (PrimarySAXContext *ctx, const char *name)
{
- Package *p = ctx->current_package;
+ SAXContext *sctx = &ctx->sctx;
+
+ Package *p = sctx->current_package;
g_assert (p != NULL);
if (!strcmp (name, "package")) {
- if (ctx->package_fn && !*ctx->error)
- ctx->package_fn (p, ctx->user_data);
+ if (sctx->package_fn && !*sctx->error)
+ sctx->package_fn (p, sctx->user_data);
package_free (p);
- ctx->current_package = NULL;
+ sctx->current_package = NULL;
- ctx->want_text = FALSE;
+ sctx->want_text = FALSE;
ctx->state = PRIMARY_PARSER_TOPLEVEL;
}
- else if (ctx->text_buffer->len == 0)
+ else if (sctx->text_buffer->len == 0)
/* Nothing interesting to do here */
return;
else if (!strcmp (name, "name"))
p->name = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
else if (!strcmp (name, "arch"))
p->arch = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
else if (!strcmp (name, "checksum"))
p->pkgId = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
else if (!strcmp (name, "summary"))
p->summary = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
else if (!strcmp (name, "description"))
p->description = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
else if (!strcmp (name, "packager"))
p->rpm_packager = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
else if (!strcmp (name, "url"))
p->url = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
}
static void
primary_parser_format_end (PrimarySAXContext *ctx, const char *name)
{
- Package *p = ctx->current_package;
+ SAXContext *sctx = &ctx->sctx;
+
+ Package *p = sctx->current_package;
g_assert (p != NULL);
if (!strcmp (name, "rpm:license"))
p->rpm_license = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
if (!strcmp (name, "rpm:vendor"))
p->rpm_vendor = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
if (!strcmp (name, "rpm:group"))
p->rpm_group = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
if (!strcmp (name, "rpm:buildhost"))
p->rpm_buildhost = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
if (!strcmp (name, "rpm:sourcerpm"))
p->rpm_sourcerpm = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
else if (!strcmp (name, "file")) {
PackageFile *file = ctx->current_file != NULL ?
ctx->current_file : package_file_new ();
file->name = g_string_chunk_insert_len (p->chunk,
- ctx->text_buffer->str,
- ctx->text_buffer->len);
+ sctx->text_buffer->str,
+ sctx->text_buffer->len);
if (!file->type)
file->type = g_string_chunk_insert_const (p->chunk, "file");
@@ -434,7 +453,9 @@
static void
primary_parser_dep_end (PrimarySAXContext *ctx, const char *name)
{
- g_assert (ctx->current_package != NULL);
+ SAXContext *sctx = &ctx->sctx;
+
+ g_assert (sctx->current_package != NULL);
if (strcmp (name, "rpm:entry"))
ctx->state = PRIMARY_PARSER_FORMAT;
@@ -444,6 +465,7 @@
primary_sax_end_element (void *data, const char *name)
{
PrimarySAXContext *ctx = (PrimarySAXContext *) data;
+ SAXContext *sctx = &ctx->sctx;
switch (ctx->state) {
case PRIMARY_PARSER_PACKAGE:
@@ -459,16 +481,17 @@
break;
}
- g_string_truncate (ctx->text_buffer, 0);
+ g_string_truncate (sctx->text_buffer, 0);
}
static void
primary_sax_characters (void *data, const char *ch, int len)
{
PrimarySAXContext *ctx = (PrimarySAXContext *) data;
+ SAXContext *sctx = &ctx->sctx;
- if (ctx->want_text)
- g_string_append_len (ctx->text_buffer, ch, len);
+ if (sctx->want_text)
+ g_string_append_len (sctx->text_buffer, ch, len);
}
static void
@@ -489,14 +512,14 @@
static void
primary_sax_error (void *data, const char *msg, ...)
{
- PrimarySAXContext *ctx = (PrimarySAXContext *) data;
+ SAXContext *sctx = (SAXContext *) data;
va_list args;
char *tmp;
va_start (args, msg);
tmp = g_strdup_vprintf (msg, args);
- g_set_error (ctx->error, YUM_PARSER_ERROR, YUM_PARSER_ERROR,
+ g_set_error (sctx->error, YUM_PARSER_ERROR, YUM_PARSER_ERROR,
"Parsing primary.xml error: %s", tmp);
g_free (tmp);
@@ -538,28 +561,29 @@
GError **err)
{
PrimarySAXContext ctx;
+ SAXContext sctx = ctx.sctx;
int rc;
ctx.state = PRIMARY_PARSER_TOPLEVEL;
- ctx.error = err;
- ctx.count_fn = count_callback;
- ctx.package_fn = package_callback;
- ctx.user_data = user_data;
- ctx.current_package = NULL;
+ sctx.error = err;
+ sctx.count_fn = count_callback;
+ sctx.package_fn = package_callback;
+ sctx.user_data = user_data;
+ sctx.current_package = NULL;
ctx.current_dep_list = NULL;
ctx.current_file = NULL;
- ctx.want_text = FALSE;
- ctx.text_buffer = g_string_sized_new (PACKAGE_FIELD_SIZE);
+ sctx.want_text = FALSE;
+ sctx.text_buffer = g_string_sized_new (PACKAGE_FIELD_SIZE);
xmlSubstituteEntitiesDefault (1);
rc = xmlSAXUserParseFile (&primary_sax_handler, &ctx, filename);
- if (ctx.current_package) {
+ if (sctx.current_package) {
g_warning ("Incomplete package lost");
- package_free (ctx.current_package);
+ package_free (sctx.current_package);
}
- g_string_free (ctx.text_buffer, TRUE);
+ g_string_free (sctx.text_buffer, TRUE);
}
/*****************************************************************************/
More information about the Yum-cvs-commits
mailing list