#include <vlc_common.h>
#include <vlc_plugin.h>
-#include "vlc_xml.h"
-#include "vlc_block.h"
-#include "vlc_stream.h"
+#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
/*****************************************************************************
* 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
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 * );
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
#endif
static XTag *xtag_first_child( XTag *, char * );
static XTag *xtag_next_child( XTag *, char * );
-static XTag *xtag_free( XTag * );
+static void xtag_free( XTag * );
+#if 0
static int xtag_snprint( char *, int, XTag * );
-
-/*****************************************************************************
- * 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);
-}
+#endif
/*****************************************************************************
* 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;
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 = (xml_reader_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 )
{
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;
}
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];
}
}
- ret = malloc( xi+1 );
+ ret = xmalloc( xi+1 );
strncpy( ret, s, xi );
ret[xi] = '\0';
parser->start = &s[xi];
goto err_free_name;
}
- attr = malloc( sizeof (*attr) );
+ attr = xmalloc( sizeof (*attr) );
attr->name = name;
attr->value = value;
return attr;
!strncmp( s, "<!DOCTYPE", 9 ) ) {
xi = xtag_index( parser, X_CLOSETAG );
if ( xi > 0 ) {
- parser->start = s = &s[xi+1];
+ parser->start = &s[xi+1];
xtag_skip_whitespace( parser );
return xtag_parse_tag( 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;
}
strncpy( pcdata, parser->start, s - parser->start );
pcdata[s - parser->start]='\0';
- parser->start = s = &s[3];
+ parser->start = &s[3];
tag->name = NULL;
tag->pcdata = pcdata;
tag->parent = parser->current_tag;
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;
return tag;
}
-static XTag *xtag_free( XTag *xtag )
+static void xtag_free( XTag *xtag )
{
XList *l;
XAttribute *attr;
XTag *child;
if( !xtag )
- return NULL;
+ return;
free( xtag->name );
free( xtag->pcdata );
xlist_free( xtag->children );
free( xtag );
-
- return NULL;
}
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;
return NULL;
}
+#if 0
/*
* This snprints function takes a variable list of char *, the last of
* which must be NULL, and prints each in turn to buf.
return written;
}
+#endif