[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