#include "config.h" #include #include #include #ifdef MP_DEBUG #include #endif #include #include #include #include #include #include "playtree.h" #include "playtreeparser.h" #include "libmpdemux/stream.h" #include "mp_msg.h" extern play_tree_t* asx_parser_build_tree(char* buffer, int ref); play_tree_t* parse_asx(play_tree_parser_t* p) { int r; int comments = 0,read = 1,eof = 0; mp_msg(MSGT_PLAYTREE,MSGL_V,"Trying asx...\n"); while(1) { if(read && eof) // Eof reached before anything useful return NULL; if(read) { if(p->buffer_size - p->buffer_end < 50) p->buffer_size += 255; p->buffer = (char*)realloc(p->buffer,p->buffer_size*sizeof(char)); if(p->buffer == NULL) { mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",p->buffer_size*sizeof(char)); p->buffer_size = p->buffer_end = 0; return NULL; } r = stream_read(p->stream,p->buffer+p->buffer_end,p->buffer_size-p->buffer_end-1); if(r < 0) { mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't read from stream r=%d\n",r); return NULL; } else if(r == 0) eof = 1; p->buffer_end += r; p->buffer[p->buffer_end] = '\0'; } if(comments) { // Jump comments int e; char* end = strstr(p->buffer,"-->"); if(!end) { if(p->buffer[p->buffer_end-1] != '-') p->buffer_end = 0; // Drop buffer content if last char isn't '-' continue; } comments = 0; e = end - p->buffer + 3; if(e >= p->buffer_end) { // > seems impossible p->buffer_end = 0; // Drop buffer content read = 1; continue; } p->buffer_end -= e; memmove(p->buffer,end+3,p->buffer_end); // Drop comments continue; } for(r= 0 ; r < p->buffer_end ; r++) { if(strchr(" \n\r\t",p->buffer[r]) != NULL) // Jump space continue; if(p->buffer[r] != '<') { mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"First char isn't '<' but '%c'\n",p->buffer[r]); mp_msg(MSGT_PLAYTREE,MSGL_DBG3,"Buffer = [%s]\n",p->buffer); return NULL; } break; // Stop on first '<' } if(r > p->buffer_end-4) { // We need more if(r > 0) { // Drop unuseful beggining p->buffer_end -= r; memmove(p->buffer,&p->buffer[r],p->buffer_end); } read = 1; continue; } if(strncmp(&p->buffer[r],"