]> git.sesse.net Git - vlc/blobdiff - modules/misc/xml/xtag.c
xtag: don't pretend to support DTD and catalogs
[vlc] / modules / misc / xml / xtag.c
index 957bd597a477ab56a3dc85e4ddb98de1b08877eb..955037cb5e0c85bf209862893633f9dddfe53ce5 100644 (file)
 #include <vlc_xml.h>
 #include <vlc_block.h>
 #include <vlc_stream.h>
+#include <vlc_memory.h>
 
 #include <ctype.h>
 #include <stdarg.h>
 
-#include <assert.h>
-
 #undef XTAG_DEBUG
 
 typedef struct _XList
@@ -84,13 +83,13 @@ typedef struct _XTagParser
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
-static int  Open ( vlc_object_t * );
-static void Close( vlc_object_t * );
+static int ReaderOpen( vlc_object_t * );
+static void ReaderClose( vlc_object_t * );
 
 vlc_module_begin ()
     set_description( N_("Simple XML Parser") )
-    set_capability( "xml", 5 )
-    set_callbacks( Open, Close )
+    set_capability( "xml reader", 5 )
+    set_callbacks( ReaderOpen, ReaderClose )
 vlc_module_end ()
 
 struct xml_reader_sys_t
@@ -101,8 +100,6 @@ struct xml_reader_sys_t
     bool b_endtag;
 };
 
-static xml_reader_t *ReaderCreate( xml_t *, stream_t * );
-static void ReaderDelete( xml_reader_t * );
 static int ReaderRead( xml_reader_t * );
 static int ReaderNodeType( xml_reader_t * );
 static char *ReaderName( xml_reader_t * );
@@ -111,9 +108,6 @@ static int ReaderNextAttr( xml_reader_t * );
 
 static int ReaderUseDTD ( xml_reader_t *, bool );
 
-static void CatalogLoad( xml_t *, const char * );
-static void CatalogAdd( xml_t *, const char *, const char *, const char * );
-
 static XTag *xtag_new_parse( const char *, int );
 static char *xtag_get_name( XTag * );
 #if 0
@@ -127,105 +121,56 @@ static void  xtag_free( XTag * );
 static int xtag_snprint( char *, int, XTag * );
 #endif
 
-/*****************************************************************************
- * Module initialization
- *****************************************************************************/
-static int Open( vlc_object_t *p_this )
-{
-    xml_t *p_xml = (xml_t *)p_this;
-
-    p_xml->pf_reader_create = ReaderCreate;
-    p_xml->pf_reader_delete = ReaderDelete;
-
-    p_xml->pf_catalog_load = CatalogLoad;
-    p_xml->pf_catalog_add  = CatalogAdd;
-
-    return VLC_SUCCESS;
-}
-
-/*****************************************************************************
- * Module deinitialization
- *****************************************************************************/
-static void Close( vlc_object_t *p_this )
-{
-    VLC_UNUSED(p_this);
-    return;
-}
-
-/*****************************************************************************
- * Catalogue functions
- *****************************************************************************/
-static void CatalogLoad( xml_t *p_xml, const char *psz_filename )
-{
-    VLC_UNUSED(psz_filename);
-    msg_Dbg( p_xml, "catalog support not implemented" );
-}
-
-static void CatalogAdd( xml_t *p_xml, const char *psz_arg1,
-                          const char *psz_arg2, const char *psz_filename )
-{
-    VLC_UNUSED(p_xml); VLC_UNUSED(psz_arg1); VLC_UNUSED(psz_arg2);
-    VLC_UNUSED(psz_filename);
-}
-
 /*****************************************************************************
  * Reader functions
  *****************************************************************************/
-static xml_reader_t *ReaderCreate( xml_t *p_xml, stream_t *s )
+static int ReaderOpen( vlc_object_t *p_this )
 {
-    xml_reader_t *p_reader;
-    char *p_buffer, *p_new;
+    xml_reader_t *p_reader = (xml_reader_t *)p_this;
+    stream_t *s = p_reader->p_stream;
+    char *p_buffer;
     int i_size, i_pos = 0, i_buffer = 2048;
     XTag *p_root;
 
     /* Open and read file */
     p_buffer = malloc( i_buffer );
     if( p_buffer == NULL )
-        return NULL;
+        return VLC_ENOMEM;
 
     while( ( i_size = stream_Read( s, &p_buffer[i_pos], 2048 ) ) == 2048 )
     {
         i_pos += i_size;
         i_buffer += i_size;
-        p_new = realloc( p_buffer, i_buffer );
-        if( !p_new )
-        {
-            free( p_buffer );
-            return NULL;
-        }
-        p_buffer = p_new;
+        p_buffer = realloc_or_free( p_buffer, i_buffer );
+        if( !p_buffer )
+            return VLC_ENOMEM;
     }
     if( i_pos + i_size == 0 )
     {
-        msg_Dbg( p_xml, "empty XML" );
+        msg_Dbg( p_this, "empty XML" );
         free( p_buffer );
-        return NULL;
+        return VLC_ENOMEM;
     }
     p_buffer[ i_pos + i_size ] = '\0'; /* 0 terminated string */
 
     p_root = xtag_new_parse( p_buffer, i_buffer );
+    free( p_buffer );
     if( !p_root )
     {
-        msg_Warn( p_xml, "couldn't parse XML" );
-        free( p_buffer );
-        return NULL;
+        msg_Warn( p_this, "couldn't parse XML" );
+        return VLC_ENOMEM;
     }
 
-    free( p_buffer );
-    p_reader = malloc( sizeof(xml_reader_t) );
-    if( !p_reader )
-        return NULL;
     p_reader->p_sys = malloc( sizeof(xml_reader_sys_t) );
     if( !p_reader->p_sys )
     {
-        free( p_reader );
-        return NULL;
+        xtag_free( p_root );
+        return VLC_ENOMEM;
     }
     p_reader->p_sys->p_root = p_root;
     p_reader->p_sys->p_curtag = NULL;
     p_reader->p_sys->p_curattr = NULL;
     p_reader->p_sys->b_endtag = false;
-    p_reader->p_xml = p_xml;
 
     p_reader->pf_read = ReaderRead;
     p_reader->pf_node_type = ReaderNodeType;
@@ -234,14 +179,15 @@ static xml_reader_t *ReaderCreate( xml_t *p_xml, stream_t *s )
     p_reader->pf_next_attr = ReaderNextAttr;
     p_reader->pf_use_dtd = ReaderUseDTD;
 
-    return p_reader;
+    return VLC_SUCCESS;
 }
 
-static void ReaderDelete( xml_reader_t *p_reader )
+static void ReaderClose( vlc_object_t *p_this )
 {
+    xml_reader_t *p_reader = (vlc_object_t *)p_this;
+
     xtag_free( p_reader->p_sys->p_root );
     free( p_reader->p_sys );
-    free( p_reader );
 }
 
 static int ReaderUseDTD ( xml_reader_t *p_reader, bool b_use )
@@ -354,20 +300,19 @@ static XList *xlist_append( XList *list, void *data )
 {
     XList *l, *last;
 
-    l = (XList *)malloc( sizeof(XList) );
+    l = (XList *)xmalloc( sizeof(XList) );
     l->prev = l->next = NULL;
     l->data = data;
 
     if( !list )
         return l;
 
-    for( last = list; last; last = last->next )
-    {
-        if( !last->next )
-            break;
-    }
+    /* Find the last element */
+    last = list;
+    while( last->next )
+        last = last->next;
 
-    if( last ) last->next = l;
+    last->next = l;
     l->prev = last;
     return list;
 }
@@ -460,7 +405,7 @@ static char *xtag_slurp_to( XTagParser *parser, int good_end, int bad_end )
 
     if( xi > 0 && xtag_cin (s[xi], good_end) )
     {
-        ret = malloc( xi+1 );
+        ret = xmalloc( xi+1 );
         strncpy( ret, s, xi );
         ret[xi] = '\0';
         parser->start = &s[xi];
@@ -513,7 +458,7 @@ static char *xtag_slurp_quoted( XTagParser *parser )
         }
     }
 
-    ret = malloc( xi+1 );
+    ret = xmalloc( xi+1 );
     strncpy( ret, s, xi );
     ret[xi] = '\0';
     parser->start = &s[xi];
@@ -565,7 +510,7 @@ static XAttribute *xtag_parse_attribute( XTagParser *parser )
         goto err_free_name;
     }
 
-    attr = malloc( sizeof (*attr) );
+    attr = xmalloc( sizeof (*attr) );
     attr->name = name;
     attr->value = value;
     return attr;
@@ -639,7 +584,7 @@ static XTag *xtag_parse_tag( XTagParser *parser )
 
     if( (pcdata = xtag_slurp_to( parser, X_OPENTAG, X_NONE )) != NULL )
     {
-        tag = malloc( sizeof(*tag) );
+        tag = xmalloc( sizeof(*tag) );
         tag->name = NULL;
         tag->pcdata = pcdata;
         tag->parent = parser->current_tag;
@@ -693,7 +638,7 @@ static XTag *xtag_parse_tag( XTagParser *parser )
     fprintf (stderr, "<%s ...\n", name);
 #endif
 
-    tag = malloc( sizeof(*tag) );
+    tag = xmalloc( sizeof(*tag) );
     tag->name = name;
     tag->pcdata = NULL;
     tag->parent = parser->current_tag;
@@ -832,7 +777,7 @@ static XTag *xtag_new_parse( const char *s, int n )
             return tag;
         }
 
-        wrapper = malloc( sizeof(XTag) );
+        wrapper = xmalloc( sizeof(XTag) );
         wrapper->name = NULL;
         wrapper->pcdata = NULL;
         wrapper->parent = NULL;