Mercurial > mplayer.hg
comparison asxparser.c @ 4820:ab6ceeef3904
Bug fix in entry parsing.
Support for param entry (to add your config options)
author | albeu |
---|---|
date | Sat, 23 Feb 2002 21:11:01 +0000 |
parents | 35b412015c39 |
children | 35f19046f809 |
comparison
equal
deleted
inserted
replaced
4819:d8ab591ecf84 | 4820:ab6ceeef3904 |
---|---|
6 #include <unistd.h> | 6 #include <unistd.h> |
7 | 7 |
8 #include "playtreeparser.h" | 8 #include "playtreeparser.h" |
9 #include "asxparser.h" | 9 #include "asxparser.h" |
10 #include "mp_msg.h" | 10 #include "mp_msg.h" |
11 #include "cfgparser.h" | |
12 | |
13 extern m_config_t* mconfig; | |
11 | 14 |
12 ////// List utils | 15 ////// List utils |
13 | 16 |
14 typedef void (*ASX_FreeFunc)(void* arg); | 17 typedef void (*ASX_FreeFunc)(void* arg); |
15 | 18 |
231 char** _element,char** _body,char*** _attribs) { | 234 char** _element,char** _body,char*** _attribs) { |
232 char *ptr1,*ptr2, *ptr3, *ptr4; | 235 char *ptr1,*ptr2, *ptr3, *ptr4; |
233 char *attribs = NULL; | 236 char *attribs = NULL; |
234 char *element = NULL, *body = NULL, *ret = NULL, *buffer; | 237 char *element = NULL, *body = NULL, *ret = NULL, *buffer; |
235 int n_attrib = 0; | 238 int n_attrib = 0; |
236 int body_line = 0,attrib_line,ret_line; | 239 int body_line = 0,attrib_line,ret_line,in = 0; |
237 | 240 |
238 if(_buffer == NULL || _element == NULL || _body == NULL || _attribs == NULL) { | 241 if(_buffer == NULL || _element == NULL || _body == NULL || _attribs == NULL) { |
239 mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : asx_get_element called with invalid value",parser->line); | 242 mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : asx_get_element called with invalid value",parser->line); |
240 return -1; | 243 return -1; |
241 } | 244 } |
358 if(ptr3[0] == '\n') parser->line++; | 361 if(ptr3[0] == '\n') parser->line++; |
359 } | 362 } |
360 ptr4 = ptr3; | 363 ptr4 = ptr3; |
361 body_line = parser->line; | 364 body_line = parser->line; |
362 while(1) { // Find closing element | 365 while(1) { // Find closing element |
363 for( ; strncmp(ptr4,"</",2) != 0; ptr4++) { | 366 for( ; ptr4[0] != '<' ; ptr4++) { |
364 if(ptr4[0] == '\0') { | 367 if(ptr4[0] == '\0') { |
365 ptr4 = NULL; | 368 ptr4 = NULL; |
366 break; | 369 break; |
367 } | 370 } |
368 if(ptr4[0] == '\n') parser->line++; | 371 if(ptr4[0] == '\n') parser->line++; |
369 } | 372 } |
370 //ptr4 = strstr(ptr4,"</"); | 373 if(strncmp(ptr4,"<!--",4) == 0) { // Comments |
371 if(ptr4 == NULL || ptr4[2] == '\0') { | 374 for( ; strncmp(ptr4,"-->",3) != 0 ; ptr4++) { |
375 if(ptr4[0] == '\0') { | |
376 ptr4 = NULL; | |
377 break; | |
378 } | |
379 if(ptr1[0] == '\n') parser->line++; | |
380 } | |
381 continue; | |
382 } | |
383 if(ptr4 == NULL || ptr4[1] == '\0') { | |
372 mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : EOB reached while parsing %s element body",parser->line,element); | 384 mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : EOB reached while parsing %s element body",parser->line,element); |
373 free(element); | 385 free(element); |
374 if(attribs) free(attribs); | 386 if(attribs) free(attribs); |
375 return -1; | 387 return -1; |
376 } | 388 } |
377 if(strncasecmp(element,ptr4+2,strlen(element)) == 0) { // Extract body | 389 if(ptr4[1] != '/' && strncasecmp(element,ptr4+1,strlen(element)) == 0) { |
390 in++; | |
391 ptr4+=2; | |
392 continue; | |
393 } else if(strncasecmp(element,ptr4+2,strlen(element)) == 0) { // Extract body | |
394 if(in > 0) { | |
395 in--; | |
396 ptr4 += 2+strlen(element); | |
397 continue; | |
398 } | |
378 ret = ptr4+strlen(element)+3; | 399 ret = ptr4+strlen(element)+3; |
379 if(ptr4 != ptr3) { | 400 if(ptr4 != ptr3) { |
380 ptr4--; | 401 ptr4--; |
381 for( ; ptr4 != ptr3 && strchr(SPACE,*ptr4) != NULL; ptr4--) ;// Skip space on body end | 402 for( ; ptr4 != ptr3 && strchr(SPACE,*ptr4) != NULL; ptr4--) ;// Skip space on body end |
382 // if(ptr4[0] == '\0') parser->line--; | 403 // if(ptr4[0] == '\0') parser->line--; |
427 parser->line = body ? body_line : ret_line; | 448 parser->line = body ? body_line : ret_line; |
428 | 449 |
429 *_buffer = ret; | 450 *_buffer = ret; |
430 return 1; | 451 return 1; |
431 | 452 |
453 } | |
454 | |
455 static void | |
456 asx_parse_param(ASX_Parser_t* parser, char** attribs, play_tree_t* pt) { | |
457 char *name,*val; | |
458 | |
459 name = asx_get_attrib("NAME",attribs); | |
460 if(!name) { | |
461 asx_warning_attrib_required(parser,"PARAM" ,"NAME" ); | |
462 return; | |
463 } | |
464 val = asx_get_attrib("VALUE",attribs); | |
465 if(m_config_get_option(mconfig,name) == NULL) { | |
466 mp_msg(MSGT_PLAYTREE,MSGL_WARN,"Found unknow param in asx: %s",name); | |
467 if(val) | |
468 mp_msg(MSGT_PLAYTREE,MSGL_WARN,"=%s\n",val); | |
469 else | |
470 mp_msg(MSGT_PLAYTREE,MSGL_WARN,"\n"); | |
471 return; | |
472 } | |
473 play_tree_set_param(pt,name,val); | |
432 } | 474 } |
433 | 475 |
434 static void | 476 static void |
435 asx_parse_ref(ASX_Parser_t* parser, char** attribs, play_tree_t* pt) { | 477 asx_parse_ref(ASX_Parser_t* parser, char** attribs, play_tree_t* pt) { |
436 char *href; | 478 char *href; |
572 if(entry) { | 614 if(entry) { |
573 if(!list) list = entry; | 615 if(!list) list = entry; |
574 else play_tree_append_entry(list,entry); | 616 else play_tree_append_entry(list,entry); |
575 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to repeat\n",element); | 617 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to repeat\n",element); |
576 } | 618 } |
619 } else if(strcasecmp(element,"PARAM") == 0) { | |
620 asx_parse_param(parser,attribs,repeat); | |
577 } else | 621 } else |
578 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Ignoring element %s\n",element); | 622 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Ignoring element %s\n",element); |
579 if(body) free(body); | 623 if(body) free(body); |
580 asx_free_attribs(attribs); | 624 asx_free_attribs(attribs); |
581 } | 625 } |