[cvs-annodex] commit (/annodex): libannodex/trunk/src/libannodex/xtag.c

conrad nobody at lists.annodex.net
Tue Feb 1 11:00:46 EST 2005


Update of /annodex (new revision 799)

Modified files:
   libannodex/trunk/src/libannodex/xtag.c

Log Message:
add support to xtag to parse xml containing comments (ticket: 1)
	+ XML comments <!-- .... --> are ignored, parsing continues


Modified: libannodex/trunk/src/libannodex/xtag.c
===================================================================
--- libannodex/trunk/src/libannodex/xtag.c	2005-01-31 22:27:48 UTC (rev 798)
+++ libannodex/trunk/src/libannodex/xtag.c	2005-02-01 00:00:45 UTC (rev 799)
@@ -105,6 +105,7 @@
 #define X_SQUOTE      1<<4
 #define X_EQUAL       1<<5
 #define X_SLASH       1<<6
+#define X_DASH        1<<7
 
 static int
 xtag_cin (char c, int char_class)
@@ -130,6 +131,9 @@
   if (char_class & X_SLASH)
     if (c == '/') return TRUE;
 
+  if (char_class & X_DASH)
+    if (c == '-') return TRUE;
+
   return FALSE;
 }
 
@@ -174,27 +178,25 @@
   xtag_skip_over (parser, X_WHITESPACE);
 }
 
-#if 0
-static void
+static int
 xtag_skip_to (XTagParser * parser, int char_class)
 {
   char * s;
   int i;
 
-  if (!parser->valid) return;
+  if (!parser->valid) return FALSE;
 
   s = (char *)parser->start;
 
   for (i = 0; s[i] && s != parser->end; i++) {
     if (xtag_cin(s[i], char_class)) {
       parser->start = &s[i];
-      return;
+      return TRUE;
     }
   }
 
-  return;
+  return FALSE;
 }
-#endif
 
 static char *
 xtag_slurp_to (XTagParser * parser, int good_end, int bad_end)
@@ -220,7 +222,7 @@
 }
 
 static int
-xtag_assert_and_pass (XTagParser * parser, int char_class)
+xtag_pass (XTagParser * parser, int char_class, int assert)
 {
   char * s;
 
@@ -229,7 +231,7 @@
   s = parser->start;
 
   if (!xtag_cin (s[0], char_class)) {
-    parser->valid = FALSE;
+    if (assert) parser->valid = FALSE;
     return FALSE;
   }
 
@@ -238,6 +240,18 @@
   return TRUE;
 }
 
+static int
+xtag_check_and_pass (XTagParser * parser, int char_class)
+{
+  return xtag_pass (parser, char_class, FALSE);
+}
+
+static int
+xtag_assert_and_pass (XTagParser * parser, int char_class)
+{
+  return xtag_pass (parser, char_class, TRUE);
+}
+
 static char *
 xtag_slurp_quoted (XTagParser * parser)
 {
@@ -365,6 +379,19 @@
   printf ("<%s ...\n", name);
 #endif
 
+  if (!strcmp (name, "!--")) {
+#ifdef DEBUG
+    printf ("xtag: found comment\n");
+#endif
+    while (xtag_skip_to (parser, X_DASH)) {
+      if (xtag_check_and_pass (parser, X_DASH) &&
+	  xtag_check_and_pass (parser, X_CLOSETAG))
+	return xtag_parse_tag (parser);
+    }
+    /* Unterminated comment */
+    return NULL;
+  }
+
   tag = anx_malloc (sizeof (*tag));
   tag->name = name;
   tag->pcdata = NULL;


-- 
conrad



More information about the cvs-annodex mailing list