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 }