diff options
author | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-01-22 22:46:12 +0000 |
---|---|---|
committer | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-01-22 22:46:12 +0000 |
commit | eed7858a7405e8b3861b77dc77bde4aae359c8ac (patch) | |
tree | e09f7a11e826f86ebd0c530deb6360149780279a /playtreeparser.c | |
parent | 7b94d58c45752016e641f2a31b38d19483b6772e (diff) | |
download | mpv-eed7858a7405e8b3861b77dc77bde4aae359c8ac.tar.bz2 mpv-eed7858a7405e8b3861b77dc77bde4aae359c8ac.tar.xz |
Objectization of the play_tree_parser for more flexiblity
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4309 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'playtreeparser.c')
-rw-r--r-- | playtreeparser.c | 244 |
1 files changed, 142 insertions, 102 deletions
diff --git a/playtreeparser.c b/playtreeparser.c index 0d0ba72625..47918925c3 100644 --- a/playtreeparser.c +++ b/playtreeparser.c @@ -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 @@ parse_asx(stream_t* stream) { 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 @@ parse_asx(stream_t* stream) { // 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 @@ parse_textplain(stream_t *stream) { 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 @@ parse_textplain(stream_t *stream) { 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 @@ parse_textplain(stream_t *stream) { 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 @@ parse_textplain(stream_t *stream) { 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 @@ parse_textplain(stream_t *stream) { 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; - } - - 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); + p = play_tree_parser_new(stream,0); + if(!p) + return NULL; - if(!tree) mp_msg(MSGT_PLAYTREE,MSGL_WARN,"Warning empty playlist\n"); + ret = play_tree_parser_get_play_tree(p); + play_tree_parser_free(p); - if(buffer) free(buffer); - buffer = NULL; - buffer_end = buffer_size = 0; - return tree; + return ret; } play_tree_t* @@ -299,3 +280,62 @@ parse_playlist_file(char* file) { 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; +} |