X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Fxml%2Fxtag.c;h=487ce513292183f2994b55f475e6937b5566ebeb;hb=c328515343633f4f85e40cd88d7ffd977c951c1b;hp=eb0ab2e95c89856496fa355b2688e30549281e3d;hpb=f0ffeb173ab80dba4bba7d2353b5b1a24a3a0ffe;p=vlc diff --git a/modules/misc/xml/xtag.c b/modules/misc/xml/xtag.c index eb0ab2e95c..487ce51329 100644 --- a/modules/misc/xml/xtag.c +++ b/modules/misc/xml/xtag.c @@ -26,18 +26,20 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include -#include "vlc_xml.h" -#include "vlc_block.h" -#include "vlc_stream.h" +#include +#include +#include +#include #include -#include #include -#include -#include #undef XTAG_DEBUG @@ -81,135 +83,94 @@ 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( _("Simple XML Parser") ); - set_capability( "xml", 5 ); - set_callbacks( Open, Close ); -vlc_module_end(); +vlc_module_begin () + set_description( N_("Simple XML Parser") ) + set_capability( "xml reader", 5 ) + set_callbacks( ReaderOpen, ReaderClose ) +vlc_module_end () struct xml_reader_sys_t { XTag *p_root; /* Root tag */ XTag *p_curtag; /* Current tag */ XList *p_curattr; /* Current attribute */ - vlc_bool_t b_endtag; + 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 char *ReaderValue( xml_reader_t * ); static int ReaderNextAttr( xml_reader_t * ); -static int ReaderUseDTD ( xml_reader_t *, vlc_bool_t ); - -static void CatalogLoad( xml_t *, const char * ); -static void CatalogAdd( xml_t *, const char *, const char *, const char * ); +static int ReaderUseDTD ( xml_reader_t *, bool ); static XTag *xtag_new_parse( const char *, int ); static char *xtag_get_name( XTag * ); +#if 0 static char *xtag_get_pcdata( XTag * ); static char *xtag_get_attribute( XTag *, char * ); +#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 ) -{ - return; -} - -/***************************************************************************** - * Catalogue functions - *****************************************************************************/ -static void CatalogLoad( xml_t *p_xml, const char *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 ) -{ -} +#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 ) { - msg_Err( p_xml, "out of memory" ); - return NULL; - } + if( p_buffer == 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) { - msg_Err( p_xml, "out of memory" ); - free( p_buffer ); - return NULL; - } - p_buffer = p_new; + p_buffer = realloc_or_free( p_buffer, i_buffer ); + if( !p_buffer ) + return VLC_ENOMEM; } - p_buffer[ i_pos + i_size ] = 0; /* 0 terminated string */ - if( i_pos + i_size == 0 ) { - msg_Dbg( p_xml, "empty XML" ); + msg_Dbg( p_this, "empty XML" ); free( p_buffer ); - return 0; + 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 0; + msg_Warn( p_this, "couldn't parse XML" ); + return VLC_ENOMEM; } - p_reader = malloc( sizeof(xml_reader_t) ); p_reader->p_sys = malloc( sizeof(xml_reader_sys_t) ); + if( !p_reader->p_sys ) + { + 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 = VLC_FALSE; - p_reader->p_xml = p_xml; + p_reader->p_sys->b_endtag = false; p_reader->pf_read = ReaderRead; p_reader->pf_node_type = ReaderNodeType; @@ -218,18 +179,20 @@ 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 = (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, vlc_bool_t b_use ) +static int ReaderUseDTD ( xml_reader_t *p_reader, bool b_use ) { + VLC_UNUSED(p_reader); VLC_UNUSED(b_use); return VLC_EGENERIC; } @@ -243,24 +206,24 @@ static int ReaderRead( xml_reader_t *p_reader ) return 1; } - while( 1 ) + while( true ) { if( (p_child = xtag_next_child( p_reader->p_sys->p_curtag, 0 )) ) { p_reader->p_sys->p_curtag = p_child; - p_reader->p_sys->p_curattr = 0; - p_reader->p_sys->b_endtag = VLC_FALSE; + p_reader->p_sys->p_curattr = NULL; + p_reader->p_sys->b_endtag = false; return 1; } if( p_reader->p_sys->p_curtag->name && /* no end tag for pcdata */ !p_reader->p_sys->b_endtag ) { - p_reader->p_sys->b_endtag = VLC_TRUE; + p_reader->p_sys->b_endtag = true; return 1; } - p_reader->p_sys->b_endtag = VLC_FALSE; + p_reader->p_sys->b_endtag = false; if( !p_reader->p_sys->p_curtag->parent ) return 0; p_reader->p_sys->p_curtag = p_reader->p_sys->p_curtag->parent; } @@ -270,10 +233,12 @@ static int ReaderRead( xml_reader_t *p_reader ) static int ReaderNodeType( xml_reader_t *p_reader ) { - if( p_reader->p_sys->p_curtag->name && - p_reader->p_sys->b_endtag ) return XML_READER_ENDELEM; - if( p_reader->p_sys->p_curtag->name ) return XML_READER_STARTELEM; - if( p_reader->p_sys->p_curtag->pcdata ) return XML_READER_TEXT; + if( p_reader->p_sys->p_curtag->name && p_reader->p_sys->b_endtag ) + return XML_READER_ENDELEM; + if( p_reader->p_sys->p_curtag->name ) + return XML_READER_STARTELEM; + if( p_reader->p_sys->p_curtag->pcdata ) + return XML_READER_TEXT; return XML_READER_NONE; } @@ -285,14 +250,13 @@ static char *ReaderName( xml_reader_t *p_reader ) { psz_name = xtag_get_name( p_reader->p_sys->p_curtag ); #ifdef XTAG_DEBUG - printf( "TAG: %s\n", psz_name ); + fprintf( stderr, "TAG: %s\n", psz_name ); #endif } else psz_name = ((XAttribute *)p_reader->p_sys->p_curattr->data)->name; - if( psz_name ) return strdup( psz_name ); - else return 0; + return psz_name ? strdup( psz_name ) : NULL; } static char *ReaderValue( xml_reader_t *p_reader ) @@ -301,22 +265,21 @@ static char *ReaderValue( xml_reader_t *p_reader ) if( p_reader->p_sys->p_curtag->pcdata ) { #ifdef XTAG_DEBUG - printf( "%s\n", p_reader->p_sys->p_curtag->pcdata ); + fprintf( stderr, "%s\n", p_reader->p_sys->p_curtag->pcdata ); #endif return strdup( p_reader->p_sys->p_curtag->pcdata ); } - if( !p_reader->p_sys->p_curattr ) return 0; + if( !p_reader->p_sys->p_curattr ) return NULL; #ifdef XTAG_DEBUG - printf( "%s=%s\n", ((XAttribute *)p_reader->p_sys->p_curattr->data)->name, + fprintf( stderr, "%s=%s\n", ((XAttribute *)p_reader->p_sys->p_curattr->data)->name, ((XAttribute *)p_reader->p_sys->p_curattr->data)->value ); #endif psz_name = ((XAttribute *)p_reader->p_sys->p_curattr->data)->value; - if( psz_name ) return strdup( psz_name ); - else return 0; + return psz_name ? strdup( psz_name ) : NULL; } static int ReaderNextAttr( xml_reader_t *p_reader ) @@ -325,9 +288,8 @@ static int ReaderNextAttr( xml_reader_t *p_reader ) p_reader->p_sys->p_curattr = p_reader->p_sys->p_curtag->attributes; else if( p_reader->p_sys->p_curattr ) p_reader->p_sys->p_curattr = p_reader->p_sys->p_curattr->next; - - if( p_reader->p_sys->p_curattr ) return VLC_SUCCESS; - else return VLC_EGENERIC; + + return p_reader->p_sys->p_curattr ? VLC_SUCCESS : VLC_EGENERIC; } /***************************************************************************** @@ -338,17 +300,20 @@ 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 == NULL ) return l; + if( !list ) + return l; - for( last = list; last; last = last->next ) - if( last->next == NULL ) break; + /* Find the last element */ + last = list; + while( last->next ) + last = last->next; - if( last ) last->next = l; - l->prev = last; + last->next = l; + l->prev = last; return list; } @@ -378,18 +343,18 @@ static void xlist_free( XList *list ) static int xtag_cin( char c, int char_class ) { - if( char_class & X_WHITESPACE ) if( isspace(c) ) return VLC_TRUE; - if( char_class & X_OPENTAG ) if( c == '<' ) return VLC_TRUE; - if( char_class & X_CLOSETAG ) if( c == '>' ) return VLC_TRUE; - if( char_class & X_DQUOTE ) if( c == '"' ) return VLC_TRUE; - if( char_class & X_SQUOTE ) if( c == '\'' ) return VLC_TRUE; - if( char_class & X_EQUAL ) if( c == '=' ) return VLC_TRUE; - if( char_class & X_SLASH ) if( c == '/' ) return VLC_TRUE; - if( char_class & X_QMARK ) if( c == '?' ) return VLC_TRUE; - if( char_class & X_DASH ) if( c == '-' ) return VLC_TRUE; - if( char_class & X_EMARK ) if( c == '!' ) return VLC_TRUE; - - return VLC_FALSE; + if( char_class & X_WHITESPACE ) if( isspace(c) ) return true; + if( char_class & X_OPENTAG ) if( c == '<' ) return true; + if( char_class & X_CLOSETAG ) if( c == '>' ) return true; + if( char_class & X_DQUOTE ) if( c == '"' ) return true; + if( char_class & X_SQUOTE ) if( c == '\'' ) return true; + if( char_class & X_EQUAL ) if( c == '=' ) return true; + if( char_class & X_SLASH ) if( c == '/' ) return true; + if( char_class & X_QMARK ) if( c == '?' ) return true; + if( char_class & X_DASH ) if( c == '-' ) return true; + if( char_class & X_EMARK ) if( c == '!' ) return true; + + return false; } static int xtag_index( XTagParser *parser, int char_class ) @@ -440,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) * sizeof(char) ); + ret = xmalloc( xi+1 ); strncpy( ret, s, xi ); ret[xi] = '\0'; parser->start = &s[xi]; @@ -454,17 +419,17 @@ static int xtag_assert_and_pass( XTagParser *parser, int char_class ) { char *s = parser->start; - if( !parser->valid ) return VLC_FALSE; + if( !parser->valid ) return false; if( !xtag_cin( s[0], char_class ) ) { - parser->valid = VLC_FALSE; - return VLC_FALSE; + parser->valid = false; + return false; } parser->start = &s[1]; - return VLC_TRUE; + return true; } static char *xtag_slurp_quoted( XTagParser *parser ) @@ -493,12 +458,16 @@ static char *xtag_slurp_quoted( XTagParser *parser ) } } - ret = malloc( (xi+1) * sizeof(char) ); + ret = xmalloc( xi+1 ); strncpy( ret, s, xi ); ret[xi] = '\0'; parser->start = &s[xi]; - if( !xtag_assert_and_pass( parser, quote ) ) return NULL; + if( !xtag_assert_and_pass( parser, quote ) ) + { + free( ret ); + return NULL; + } return ret; } @@ -509,12 +478,14 @@ static XAttribute *xtag_parse_attribute( XTagParser *parser ) char *name, *value; char *s; - if( !parser->valid ) return NULL; + if( !parser->valid ) + return NULL; xtag_skip_whitespace( parser ); name = xtag_slurp_to( parser, X_WHITESPACE|X_EQUAL, X_SLASH|X_CLOSETAG ); - if( name == NULL ) return NULL; + if( !name ) + return NULL; xtag_skip_whitespace( parser ); s = parser->start; @@ -522,7 +493,7 @@ static XAttribute *xtag_parse_attribute( XTagParser *parser ) if( !xtag_assert_and_pass( parser, X_EQUAL ) ) { #ifdef XTAG_DEBUG - printf( "xtag: attr failed EQUAL on <%s>\n", name ); + fprintf( stderr, "xtag: attr failed EQUAL on <%s>\n", name ); #endif goto err_free_name; } @@ -534,19 +505,19 @@ static XAttribute *xtag_parse_attribute( XTagParser *parser ) if( value == NULL ) { #ifdef XTAG_DEBUG - printf ("Got NULL quoted attribute value\n"); + fprintf (stderr, "Got NULL quoted attribute value\n"); #endif goto err_free_name; } - attr = malloc( sizeof (*attr) ); + attr = xmalloc( sizeof (*attr) ); attr->name = name; attr->value = value; return attr; err_free_name: free (name); - parser->valid = VLC_FALSE; + parser->valid = false; return NULL; } @@ -557,7 +528,7 @@ static XTag *xtag_parse_tag( XTagParser *parser ) char *name; char *pcdata; char *s; - int xi; + int xi; if( !parser->valid ) return NULL; @@ -565,7 +536,7 @@ static XTag *xtag_parse_tag( XTagParser *parser ) /* if this starts a comment tag, skip until end */ if( (parser->end - parser->start) > 7 && - xtag_cin( s[0], X_OPENTAG ) && xtag_cin( s[1], X_EMARK ) && + xtag_cin( s[0], X_OPENTAG ) && xtag_cin( s[1], X_EMARK ) && xtag_cin( s[2], X_DASH ) && xtag_cin( s[3], X_DASH ) ) { parser->start = s = &s[4]; @@ -584,7 +555,7 @@ static XTag *xtag_parse_tag( XTagParser *parser ) /* ignore processing instructions '' */ if( (parser->end - parser->start) > 4 && - xtag_cin( s[0], X_OPENTAG ) && xtag_cin( s[1], X_QMARK ) ) + xtag_cin( s[0], X_OPENTAG ) && xtag_cin( s[1], X_QMARK ) ) { parser->start = s = &s[2]; while ((xi = xtag_index( parser, X_QMARK )) >= 0) { @@ -599,10 +570,10 @@ static XTag *xtag_parse_tag( XTagParser *parser ) /* ignore doctype '' */ if ( (parser->end - parser->start) > 8 && - !strncmp( s, " 0 ) { - parser->start = s = &s[xi+1]; + parser->start = &s[xi+1]; xtag_skip_whitespace( parser ); return xtag_parse_tag( parser ); } @@ -613,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; @@ -629,16 +600,20 @@ static XTag *xtag_parse_tag( XTagParser *parser ) return NULL; /* parse CDATA content */ - if ( (parser->end - parser->start) > 8 && - !strncmp( s, "end - parser->start) > 8 && + !strncmp( s, "start = s = &s[9]; while (parser->end - s > 2) { if (strncmp( s, "]]>", 3 ) == 0) { if ( !(tag = malloc( sizeof(*tag))) ) return NULL; - if ( !(pcdata = malloc( sizeof(char)*(s - parser->start + 1))) ) return NULL; + if ( !(pcdata = malloc( s - parser->start + 1)) ) + { + free( tag ); + return NULL; + } 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; @@ -660,10 +635,10 @@ static XTag *xtag_parse_tag( XTagParser *parser ) if( name == NULL ) return NULL; #ifdef XTAG_DEBUG - printf ("<%s ...\n", name); + 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; @@ -707,9 +682,9 @@ static XTag *xtag_parse_tag( XTagParser *parser ) if( strcmp( name, tag->name ) ) { #ifdef XTAG_DEBUG - printf ("got %s expected %s\n", name, tag->name); + fprintf (stderr, "got %s expected %s\n", name, tag->name); #endif - parser->valid = VLC_FALSE; + parser->valid = false; } free( name ); } @@ -728,23 +703,24 @@ static XTag *xtag_parse_tag( XTagParser *parser ) return tag; } -static XTag *xtag_free( XTag *xtag ) +static void xtag_free( XTag *xtag ) { XList *l; XAttribute *attr; XTag *child; - if( xtag == NULL ) return NULL; + if( !xtag ) + return; - if( xtag->name ) free( xtag->name ); - if( xtag->pcdata ) free( xtag->pcdata ); + free( xtag->name ); + free( xtag->pcdata ); for( l = xtag->attributes; l; l = l->next ) { if( (attr = (XAttribute *)l->data) != NULL ) { - if( attr->name ) free( attr->name ); - if( attr->value ) free( attr->value ); + free( attr->name ); + free( attr->value ); free( attr ); } } @@ -758,8 +734,6 @@ static XTag *xtag_free( XTag *xtag ) xlist_free( xtag->children ); free( xtag ); - - return NULL; } static XTag *xtag_new_parse( const char *s, int n ) @@ -767,7 +741,7 @@ static XTag *xtag_new_parse( const char *s, int n ) XTagParser parser; XTag *tag, *ttag, *wrapper; - parser.valid = VLC_TRUE; + parser.valid = true; parser.current_tag = NULL; parser.start = (char *)s; @@ -775,8 +749,8 @@ static XTag *xtag_new_parse( const char *s, int n ) else if( n == 0 ) { #ifdef XTAG_DEBUG - printf ("empty buffer"); -#endif + fprintf (stderr, "empty buffer\n"); +#endif return NULL; } else parser.end = (char *)&s[n]; @@ -789,7 +763,7 @@ static XTag *xtag_new_parse( const char *s, int n ) if( !parser.valid ) { #ifdef XTAG_DEBUG - printf ("invalid file"); + fprintf (stderr, "invalid file\n"); #endif xtag_free( tag ); return NULL; @@ -803,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; @@ -835,6 +809,7 @@ static char *xtag_get_name( XTag *xtag ) return xtag ? xtag->name : NULL; } +#if 0 static char *xtag_get_pcdata( XTag *xtag ) { XList *l; @@ -871,6 +846,7 @@ static char *xtag_get_attribute( XTag *xtag, char *attribute ) return NULL; } +#endif static XTag *xtag_first_child( XTag *xtag, char *name ) { @@ -936,6 +912,7 @@ static XTag *xtag_next_child( XTag *xtag, char *name ) 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. @@ -949,7 +926,7 @@ static int xtag_snprints( char *buf, int n, ... ) int len, to_copy, total = 0; va_start( ap, n ); - + for( s = va_arg( ap, char * ); s; s = va_arg( ap, char *) ) { len = strlen (s); @@ -1003,7 +980,7 @@ static int xtag_snprint( char *buf, int n, XTag *xtag ) for( l = xtag->attributes; l; l = l->next ) { attr = (XAttribute *)l->data; - + nn = xtag_snprints( buf, n, " ", attr->name, "=\"", attr->value, "\"", NULL); FORWARD( nn ); @@ -1037,3 +1014,5 @@ static int xtag_snprint( char *buf, int n, XTag *xtag ) return written; } +#endif +