⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asxparser.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
      }      if(ptr3[0] == '\n') parser->line++;    }    ptr4 = ptr3;    body_line = parser->line;    while(1) { // Find closing element      for( ; ptr4[0] != '<' ; ptr4++) {	if(ptr4[0] == '\0') {	  ptr4 = NULL;	  break;	}	if(ptr4[0] == '\n') parser->line++;      }      if(ptr4 && strncmp(ptr4,"<!--",4) == 0) { // Comments	for( ; strncmp(ptr4,"-->",3) != 0 ; ptr4++) {	if(ptr4[0] == '\0') {	  ptr4 = NULL;	  break;	}	if(ptr1[0] == '\n') parser->line++;	}	continue;      }      if(ptr4 == NULL || ptr4[1] == '\0') { 	mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : EOB reached while parsing %s element body",parser->line,element);	free(element);	if(attribs) free(attribs);	return -1;      }      if(ptr4[1] != '/' && strncasecmp(element,ptr4+1,strlen(element)) == 0) {	in++;	ptr4+=2;	continue;      } else if(strncasecmp(element,ptr4+2,strlen(element)) == 0) { // Extract body	if(in > 0) {	  in--;	  ptr4 += 2+strlen(element);	  continue;	}	ret = ptr4+strlen(element)+3;	if(ptr4 != ptr3) {	  ptr4--;	  for( ; ptr4 != ptr3 && strchr(SPACE,*ptr4) != NULL; ptr4--) ;// Skip space on body end	  //	    if(ptr4[0] == '\0') parser->line--;	  //}	  ptr4++;	  body = (char*)malloc(ptr4-ptr3+1);	  strncpy(body,ptr3,ptr4-ptr3);	  body[ptr4-ptr3] = '\0';	  	}	break;      } else {	ptr4 += 2;      }    }  } else {    ret = ptr3 + 2; // 2 is for />  }  for( ; ret[0] != '\0' && strchr(SPACE,ret[0]) != NULL; ret++) { // Skip space    if(ret[0] == '\n') parser->line++;  }  ret_line = parser->line;  if(attribs) {    parser->line = attrib_line;    n_attrib = asx_parse_attribs(parser,attribs,_attribs);    free(attribs);    if(n_attrib < 0) {      mp_msg(MSGT_PLAYTREE,MSGL_WARN,"At line %d : error while parsing element %s attributes",parser->line,element);      free(element);      free(body);      return -1;    }  } else    *_attribs = NULL;  *_element = element;  *_body = body;  parser->last_body = body;  parser->ret_stack_size++;  parser->ret_stack = (ASX_LineSave_t*)realloc(parser->ret_stack,parser->ret_stack_size*sizeof(ASX_LineSave_t));  if(parser->ret_stack_size > 1)    memmove(parser->ret_stack+1,parser->ret_stack,(parser->ret_stack_size-1)*sizeof(ASX_LineSave_t));  parser->ret_stack[0].buffer = ret;  parser->ret_stack[0].line = ret_line;  parser->line = body ? body_line : ret_line;  *_buffer = ret;  return 1;}static voidasx_parse_param(ASX_Parser_t* parser, char** attribs, play_tree_t* pt) {  char *name,*val;    name = asx_get_attrib("NAME",attribs);  if(!name) {    asx_warning_attrib_required(parser,"PARAM" ,"NAME" );    return;  }  val = asx_get_attrib("VALUE",attribs);  if(m_config_get_option(mconfig,name) == NULL) {    mp_msg(MSGT_PLAYTREE,MSGL_WARN,"Found unknown param in asx: %s",name);    if(val)      mp_msg(MSGT_PLAYTREE,MSGL_WARN,"=%s\n",val);    else      mp_msg(MSGT_PLAYTREE,MSGL_WARN,"\n");    return;  }  play_tree_set_param(pt,name,val);  free(name);  if(val) free(val);}static voidasx_parse_ref(ASX_Parser_t* parser, char** attribs, play_tree_t* pt) {  char *href;  href = asx_get_attrib("HREF",attribs);  if(href == NULL) {    asx_warning_attrib_required(parser,"REF" ,"HREF" );    return;  }  play_tree_add_file(pt,href);  mp_msg(MSGT_PLAYTREE,MSGL_V,"Adding file %s to element entry\n",href);  free(href);}static play_tree_t*asx_parse_entryref(ASX_Parser_t* parser,char* buffer,char** _attribs) {  play_tree_t* pt;  char *href;  stream_t* stream;  play_tree_parser_t* ptp;  int f=DEMUXER_TYPE_UNKNOWN;  if(parser->deep > 0)    return NULL;  href = asx_get_attrib("HREF",_attribs);  if(href == NULL) {    asx_warning_attrib_required(parser,"ENTRYREF" ,"HREF" );    return NULL;  }  stream=open_stream(href,0,&f);  if(!stream) {    mp_msg(MSGT_PLAYTREE,MSGL_WARN,"Can't open playlist %s\n",href);    free(href);    return NULL;  }  mp_msg(MSGT_PLAYTREE,MSGL_V,"Adding playlist %s to element entryref\n",href);  ptp = play_tree_parser_new(stream,parser->deep+1);  pt = play_tree_parser_get_play_tree(ptp, 1);  play_tree_parser_free(ptp);  free_stream(stream);  free(href);  //mp_msg(MSGT_PLAYTREE,MSGL_INFO,"Need to implement entryref\n");      return pt;}static play_tree_t*asx_parse_entry(ASX_Parser_t* parser,char* buffer,char** _attribs) {  char *element,*body,**attribs;  int r,nref=0;  play_tree_t *ref;  ref = play_tree_new();  while(buffer && buffer[0] != '\0') {    r = asx_get_element(parser,&buffer,&element,&body,&attribs);    if(r < 0) {      asx_warning_body_parse_error(parser,"ENTRY");      return NULL;    } else if (r == 0) { // No more element      break;    }    if(strcasecmp(element,"REF") == 0) {      asx_parse_ref(parser,attribs,ref);      mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to entry\n",element);      nref++;    } else      mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Ignoring element %s\n",element);    if(body) free(body);    asx_free_attribs(attribs);  }  if(nref <= 0) {    play_tree_free(ref,1);    return NULL;  }  return ref;}  static play_tree_t*asx_parse_repeat(ASX_Parser_t* parser,char* buffer,char** _attribs) {  char *element,*body,**attribs;  play_tree_t *repeat, *list=NULL, *entry;  char* count;  int r;  repeat = play_tree_new();  count = asx_get_attrib("COUNT",_attribs);  if(count == NULL) {    mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Setting element repeat loop to infinit\n");    repeat->loop = -1; // Infinit  } else {    repeat->loop = atoi(count);    free(count);    if(repeat->loop == 0) repeat->loop = 1;    mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Setting element repeat loop to %d\n",repeat->loop);  }  while(buffer && buffer[0] != '\0') {    r = asx_get_element(parser,&buffer,&element,&body,&attribs);    if(r < 0) {      asx_warning_body_parse_error(parser,"REPEAT");      return NULL;    } else if (r == 0) { // No more element      break;    }    if(strcasecmp(element,"ENTRY") == 0) {       entry = asx_parse_entry(parser,body,attribs);       if(entry) {	 if(!list) list =  entry;	 else play_tree_append_entry(list,entry);	 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to repeat\n",element);       }    } else if(strcasecmp(element,"ENTRYREF") == 0) {       entry = asx_parse_entryref(parser,body,attribs);       if(entry) {	 if(!list) list =  entry;	 else play_tree_append_entry(list,entry);	 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to repeat\n",element);       }     } else if(strcasecmp(element,"REPEAT") == 0) {       entry = asx_parse_repeat(parser,body,attribs);       if(entry) {	 if(!list) list =  entry;	 else play_tree_append_entry(list,entry);	 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to repeat\n",element);       }     } else if(strcasecmp(element,"PARAM") == 0) {       asx_parse_param(parser,attribs,repeat);     } else       mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Ignoring element %s\n",element);    if(body) free(body);     asx_free_attribs(attribs);  }  if(!list) {    play_tree_free(repeat,1);    return NULL;  }  play_tree_set_child(repeat,list);  return repeat;}play_tree_t*asx_parser_build_tree(char* buffer,int deep) {  char *element,*asx_body,**asx_attribs,*body, **attribs;  int r;  play_tree_t *asx,*entry,*list = NULL;  ASX_Parser_t* parser = asx_parser_new();  parser->line = 1;  parser->deep = deep;   r = asx_get_element(parser,&buffer,&element,&asx_body,&asx_attribs);  if(r < 0) {    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : Syntax error ???",parser->line);    asx_parser_free(parser);    return NULL;  } else if(r == 0) { // No contents    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"empty asx element");    asx_parser_free(parser);    return NULL;  }  if(strcasecmp(element,"ASX") != 0) {    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"first element isn't ASX, it's %s\n",element);    asx_free_attribs(asx_attribs);    if(body) free(body);    asx_parser_free(parser);    return NULL;  }  if(!asx_body) {    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"ASX element is empty");    asx_free_attribs(asx_attribs);    asx_parser_free(parser);    return NULL;  }  asx = play_tree_new();  buffer = asx_body;  while(buffer && buffer[0] != '\0') {    r = asx_get_element(parser,&buffer,&element,&body,&attribs);     if(r < 0) {       asx_warning_body_parse_error(parser,"ASX");       asx_parser_free(parser);       return NULL;     } else if (r == 0) { // No more element       break;     }     if(strcasecmp(element,"ENTRY") == 0) {       entry = asx_parse_entry(parser,body,attribs);       if(entry) {	 if(!list) list =  entry;	 else play_tree_append_entry(list,entry);	 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to asx\n",element);       }     } else if(strcasecmp(element,"ENTRYREF") == 0) {       entry = asx_parse_entryref(parser,body,attribs);       if(entry) {	 if(!list) list =  entry;	 else play_tree_append_entry(list,entry);	 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to asx\n",element);       }     } else if(strcasecmp(element,"REPEAT") == 0) {       entry = asx_parse_repeat(parser,body,attribs);       if(entry) {	 if(!list) list =  entry;	 else play_tree_append_entry(list,entry);	 mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Adding element %s to asx\n",element);       }     } else       mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"Ignoring element %s\n",element);     if(body) free(body);     asx_free_attribs(attribs);  }  free(asx_body);  asx_free_attribs(asx_attribs);  asx_parser_free(parser);  if(!list) {    play_tree_free(asx,1);        return NULL;  }  play_tree_set_child(asx,list);  return asx;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -