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

📄 asxparser.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "config.h"#include <stdlib.h>#include <stdio.h>#include <stdarg.h>#include <string.h>#include <unistd.h>#include "playtree.h"#include "playtreeparser.h"#include "libmpdemux/stream.h"#include "libmpdemux/demuxer.h"#include "asxparser.h"#include "mp_msg.h"#include "m_config.h"extern m_config_t* mconfig;////// List utilsvoidasx_list_add(void* list_ptr,void* entry){  void** list = *(void***)list_ptr;  int c = 0;  if(list != NULL)    for( ; list[c] != NULL; c++) ;  list = (void*)realloc(list,sizeof(void*)*(c+2));  list[c] = entry;  list[c+1] = NULL;  *(void***)list_ptr = list;}voidasx_list_remove(void* list_ptr,void* entry,ASX_FreeFunc free_func) {  void** list = *(void***)list_ptr;  int c,e = -1;  if(list == NULL) return;  for(c = 0 ; list[c] != NULL; c++){    if(list[c] == entry) e = c;  }  if(e == -1) return; // Not found  if(free_func != NULL) free_func(list[e]);    if(c == 1) { // Only one entry, we drop all    free(list);    *(void**)list_ptr = NULL;    return;  }  if(c > e) // If c==e the memmove is not needed    memmove(list+e,list+e+1,(c-e)*sizeof(void*));  list = (void*)realloc(list,(c-1)*sizeof(void*));  list[c-1] = NULL;    *(void***)list_ptr = list;}voidasx_list_free(void* list_ptr,ASX_FreeFunc free_func) {  void** ptr = *(void***)list_ptr;  if(ptr == NULL) return;  if(free_func != NULL) {    for( ; *ptr != NULL ; ptr++)      free_func(*ptr);  }  free(*(void**)list_ptr);  *(void**)list_ptr = NULL;}/////// Attribs utilschar*asx_get_attrib(char* attrib,char** attribs) {  char** ptr;  if(attrib == NULL || attribs == NULL) return NULL;  for(ptr = attribs; ptr[0] != NULL; ptr += 2){    if(strcasecmp(ptr[0],attrib) == 0)      return strdup(ptr[1]);  }  return NULL;}intasx_attrib_to_enum(char* val,char** valid_vals) {  char** ptr;  int r = 0;  if(valid_vals == NULL || val == NULL) return -2;  for(ptr = valid_vals ; ptr[0] != NULL ; ptr++) {    if(strcasecmp(val,ptr[0]) == 0) return r;    r++;  }  return -1;}static voidasx_warning_attrib_invalid(ASX_Parser_t* parser, char* elem, char* attrib,			   char** valid_vals,char* val) {  char *str,*vals,**ptr;  int len;  if(valid_vals == NULL || valid_vals[0] == NULL) return;    len = strlen(valid_vals[0]) + 1;  for(ptr = valid_vals+1 ; ptr[0] != NULL; ptr++) {    len += strlen(ptr[0]);    len += ((ptr[1] == NULL) ? 4 : 2);  }  str = vals = (char*)malloc(len);  vals += sprintf(vals,"%s",valid_vals[0]);  for(ptr = valid_vals + 1 ; ptr[0] != NULL ; ptr++) {    if(ptr[1] == NULL)      vals += sprintf(vals," or %s",ptr[0]);    else      vals += sprintf(vals,", %s",ptr[0]);  }  mp_msg(MSGT_PLAYTREE,MSGL_ERR,"at line %d : attribute %s of element %s is invalid (%s). Valid values are %s",	      parser->line,attrib,elem,val,str);  free(str);}static intasx_get_yes_no_attrib(ASX_Parser_t* parser, char* element, char* attrib,char** attribs,int def) {  char* val = asx_get_attrib(attrib,attribs);  char* valids[] = { "NO", "YES", NULL };  int r;  if(val == NULL) return def;  r = asx_attrib_to_enum(val,valids);  if(r < 0) {    asx_warning_attrib_invalid(parser,element,attrib,valids,val);    r = def;  }  free(val);  return r;}#define asx_warning_attrib_required(p,e,a) mp_msg(MSGT_PLAYTREE,MSGL_WARN,"At line %d : element %s don't have the required attribute %s",p->line,e,a)#define asx_warning_body_parse_error(p,e) mp_msg(MSGT_PLAYTREE,MSGL_WARN,"At line %d : error while parsing %s body",p->line,e)ASX_Parser_t*asx_parser_new(void) {  ASX_Parser_t* parser = calloc(1,sizeof(ASX_Parser_t));  return parser;}voidasx_parser_free(ASX_Parser_t* parser) {  if(!parser) return;  if(parser->ret_stack) free(parser->ret_stack);  free(parser);}#define LETTER "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"#define SPACE " \n\t\r"intasx_parse_attribs(ASX_Parser_t* parser,char* buffer,char*** _attribs) {  char *ptr1, *ptr2, *ptr3;  int n_attrib = 0;  char **attribs = NULL;  char *attrib, *val;  ptr1 = buffer;  while(1) {    for( ; strchr(SPACE,*ptr1) != NULL; ptr1++) { // Skip space      if(*ptr1 == '\0') break;    }    ptr3 = strchr(ptr1,'=');    if(ptr3 == NULL) break;    for(ptr2 = ptr3-1; strchr(SPACE,*ptr2) != NULL; ptr2--) {      if (ptr2 == ptr1) {	mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : this should never append, back to attribute begin while skipping end space",parser->line);	break;      }    }    attrib = (char*)malloc(ptr2-ptr1+2);    strncpy(attrib,ptr1,ptr2-ptr1+1);    attrib[ptr2-ptr1+1] = '\0';    ptr1 = strchr(ptr3,'"');    if(ptr1 == NULL || ptr1[1] == '\0') ptr1 = strchr(ptr3,'\'');    if(ptr1 == NULL || ptr1[1] == '\0') {      mp_msg(MSGT_PLAYTREE,MSGL_WARN,"At line %d : can't find attribute %s value",parser->line,attrib);      free(attrib);      break;    }    ptr2 = strchr(ptr1+1,ptr1[0]);    if (ptr2 == NULL) {      mp_msg(MSGT_PLAYTREE,MSGL_WARN,"At line %d : value of attribute %s isn't finished",parser->line,attrib);      free(attrib);      break;    }    ptr1++;    val = (char*)malloc(ptr2-ptr1+1);    strncpy(val,ptr1,ptr2-ptr1);    val[ptr2-ptr1] = '\0';    n_attrib++;        attribs = (char**)realloc(attribs,(2*n_attrib+1)*sizeof(char*));    attribs[n_attrib*2-2] = attrib;    attribs[n_attrib*2-1] = val;        ptr1 = ptr2+1;  }    if(n_attrib > 0)    attribs[n_attrib*2] = NULL;  *_attribs = attribs;    return n_attrib;} /* * Return -1 on error, 0 when nothing is found, 1 on sucess */intasx_get_element(ASX_Parser_t* parser,char** _buffer,		char** _element,char** _body,char*** _attribs) {  char *ptr1,*ptr2, *ptr3, *ptr4;  char *attribs = NULL;  char *element = NULL, *body = NULL, *ret = NULL, *buffer;  int n_attrib = 0;  int body_line = 0,attrib_line,ret_line,in = 0;  int quotes = 0;  if(_buffer == NULL || _element == NULL || _body == NULL || _attribs == NULL) {    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : asx_get_element called with invalid value",parser->line);    return -1;  }  *_body = *_element = NULL;  *_attribs =  NULL;  buffer = *_buffer;  if(buffer == NULL) return 0;  if(parser->ret_stack && /*parser->last_body && */buffer != parser->last_body) {    ASX_LineSave_t* ls = parser->ret_stack;    int i;    for(i = 0 ; i < parser->ret_stack_size ; i++) {      if(buffer == ls[i].buffer) {	parser->line = ls[i].line;	break;      }          }    if( i < parser->ret_stack_size) {      i++;      if( i < parser->ret_stack_size)		memmove(parser->ret_stack,parser->ret_stack+i, (parser->ret_stack_size - i)*sizeof(ASX_LineSave_t));      parser->ret_stack_size -= i;      if(parser->ret_stack_size > 0)	parser->ret_stack = (ASX_LineSave_t*)realloc(parser->ret_stack,parser->ret_stack_size*sizeof(ASX_LineSave_t));      else {	free(parser->ret_stack);	parser->ret_stack = NULL;      }    }  }  ptr1 = buffer;  while(1) {    for( ; ptr1[0] != '<' ; ptr1++) {      if(ptr1[0] == '\0') {	ptr1 = NULL;	break;      }      if(ptr1[0] == '\n') parser->line++;    }    //ptr1 = strchr(ptr1,'<');    if(!ptr1 || ptr1[1] == '\0') return 0; // Nothing found        if(strncmp(ptr1,"<!--",4) == 0) { // Comments      for( ; strncmp(ptr1,"-->",3) != 0 ; ptr1++) {	if(ptr1[0] == '\0') {	  ptr1 = NULL;	  break;	}	if(ptr1[0] == '\n') parser->line++;      }      //ptr1 = strstr(ptr1,"-->");      if(!ptr1) {	mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : unfinished comment",parser->line);	return -1;      }    } else {      break;    }  }    // Is this space skip very useful ??  for(ptr1++; strchr(SPACE,ptr1[0]) != NULL; ptr1++) { // Skip space    if(ptr1[0] == '\0') {      mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : EOB reached while parsing element start",parser->line);      return -1;    }    if(ptr1[0] == '\n') parser->line++;  }   for(ptr2 = ptr1; strchr(LETTER,*ptr2) != NULL;ptr2++) { // Go to end of name    if(*ptr2 == '\0'){      mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : EOB reached while parsing element start",parser->line);      return -1;    }    if(ptr2[0] == '\n') parser->line++;  }  element = (char*)malloc(ptr2-ptr1+1);  strncpy(element,ptr1,ptr2-ptr1);  element[ptr2-ptr1] = '\0';  for( ; strchr(SPACE,*ptr2) != NULL; ptr2++) { // Skip space    if(ptr2[0] == '\0') {      mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : EOB reached while parsing element start",parser->line);      free(element);      return -1;    }    if(ptr2[0] == '\n') parser->line++;  }  attrib_line = parser->line;    for(ptr3 = ptr2; ptr3[0] != '\0'; ptr3++) { // Go to element end    if(ptr3[0] == '"') quotes ^= 1;      if(!quotes && (ptr3[0] == '>' || strncmp(ptr3,"/>",2) == 0))      break;    if(ptr3[0] == '\n') parser->line++;  }  if(ptr3[0] == '\0' || ptr3[1] == '\0') { // End of file    mp_msg(MSGT_PLAYTREE,MSGL_ERR,"At line %d : EOB reached while parsing element start",parser->line);    free(element);    return -1;  }  // Save attribs string  if(ptr3-ptr2 > 0) {    attribs = (char*)malloc(ptr3-ptr2+1);    strncpy(attribs,ptr2,ptr3-ptr2);    attribs[ptr3-ptr2] = '\0';  }  //bs_line = parser->line;  if(ptr3[0] != '/') { // Not Self closed element    ptr3++;    for( ; strchr(SPACE,*ptr3) != NULL; ptr3++) { // Skip space on body begin      if(*ptr3 == '\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;

⌨️ 快捷键说明

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