[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[619] mplayerxp/libplaytree
Brought to you by:
olov
From: <nic...@us...> - 2012-12-28 13:50:04
|
Revision: 619 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=619&view=rev Author: nickols_k Date: 2012-12-28 13:49:55 +0000 (Fri, 28 Dec 2012) Log Message: ----------- convert struct playtree_parser_t into class PlayTree_Parser Modified Paths: -------------- mplayerxp/libplaytree/asxparser.cpp mplayerxp/libplaytree/playtree.cpp mplayerxp/libplaytree/playtree.h mplayerxp/libplaytree/playtreeparser.cpp mplayerxp/libplaytree/playtreeparser.h Modified: mplayerxp/libplaytree/asxparser.cpp =================================================================== --- mplayerxp/libplaytree/asxparser.cpp 2012-12-28 12:53:00 UTC (rev 618) +++ mplayerxp/libplaytree/asxparser.cpp 2012-12-28 13:49:55 UTC (rev 619) @@ -333,7 +333,7 @@ PlayTree* pt; std::string href; Stream* stream; - play_tree_parser_t* ptp; + PlayTree_Parser* ptp; int f; UNUSED(buffer); @@ -356,9 +356,9 @@ return NULL; } mpxp_v<<"Adding playlist "<<href<<" to element entryref"<<std::endl; - ptp = play_tree_parser_new(stream,deep+1); - pt = play_tree_parser_get_play_tree(libinput,ptp); - play_tree_parser_free(ptp); + ptp = new(zeromem) PlayTree_Parser(stream,deep+1); + pt = ptp->get_play_tree(libinput); + delete ptp; delete stream; return pt; } @@ -386,7 +386,6 @@ } else mpxp_dbg2<<"Ignoring element "<<element.name()<<std::endl; } if(nref <= 0) { - pt_ref->free(1); delete pt_ref; return NULL; } @@ -446,7 +445,6 @@ } if(!list) { - pt_repeat->free(1); delete pt_repeat; return NULL; } @@ -526,7 +524,6 @@ delete &parser; if(!list) { - asx->free(1); delete asx; return NULL; } Modified: mplayerxp/libplaytree/playtree.cpp =================================================================== --- mplayerxp/libplaytree/playtree.cpp 2012-12-28 12:53:00 UTC (rev 618) +++ mplayerxp/libplaytree/playtree.cpp 2012-12-28 13:49:55 UTC (rev 619) @@ -12,13 +12,42 @@ #include "libmpstream2/stream.h" #include "libmpconf/cfgparser.h" #include "playtree.h" +#include "playtreeparser.h" #include "playtree_msg.h" namespace mpxp { +PlayTree* PlayTree::parse_playtree(libinput_t&libinput,Stream* stream) { + PlayTree_Parser* p; + PlayTree* ret; + p = new(zeromem) PlayTree_Parser(stream,0); + if(!p) return NULL; + + ret = p->get_play_tree(libinput); + delete p; + + return ret; +} + +PlayTree* PlayTree::parse_playlist_file(libinput_t&libinput,const std::string& file) { + Stream *stream; + PlayTree* ret; + int ff; + + mpxp_v<<"Parsing playlist file "<<file<<"..."<<std::endl; + ff=0; + stream = new(zeromem) Stream; + stream->open(libinput,file,&ff); + stream->type(Stream::Type_Text); + ret = PlayTree::parse_playtree(libinput,stream); + delete stream; + + return ret; +} + PlayTree::PlayTree() :entry_type(PLAY_TREE_ENTRY_NODE) {} -PlayTree::~PlayTree() {} +PlayTree::~PlayTree() { free_list(1); } void PlayTree::free(int childs) { PlayTree* iter; Modified: mplayerxp/libplaytree/playtree.h =================================================================== --- mplayerxp/libplaytree/playtree.h 2012-12-28 12:53:00 UTC (rev 618) +++ mplayerxp/libplaytree/playtree.h 2012-12-28 13:49:55 UTC (rev 619) @@ -60,7 +60,6 @@ virtual MPXP_Rc cleanup(); // If childs is true mp_free also the childs virtual void free(int childs); - virtual void free_list(int childs); virtual void set_child(PlayTree* child); virtual void set_parent(PlayTree* parent); @@ -98,6 +97,8 @@ int get_flags() const { return flags; } void set_flags(int f) { flags=f; } private: + void free_list(int childs); + PlayTree* parent; PlayTree* child; PlayTree* next; Modified: mplayerxp/libplaytree/playtreeparser.cpp =================================================================== --- mplayerxp/libplaytree/playtreeparser.cpp 2012-12-28 12:53:00 UTC (rev 618) +++ mplayerxp/libplaytree/playtreeparser.cpp 2012-12-28 13:49:55 UTC (rev 619) @@ -16,8 +16,9 @@ #include "playtreeparser.h" #include "playtree_msg.h" -static const int BUF_STEP=1024; +namespace mpxp { +static const int BUF_STEP=1024; static const char* WHITES=" \n\r\t"; static void __FASTCALL__ strstrip(char* str) { @@ -34,154 +35,133 @@ str[0] = '\0'; } -static char* __FASTCALL__ play_tree_parser_get_line(play_tree_parser_t* p) { - char *end,*line_end; - int r,resize = 0; +char* PlayTree_Parser::get_line() { + char *end,*line_end; + int r,resize = 0; - if(p->buffer == NULL) { - p->buffer = (char*)mp_malloc(BUF_STEP); - p->buffer_size = BUF_STEP; - p->iter = p->buffer; - } + if(buffer == NULL) { + buffer = new char [BUF_STEP]; + buffer_size = BUF_STEP; + iter = buffer; + } - if(p->stream->eof() && (p->buffer_end == 0 || p->iter[0] == '\0')) - return NULL; + if(stream->eof() && (buffer_end == 0 || iter[0] == '\0')) return NULL; - while(1) { + while(1) { + if(resize) { + r = iter - buffer; + buffer = (char*)mp_realloc(buffer,buffer_size+BUF_STEP); + iter = buffer + r; + buffer_size += BUF_STEP; + resize = 0; + } - if(resize) { - r = p->iter - p->buffer; - p->buffer = (char*)mp_realloc(p->buffer,p->buffer_size+BUF_STEP); - p->iter = p->buffer + r; - p->buffer_size += BUF_STEP; - resize = 0; - } + if(buffer_size - buffer_end > 1 && !stream->eof()) { + r = stream->read(buffer + buffer_end,buffer_size - buffer_end - 1); + if(r > 0) { + buffer_end += r; + buffer[buffer_end] = '\0'; + } + } - if(p->buffer_size - p->buffer_end > 1 && !p->stream->eof()) { - r = p->stream->read(p->buffer + p->buffer_end,p->buffer_size - p->buffer_end - 1); - if(r > 0) { - p->buffer_end += r; - p->buffer[p->buffer_end] = '\0'; - } - } - - end = strchr(p->iter,'\n'); - if(!end) { - if(p->stream->eof()) { - end = p->buffer + p->buffer_end; + end = strchr(iter,'\n'); + if(!end) { + if(stream->eof()) { + end = buffer + buffer_end; + break; + } + resize = 1; + continue; + } break; - } - resize = 1; - continue; } - break; - } - - line_end = (end > p->iter && *(end-1) == '\r') ? end-1 : end; - if(line_end - p->iter >= 0) - p->line = (char*)mp_realloc(p->line,line_end - p->iter+1); - else - return NULL; - if(line_end - p->iter > 0) - strncpy(p->line,p->iter,line_end - p->iter); - p->line[line_end - p->iter] = '\0'; - if(end[0] != '\0') - end++; - - if(!p->keep) { - if(end[0] != '\0') { - p->buffer_end -= end-p->iter; - memmove(p->buffer,end,p->buffer_end); - } else - p->buffer_end = 0; - p->iter = p->buffer; - } else - p->iter = end; - - return p->line; + line_end = (end > iter && *(end-1) == '\r') ? end-1 : end; + if(line_end - iter >= 0) + line = (char*)mp_realloc(line,line_end - iter+1); + else + return NULL; + if(line_end - iter > 0) + strncpy(line,iter,line_end - iter); + line[line_end - iter] = '\0'; + if(end[0] != '\0') end++; + if(!keep) { + if(end[0] != '\0') { + buffer_end -= end-iter; + memmove(buffer,end,buffer_end); + } else + buffer_end = 0; + iter = buffer; + } else iter = end; + return line; } -static void __FASTCALL__ play_tree_parser_reset(play_tree_parser_t* p) { - p->iter = p->buffer; -} +void PlayTree_Parser::reset() { iter = buffer; } -static void __FASTCALL__ play_tree_parser_stop_keeping(play_tree_parser_t* p) { - p->keep = 0; - if(p->iter && p->iter != p->buffer) { - p->buffer_end -= p->iter -p->buffer; - if(p->buffer_end) - memmove(p->buffer,p->iter,p->buffer_end); - p->iter = p->buffer; - } +void PlayTree_Parser::stop_keeping() { + keep = 0; + if(iter && iter != buffer) { + buffer_end -= iter - buffer; + if(buffer_end) memmove(buffer,iter,buffer_end); + iter = buffer; + } } +PlayTree* PlayTree_Parser::parse_asx(libinput_t& libinput) { + int comments = 0,_get_line = 1; + char* _line = NULL; -static PlayTree* parse_asx(libinput_t& libinput,play_tree_parser_t* p) { - int comments = 0,get_line = 1; - char* line = NULL; + mpxp_v<<"Trying asx..."<<std::endl; - mpxp_v<<"Trying asx..."<<std::endl; - - while(1) { - if(get_line) { - line = play_tree_parser_get_line(p); - if(!line) - return NULL; - strstrip(line); - if(line[0] == '\0') - continue; - } - if(!comments) { - if(line[0] != '<') { - mpxp_dbg2<<"First char isn't '<' but '"<<line[0]<<"'"<<std::endl; - mpxp_dbg3<<"Buffer = ["<<p->buffer<<"]"<<std::endl; - return NULL; - } else if(strncmp(line,"<!--",4) == 0) { // Comments - comments = 1; - line += 4; - if(line[0] != '\0' && strlen(line) > 0) - get_line = 0; - } else if(strncasecmp(line,"<ASX",4) == 0) // We got an asx element - break; - else // We don't get an asx - return NULL; - } else { // Comments - char* c; - c = strchr(line,'-'); - if(c) { - if (strncmp(c,"--!>",4) == 0) { // End of comments - comments = 0; - line = c+4; - if(line[0] != '\0') // There is some more data on this line : keep it - get_line = 0; - - } else { - line = c+1; // Jump the - - if(line[0] != '\0') // Some more data - get_line = 0; - else // End of line - get_line = 1; + while(1) { + if(_get_line) { + _line = get_line(); + if(!_line) return NULL; + strstrip(_line); + if(_line[0] == '\0') continue; } - } else // No - on this line (or rest of line) : get next one - get_line = 1; + if(!comments) { + if(_line[0] != '<') { + mpxp_dbg2<<"First char isn't '<' but '"<<_line[0]<<"'"<<std::endl; + mpxp_dbg3<<"Buffer = ["<<buffer<<"]"<<std::endl; + return NULL; + } else if(strncmp(_line,"<!--",4) == 0) { // Comments + comments = 1; + _line += 4; + if(_line[0] != '\0' && strlen(_line) > 0) _get_line = 0; + } else if(strncasecmp(_line,"<ASX",4) == 0) // We got an asx element + break; + else // We don't get an asx + return NULL; + } else { // Comments + char* c; + c = strchr(_line,'-'); + if(c) { + if(strncmp(c,"--!>",4) == 0) { // End of comments + comments = 0; + _line = c+4; + if(_line[0] != '\0') _get_line = 0; // There is some more data on this line : keep it + } else { + _line = c+1; // Jump the - + if(_line[0] != '\0') // Some more data + _get_line = 0; + else // End of line + _get_line = 1; + } + } else // No - on this line (or rest of line) : get next one + _get_line = 1; + } } - } - - mpxp_v<<"Detected asx format"<<std::endl; - - // We have an asx : load it in memory and parse - - while((line = play_tree_parser_get_line(p)) != NULL) - /* NOTHING */; - - mpxp_dbg3<<"Parsing asx file : ["<<p->buffer<<"]"<<std::endl; - return ASX_Parser::build_tree(libinput,p->buffer,p->deep); + mpxp_v<<"Detected asx format"<<std::endl; + // We have an asx : load it in memory and parse + while((_line = get_line()) != NULL)/* NOTHING */; + mpxp_dbg3<<"Parsing asx file : ["<<buffer<<"]"<<std::endl; + return ASX_Parser::build_tree(libinput,buffer,deep); } -static char* __FASTCALL__ pls_entry_get_value(char* line) { +static char* __FASTCALL__ pls_entry_get_value(const char* line) { char* i; - i = strchr(line,'='); + i = strchr(const_cast<char*>(line),'='); if(!i || i[1] == '\0') return NULL; else @@ -194,7 +174,7 @@ char* length; }; -static int __FASTCALL__ pls_read_entry(char* line,pls_entry_t** _e,int* _max_entry,char** val) { +static int __FASTCALL__ pls_read_entry(const char* line,pls_entry_t** _e,int* _max_entry,char** val) { int num,max_entry = (*_max_entry); pls_entry_t* e = (*_e); char* v; @@ -224,199 +204,134 @@ } -PlayTree* -parse_pls(play_tree_parser_t* p) { - char *line,*v; - pls_entry_t* entries = NULL; - int n_entries = 0,max_entry=0,num; - PlayTree *list = NULL, *entry = NULL; +PlayTree* PlayTree_Parser::parse_pls() { + char *_line,*v; + pls_entry_t* entries = NULL; + int n_entries = 0,max_entry=0,num; + PlayTree *list = NULL, *entry = NULL; - mpxp_v<<"Trying winamp playlist..."<<std::endl; - line = play_tree_parser_get_line(p); - strstrip(line); - if(strcasecmp(line,"[playlist]")) - return NULL; - mpxp_v<<"Detected winamp playlist format"<<std::endl; - play_tree_parser_stop_keeping(p); - line = play_tree_parser_get_line(p); - if(!line) - return NULL; - strstrip(line); - if(strncasecmp(line,"NumberOfEntries",15) == 0) { - v = pls_entry_get_value(line); - n_entries = atoi(v); - if(n_entries < 0) - mpxp_dbg2<<"Invalid number of entries : very funny !!!"<<std::endl; - else - mpxp_dbg2<<"Playlist claim to have "<<n_entries<<" entries. Let's see"<<std::endl; - line = play_tree_parser_get_line(p); - } + mpxp_v<<"Trying winamp playlist..."<<std::endl; + _line = get_line(); + strstrip(_line); + if(strcasecmp(_line,"[playlist]")) return NULL; + mpxp_v<<"Detected winamp playlist format"<<std::endl; + stop_keeping(); + _line = get_line(); + if(!_line) return NULL; + strstrip(_line); + if(strncasecmp(_line,"NumberOfEntries",15) == 0) { + v = pls_entry_get_value(_line); + n_entries = atoi(v); + if(n_entries < 0) mpxp_dbg2<<"Invalid number of entries : very funny !!!"<<std::endl; + else mpxp_dbg2<<"Playlist claim to have "<<n_entries<<" entries. Let's see"<<std::endl; + _line = get_line(); + } - while(line) { - strstrip(line); - if(line[0] == '\0') { - line = play_tree_parser_get_line(p); - continue; + while(_line) { + strstrip(_line); + if(_line[0] == '\0') { + _line = get_line(); + continue; + } + if(strncasecmp(_line,"File",4) == 0) { + num = pls_read_entry(_line+4,&entries,&max_entry,&v); + if(num < 0) mpxp_err<<"No value in entry "<<_line<<std::endl; + else entries[num-1].file = mp_strdup(v); + } else if(strncasecmp(_line,"Title",5) == 0) { + num = pls_read_entry(_line+5,&entries,&max_entry,&v); + if(num < 0) mpxp_err<<"No value in entry "<<_line<<std::endl; + else entries[num-1].title = mp_strdup(v); + } else if(strncasecmp(_line,"Length",6) == 0) { + num = pls_read_entry(_line+6,&entries,&max_entry,&v); + if(num < 0) mpxp_err<<"No value in entry "<<_line<<std::endl; + else entries[num-1].length = mp_strdup(v); + } else mpxp_warn<<"Unknow entry type "<<_line<<std::endl; + _line = get_line(); } - if(strncasecmp(line,"File",4) == 0) { - num = pls_read_entry(line+4,&entries,&max_entry,&v); - if(num < 0) - mpxp_err<<"No value in entry "<<line<<std::endl; - else - entries[num-1].file = mp_strdup(v); - } else if(strncasecmp(line,"Title",5) == 0) { - num = pls_read_entry(line+5,&entries,&max_entry,&v); - if(num < 0) - mpxp_err<<"No value in entry "<<line<<std::endl; - else - entries[num-1].title = mp_strdup(v); - } else if(strncasecmp(line,"Length",6) == 0) { - num = pls_read_entry(line+6,&entries,&max_entry,&v); - if(num < 0) - mpxp_err<<"No value in entry "<<line<<std::endl; - else - entries[num-1].length = mp_strdup(v); - } else - mpxp_warn<<"Unknow entry type "<<line<<std::endl; - line = play_tree_parser_get_line(p); - } - for(num = 0; num < max_entry ; num++) { - if(entries[num].file == NULL) - mpxp_err<<"Entry "<<(num+1)<<" don't have a file !!!!"<<std::endl; - else { - mpxp_dbg2<<"Adding entry "<<entries[num].file<<std::endl; - entry = new(zeromem) PlayTree; - entry->add_file(entries[num].file); - delete entries[num].file; - if(list) - list->append_entry(entry); - else - list = entry; + for(num = 0; num < max_entry ; num++) { + if(entries[num].file == NULL) + mpxp_err<<"Entry "<<(num+1)<<" don't have a file !!!!"<<std::endl; + else { + mpxp_dbg2<<"Adding entry "<<entries[num].file<<std::endl; + entry = new(zeromem) PlayTree; + entry->add_file(entries[num].file); + delete entries[num].file; + if(list) list->append_entry(entry); + else list = entry; + } + if(entries[num].title) { + // When we have info in playtree we add this info + delete entries[num].title; + } + if(entries[num].length) { + // When we have info in playtree we add this info + delete entries[num].length; + } } - if(entries[num].title) { - // When we have info in playtree we add this info - delete entries[num].title; - } - if(entries[num].length) { - // When we have info in playtree we add this info - delete entries[num].length; - } - } + delete entries; - delete entries; - - entry = new(zeromem) PlayTree; - entry->set_child(list); - return entry; + entry = new(zeromem) PlayTree; + entry->set_child(list); + return entry; } -PlayTree* -parse_textplain(play_tree_parser_t* p) { - char* line; - PlayTree *list = NULL, *entry = NULL; +PlayTree* PlayTree_Parser::parse_textplain() { + char* _line; + PlayTree *list = NULL, *entry = NULL; - mpxp_v<<"Trying plaintext..."<<std::endl; - play_tree_parser_stop_keeping(p); + mpxp_v<<"Trying plaintext..."<<std::endl; + stop_keeping(); - while((line = play_tree_parser_get_line(p)) != NULL) { - strstrip(line); - if(line[0] == '\0') - continue; + while((_line = get_line()) != NULL) { + strstrip(_line); + if(_line[0] == '\0') continue; + entry = new(zeromem) PlayTree; + entry->add_file(_line); + if(!list) list = entry; + else list->append_entry(entry); + } + if(!list) return NULL; entry = new(zeromem) PlayTree; - entry->add_file(line); - if(!list) - list = entry; - else - list->append_entry(entry); - } - - if(!list) return NULL; - entry = new(zeromem) PlayTree; - entry->set_child(list); - return entry; + entry->set_child(list); + return entry; } -namespace mpxp { -PlayTree* PlayTree::parse_playtree(libinput_t&libinput,Stream* stream) { - play_tree_parser_t* p; - PlayTree* ret; - - p = play_tree_parser_new(stream,0); - if(!p) - return NULL; - - ret = play_tree_parser_get_play_tree(libinput,p); - play_tree_parser_free(p); - - return ret; +PlayTree_Parser::PlayTree_Parser(Stream* _stream,int _deep) + :stream(_stream), + deep(_deep) +{ + keep = 1; } -PlayTree* PlayTree::parse_playlist_file(libinput_t&libinput,const std::string& file) { - Stream *stream; - PlayTree* ret; - int ff; - - mpxp_v<<"Parsing playlist file "<<file<<"..."<<std::endl; - ff=0; - stream = new(zeromem) Stream; - stream->open(libinput,file,&ff); - stream->type(Stream::Type_Text); - ret = PlayTree::parse_playtree(libinput,stream); - delete stream; - - return ret; +PlayTree_Parser::~PlayTree_Parser() { + if(buffer) delete buffer; + if(line) delete line; } -} // namespace mpxp -play_tree_parser_t* play_tree_parser_new(Stream* stream,int deep) { - play_tree_parser_t* p; +PlayTree* PlayTree_Parser::get_play_tree(libinput_t& libinput) { + PlayTree* tree = NULL; - p = (play_tree_parser_t*)mp_calloc(1,sizeof(play_tree_parser_t)); - if(!p) - return NULL; - p->stream = stream; - p->deep = deep; - p->keep = 1; + while(get_line() != NULL) { + reset(); - return p; + tree = parse_asx(libinput); + if(tree) break; + reset(); -} + tree = parse_pls(); + if(tree) break; + reset(); -void -play_tree_parser_free(play_tree_parser_t* p) { + // Here come the others formats ( textplain must stay the last one ) + tree = parse_textplain(); + if(tree) break; + break; + } - if(p->buffer) delete p->buffer; - if(p->line) delete p->line; - delete p; + if(tree) mpxp_v<<"Playlist succefully parsed"<<std::endl; + else mpxp_err<<"Error while parsing playlist"<<std::endl; + if(tree->cleanup()!=MPXP_Ok) mpxp_warn<<"Warning empty playlist"<<std::endl; + return tree; } - -PlayTree* -play_tree_parser_get_play_tree(libinput_t& libinput,play_tree_parser_t* p) { - PlayTree* tree = NULL; - - while(play_tree_parser_get_line(p) != NULL) { - play_tree_parser_reset(p); - - tree = parse_asx(libinput,p); - if(tree) break; - play_tree_parser_reset(p); - - tree = parse_pls(p); - if(tree) break; - play_tree_parser_reset(p); - - // Here come the others formats ( textplain must stay the last one ) - tree = parse_textplain(p); - if(tree) break; - break; - } - - if(tree) - mpxp_v<<"Playlist succefully parsed"<<std::endl; - else mpxp_err<<"Error while parsing playlist"<<std::endl; - - if(tree->cleanup()!=MPXP_Ok) mpxp_warn<<"Warning empty playlist"<<std::endl; - - return tree; -} +} // namespace mpxp Modified: mplayerxp/libplaytree/playtreeparser.h =================================================================== --- mplayerxp/libplaytree/playtreeparser.h 2012-12-28 12:53:00 UTC (rev 618) +++ mplayerxp/libplaytree/playtreeparser.h 2012-12-28 13:49:55 UTC (rev 619) @@ -1,19 +1,32 @@ #ifndef __PLAYTREEPARSER_H #define __PLAYTREEPARSER_H +#include "osdep/mplib.h" #include "playtree.h" -struct play_tree_parser_t { - Stream* stream; - char *buffer,*iter,*line; - int buffer_size , buffer_end; - int deep,keep; -}; +namespace mpxp { + class PlayTree_Parser : public Opaque { + public: + PlayTree_Parser(Stream* _stream,int _deep); + virtual ~PlayTree_Parser(); -play_tree_parser_t* play_tree_parser_new(Stream * stream,int deep); + virtual PlayTree* get_play_tree(libinput_t&libinput); + private: + void reset(); + char* get_line(); + void stop_keeping(); + PlayTree* parse_asx(libinput_t& libinput); + PlayTree* parse_pls(); + PlayTree* parse_textplain(); -void play_tree_parser_free(play_tree_parser_t* p); - -PlayTree* play_tree_parser_get_play_tree(libinput_t&libinput,play_tree_parser_t* p); - + Stream* stream; + char* buffer; + char* iter; + char* line; + int buffer_size; + int buffer_end; + int deep; + int keep; + }; +}// namespace mpxp #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |