Mercurial > mplayer.hg
changeset 4308:d752f99fd535
Objectization of the play_tree_parser for more flexiblity
author | albeu |
---|---|
date | Tue, 22 Jan 2002 22:46:12 +0000 |
parents | c494cc258eb8 |
children | 35b412015c39 |
files | playtreeparser.c playtreeparser.h |
diffstat | 2 files changed, 167 insertions(+), 102 deletions(-) [+] |
line wrap: on
line diff
--- a/playtreeparser.c Tue Jan 22 18:19:02 2002 +0000 +++ b/playtreeparser.c Tue Jan 22 22:46:12 2002 +0000 @@ -12,20 +12,16 @@ #include <fcntl.h> #include <unistd.h> #include "playtree.h" +#include "playtreeparser.h" #include "libmpdemux/stream.h" #include "mp_msg.h" extern play_tree_t* -asx_parser_build_tree(char* buffer); - - -static char* buffer = NULL; -static int buffer_size = 0, buffer_end = 0; - +asx_parser_build_tree(char* buffer, int ref); play_tree_t* -parse_asx(stream_t* stream) { +parse_asx(play_tree_parser_t* p) { int r; int comments = 0,read = 1,eof = 0; @@ -35,70 +31,70 @@ if(read && eof) // Eof reached before anything useful return NULL; if(read) { - if(buffer_size - buffer_end < 50) buffer_size += 255; - buffer = (char*)realloc(buffer,buffer_size*sizeof(char)); - if(buffer == NULL) { - mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",buffer_size*sizeof(char)); - buffer_size = buffer_end = 0; + 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(stream,buffer+buffer_end,buffer_size-buffer_end-1); + 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; - buffer_end += r; - buffer[buffer_end] = '\0'; + p->buffer_end += r; + p->buffer[p->buffer_end] = '\0'; } if(comments) { // Jump comments int e; - char* end = strstr(buffer,"-->"); + char* end = strstr(p->buffer,"-->"); if(!end) { - if(buffer[buffer_end-1] != '-') - buffer_end = 0; // Drop buffer content if last char isn't '-' + if(p->buffer[p->buffer_end-1] != '-') + p->buffer_end = 0; // Drop buffer content if last char isn't '-' continue; } comments = 0; - e = end - buffer + 3; - if(e >= buffer_end) { // > seems impossible - buffer_end = 0; // Drop buffer content + e = end - p->buffer + 3; + if(e >= p->buffer_end) { // > seems impossible + p->buffer_end = 0; // Drop buffer content read = 1; continue; } - buffer_end -= e; - memmove(buffer,end+3,buffer_end); // Drop comments + p->buffer_end -= e; + memmove(p->buffer,end+3,p->buffer_end); // Drop comments continue; } - for(r= 0 ; r < buffer_end ; r++) { - if(strchr(" \n\r\t",buffer[r]) != NULL) // Jump space + for(r= 0 ; r < p->buffer_end ; r++) { + if(strchr(" \n\r\t",p->buffer[r]) != NULL) // Jump space continue; - if(buffer[r] != '<') { - mp_msg(MSGT_PLAYTREE,MSGL_DBG2,"First char isn't '<' but '%c'\n",buffer[r]); - mp_msg(MSGT_PLAYTREE,MSGL_DBG3,"Buffer = [%s]\n",buffer); + 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 > buffer_end-4) { // We need more + if(r > p->buffer_end-4) { // We need more if(r > 0) { // Drop unuseful beggining - buffer_end -= r; - memmove(buffer,&buffer[r],buffer_end); + p->buffer_end -= r; + memmove(p->buffer,&p->buffer[r],p->buffer_end); } read = 1; continue; } - if(strncmp(&buffer[r],"<!--",4) == 0) { // Comments + if(strncmp(&p->buffer[r],"<!--",4) == 0) { // Comments read = 0; comments = 1; continue; } - if(strncasecmp(&buffer[r],"<ASX",4) != 0) // First element is not a comment nor an asx : end + if(strncasecmp(&p->buffer[r],"<ASX",4) != 0) // First element is not a comment nor an asx : end return NULL; @@ -108,29 +104,27 @@ // We have an asx : load it in memory and parse while(!eof) { - if(buffer_size - buffer_end < 50) buffer_size += 255; - buffer = (char*)realloc(buffer,buffer_size*sizeof(char)); - if(buffer == NULL) { - mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",buffer_size*sizeof(char)); - buffer_size = buffer_end = 0; + 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(stream,buffer+buffer_end,buffer_size-buffer_end-1); + r = stream_read(p->stream,p->buffer+p->buffer_end,p->buffer_size-p->buffer_end-1); if(r > 0) - buffer_end += r; + p->buffer_end += r; if(r <= 0) break; - buffer[buffer_end] = '\0'; + p->buffer[p->buffer_end] = '\0'; } - mp_msg(MSGT_PLAYTREE,MSGL_DBG3,"Parsing asx file : [%s]\n",buffer); - return asx_parser_build_tree(buffer); - - + mp_msg(MSGT_PLAYTREE,MSGL_DBG3,"Parsing asx file : [%s]\n",p->buffer); + return asx_parser_build_tree(p->buffer,p->deep); } play_tree_t* -parse_textplain(stream_t *stream) { +parse_textplain(play_tree_parser_t* p) { char* end; char* file; int eof = 0,r,p_end=-1,resize = 0; @@ -138,12 +132,12 @@ mp_msg(MSGT_PLAYTREE,MSGL_V,"Trying plaintext...\n"); - if(buffer_size < 255 && ! stream->eof) { - buffer_size = 255; - buffer = (char*)realloc(buffer,buffer_size*sizeof(char)); - if(buffer == NULL) { - mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",buffer_size*sizeof(char)); - buffer_size = buffer_end = 0; + if(p->buffer_size < 255 && ! p->stream->eof) { + 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; } } @@ -151,41 +145,41 @@ while(!eof) { if(resize) { - buffer_size += 255; - buffer = (char*)realloc(buffer,buffer_size*sizeof(char)); + p->buffer_size += 255; + p->buffer = (char*)realloc(p->buffer,p->buffer_size*sizeof(char)); resize = 0; - if(buffer == NULL) { - mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",buffer_size*sizeof(char)); - buffer_size = buffer_end = 0; + 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; if(list) play_tree_free_list(list,1); return NULL; } } - if(!stream->eof) { - r = stream_read(stream,buffer+buffer_end,buffer_size-buffer_end-1); + if(!p->stream->eof) { + 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; - buffer_end += r; - buffer[buffer_end] = '\0'; + p->buffer_end += r; + p->buffer[p->buffer_end] = '\0'; } else eof = 1; r = 0; while(1) { p_end = r; - for( ; buffer[r] != '\0' ; r++) { - if(strchr(" \n\r\t",buffer[r]) != NULL) + for( ; p->buffer[r] != '\0' ; r++) { + if(strchr(" \n\r\t",p->buffer[r]) != NULL) continue; break; } - if(buffer[r] == '\0') { + if(p->buffer[r] == '\0') { p_end = r; if(!eof) resize = 1; break; } - end = strchr(&buffer[r],'\n'); + end = strchr(&p->buffer[r],'\n'); if(!end) { if(!eof) { p_end = r; @@ -195,26 +189,26 @@ break; } entry = play_tree_new(); - play_tree_add_file(entry,&buffer[r]); - r = buffer_end; + play_tree_add_file(entry,&p->buffer[r]); + r = p->buffer_end; } else { - if(r > 0 && buffer[r-1] == '\r') r--; - file = (char*)malloc((end-(&buffer[r])+1)*sizeof(char)); + if(r > 0 && p->buffer[r-1] == '\r') r--; + file = (char*)malloc((end-(&p->buffer[r])+1)*sizeof(char)); if(file == NULL) { - mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Can't allocate %d bytes of memory\n",buffer_size*sizeof(char)); - buffer_size = buffer_end = 0; + 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; if(list) play_tree_free_list(list,1); return NULL; } // TODO : Check if the given file exist and is readable (or it'a an url) - strncpy(file,&buffer[r],end-(&buffer[r])); - file[end-(&buffer[r])] = '\0'; + strncpy(file,&p->buffer[r],end-(&p->buffer[r])); + file[end-(&p->buffer[r])] = '\0'; entry = play_tree_new(); play_tree_add_file(entry,file); free(file); - r += end-(&buffer[r]); + r += end-(&p->buffer[r]); p_end = r; } if(entry) { @@ -224,12 +218,12 @@ entry = NULL; } } - if(!eof && p_end > 0 && p_end < buffer_end) { - memmove(buffer,&buffer[p_end],buffer_end-p_end); - buffer_end -= p_end; - } else if(!eof && !resize && p_end == buffer_end) { - buffer_end = 0; - buffer[0] = '\0'; + if(!eof && p_end > 0 && p_end < p->buffer_end) { + memmove(p->buffer,&p->buffer[p_end],p->buffer_end-p_end); + p->buffer_end -= p_end; + } else if(!eof && !resize && p_end == p->buffer_end) { + p->buffer_end = 0; + p->buffer[0] = '\0'; } } @@ -241,35 +235,22 @@ play_tree_t* parse_playtree(stream_t *stream) { - play_tree_t* tree = NULL; - + play_tree_parser_t* p; + play_tree_t* ret; + #ifdef MP_DEBUG assert(stream != NULL); assert(stream->type == STREAMTYPE_PLAYLIST); #endif - while(1) { - tree = parse_asx(stream); - if(tree) break; - // Here come the others formats ( textplain must stay the last one ) - tree = parse_textplain(stream); - if(tree) break; - break; - } + p = play_tree_parser_new(stream,0); + if(!p) + return NULL; - if(tree) - mp_msg(MSGT_PLAYTREE,MSGL_V,"Playlist succefully parsed\n"); - else mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Error while parsing playlist\n"); - - if(tree) - tree = play_tree_cleanup(tree); + ret = play_tree_parser_get_play_tree(p); + play_tree_parser_free(p); - if(!tree) mp_msg(MSGT_PLAYTREE,MSGL_WARN,"Warning empty playlist\n"); - - if(buffer) free(buffer); - buffer = NULL; - buffer_end = buffer_size = 0; - return tree; + return ret; } play_tree_t* @@ -299,3 +280,62 @@ return ret; } + + +play_tree_parser_t* +play_tree_parser_new(stream_t* stream,int deep) { + play_tree_parser_t* p; + + p = (play_tree_parser_t*)calloc(1,sizeof(play_tree_parser_t)); + if(!p) + return NULL; + p->stream = stream; + p->deep = deep; + + return p; + +} + +void +play_tree_parser_free(play_tree_parser_t* p) { + +#ifdef MP_DEBUG + assert(p != NULL); +#endif + + if(p->buffer) free(p->buffer); + free(p->buffer); +} + +play_tree_t* +play_tree_parser_get_play_tree(play_tree_parser_t* p) { + play_tree_t* tree = NULL; + +#ifdef MP_DEBUG + assert(p != NULL); +#endif + + while(1) { + tree = parse_asx(p); + if(tree) break; + // Here come the others formats ( textplain must stay the last one ) + tree = parse_textplain(p); + if(tree) break; + break; + } + + if(tree) + mp_msg(MSGT_PLAYTREE,MSGL_V,"Playlist succefully parsed\n"); + else mp_msg(MSGT_PLAYTREE,MSGL_ERR,"Error while parsing playlist\n"); + + if(tree) + tree = play_tree_cleanup(tree); + + if(!tree) mp_msg(MSGT_PLAYTREE,MSGL_WARN,"Warning empty playlist\n"); + + if(p->buffer) free(p->buffer); + p->buffer = NULL; + p->buffer_end = p->buffer_size = 0; + + return tree; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/playtreeparser.h Tue Jan 22 22:46:12 2002 +0000 @@ -0,0 +1,25 @@ + +#ifndef __PLAYTREEPARSER_H +#define __PLAYTREEPARSER_H + +#include "playtree.h" +#include "libmpdemux/stream.h" + +typedef struct play_tree_parser { + stream_t* stream; + char* buffer; + int buffer_size , buffer_end; + int deep; +} play_tree_parser_t; + + +play_tree_parser_t* +play_tree_parser_new(stream_t* stream,int deep); + +void +play_tree_parser_free(play_tree_parser_t* p); + +play_tree_t* +play_tree_parser_get_play_tree(play_tree_parser_t* p); + +#endif