[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[552] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-12-12 16:21:14
|
Revision: 552 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=552&view=rev Author: nickols_k Date: 2012-12-12 16:21:04 +0000 (Wed, 12 Dec 2012) Log Message: ----------- new: class ASX_Element + minor redesign & segault-- Modified Paths: -------------- mplayerxp/libplaytree/asxparser.cpp mplayerxp/libplaytree/asxparser.h mplayerxp/postproc/libmenu/menu.cpp mplayerxp/postproc/libmenu/menu_cmdlist.cpp mplayerxp/postproc/libmenu/menu_param.cpp Modified: mplayerxp/libplaytree/asxparser.cpp =================================================================== --- mplayerxp/libplaytree/asxparser.cpp 2012-12-12 15:33:11 UTC (rev 551) +++ mplayerxp/libplaytree/asxparser.cpp 2012-12-12 16:21:04 UTC (rev 552) @@ -24,8 +24,8 @@ ASX_Parser::ASX_Parser() {} ASX_Parser::~ASX_Parser() { if(ret_stack) delete ret_stack; } -int ASX_Parser::parse_attribs(char* buffer,ASX_Attrib& _attribs) const { - char *ptr1, *ptr2, *ptr3; +int ASX_Parser::parse_attribs(const char* buffer,ASX_Attrib& _attribs) const { + const char *ptr1, *ptr2, *ptr3; int n_attrib = 0; char *attrib, *val; @@ -75,8 +75,7 @@ /* * Return -1 on error, 0 when nothing is found, 1 on sucess */ -int ASX_Parser::get_element(const char** _buffer, char** _element, - char** _body,ASX_Attrib& _attribs) { +int ASX_Parser::get_element(const char** _buffer, ASX_Element& _element) { const char *ptr1,*ptr2, *ptr3, *ptr4; char *cattribs = NULL; char *element = NULL, *body = NULL; @@ -85,13 +84,12 @@ int n_attrib = 0; int body_line = 0,attrib_line,ret_line,in = 0; - if(_buffer == NULL || _element == NULL || _body == NULL) { + if(_buffer == NULL) { MSG_ERR("At line %d : asx_get_element called with invalid value",line); return -1; } - _attribs.clear(); - *_body = *_element = NULL; + _element.clear(); buffer = *_buffer; if(buffer == NULL) return 0; @@ -267,7 +265,7 @@ if(cattribs) { line = attrib_line; - n_attrib = parse_attribs(cattribs,_attribs); + n_attrib = parse_attribs(cattribs,_element.attribs()); delete cattribs; if(n_attrib < 0) { MSG_WARN("At line %d : error while parsing element %s attributes",line,element); @@ -275,10 +273,10 @@ delete body; return -1; } - } else _attribs.clear(); + } else _element.attribs().clear(); - *_element = element; - *_body = body; + _element.name(element?element:""); + _element.body(body?body:""); last_body = body; ret_stack_size++; @@ -326,7 +324,7 @@ MSG_V("Adding file %s to element entry\n",href.c_str()); } -play_tree_t* ASX_Parser::entryref(libinput_t* libinput,char* buffer,ASX_Attrib& _attribs) const { +play_tree_t* ASX_Parser::entryref(libinput_t* libinput,const char* buffer,ASX_Attrib& _attribs) const { play_tree_t* pt; std::string href; Stream* stream; @@ -362,8 +360,7 @@ } play_tree_t* ASX_Parser::entry(const char* buffer,ASX_Attrib& _attribs) { - char *celement,*body; - ASX_Attrib cattribs; + ASX_Element element; int r,nref=0; play_tree_t *pt_ref; UNUSED(_attribs); @@ -371,17 +368,16 @@ pt_ref = play_tree_new(); while(buffer && buffer[0] != '\0') { - r = get_element(&buffer,&celement,&body,cattribs); + r = get_element(&buffer,element); if(r < 0) { warning_body_parse_error("ENTRY"); return NULL; } else if (r == 0) break; // No more element - if(strcasecmp(celement,"REF") == 0) { - ref(cattribs,pt_ref); - MSG_DBG2("Adding element %s to entry\n",celement); + if(strcasecmp(element.name().c_str(),"REF") == 0) { + ref(element.attribs(),pt_ref); + MSG_DBG2("Adding element %s to entry\n",element.name().c_str()); nref++; - } else MSG_DBG2("Ignoring element %s\n",celement); - if(body) delete body; + } else MSG_DBG2("Ignoring element %s\n",element.name().c_str()); } if(nref <= 0) { play_tree_free(pt_ref,1); @@ -391,8 +387,7 @@ } play_tree_t* ASX_Parser::repeat(libinput_t*libinput,const char* buffer,ASX_Attrib& _attribs) { - char *element,*body; - ASX_Attrib cattribs; + ASX_Element element; play_tree_t *pt_repeat, *list=NULL, *pt_entry; std::string count; int r; @@ -410,36 +405,35 @@ } while(buffer && buffer[0] != '\0') { - r = get_element(&buffer,&element,&body,cattribs); + r = get_element(&buffer,element); if(r < 0) { warning_body_parse_error("REPEAT"); return NULL; } else if (r == 0) break; // No more element - if(strcasecmp(element,"ENTRY") == 0) { - pt_entry = entry(body,cattribs); + if(strcasecmp(element.name().c_str(),"ENTRY") == 0) { + pt_entry = entry(element.body().c_str(),element.attribs()); if(pt_entry) { if(!list) list = pt_entry; else play_tree_append_entry(list,pt_entry); - MSG_DBG2("Adding element %s to repeat\n",element); + MSG_DBG2("Adding element %s to repeat\n",element.name().c_str()); } - } else if(strcasecmp(element,"ENTRYREF") == 0) { - pt_entry = entryref(libinput,body,cattribs); + } else if(strcasecmp(element.name().c_str(),"ENTRYREF") == 0) { + pt_entry = entryref(libinput,element.body().c_str(),element.attribs()); if(pt_entry) { if(!list) list = pt_entry; else play_tree_append_entry(list,pt_entry); - MSG_DBG2("Adding element %s to repeat\n",element); + MSG_DBG2("Adding element %s to repeat\n",element.name().c_str()); } - } else if(strcasecmp(element,"REPEAT") == 0) { - pt_entry = repeat(libinput,body,cattribs); + } else if(strcasecmp(element.name().c_str(),"REPEAT") == 0) { + pt_entry = repeat(libinput,element.body().c_str(),element.attribs()); if(pt_entry) { if(!list) list = pt_entry; else play_tree_append_entry(list,pt_entry); - MSG_DBG2("Adding element %s to repeat\n",element); + MSG_DBG2("Adding element %s to repeat\n",element.name().c_str()); } - } else if(strcasecmp(element,"PARAM") == 0) { - param(cattribs,pt_repeat); - } else MSG_DBG2("Ignoring element %s\n",element); - if(body) delete body; + } else if(strcasecmp(element.name().c_str(),"PARAM") == 0) { + param(element.attribs(),pt_repeat); + } else MSG_DBG2("Ignoring element %s\n",element.name().c_str()); } if(!list) { @@ -451,8 +445,7 @@ } play_tree_t* ASX_Parser::build_tree(libinput_t*libinput,const char* buffer,int deep) { - char *element,*asx_body,*body; - ASX_Attrib asx_attribs,attribs; + ASX_Element asx_element,element; int r; play_tree_t *asx,*pt_entry,*list = NULL; ASX_Parser& parser = *new(zeromem) ASX_Parser; @@ -460,7 +453,7 @@ parser.line = 1; parser.deep = deep; - r = parser.get_element(&buffer,&element,&asx_body,asx_attribs); + r = parser.get_element(&buffer,asx_element); if(r < 0) { MSG_ERR("At line %d : Syntax error ???",parser.line); delete &parser; @@ -471,54 +464,51 @@ return NULL; } - if(strcasecmp(element,"ASX") != 0) { - MSG_ERR("first element isn't ASX, it's %s\n",element); - if(body) delete body; + if(strcasecmp(element.name().c_str(),"ASX") != 0) { + MSG_ERR("first element isn't ASX, it's %s\n",element.name().c_str()); delete &parser; return NULL; } - if(!asx_body) { + if(asx_element.body().empty()) { MSG_ERR("ASX element is empty"); delete &parser; return NULL; } asx = play_tree_new(); - buffer = asx_body; + buffer = asx_element.body().c_str(); while(buffer && buffer[0] != '\0') { - r = parser.get_element(&buffer,&element,&body,attribs); + r = parser.get_element(&buffer,element); if(r < 0) { parser.warning_body_parse_error("ASX"); delete &parser; return NULL; } else if (r == 0) break; // No more element - if(strcasecmp(element,"ENTRY") == 0) { - pt_entry = parser.entry(body,attribs); + if(strcasecmp(element.name().c_str(),"ENTRY") == 0) { + pt_entry = parser.entry(element.body().c_str(),element.attribs()); if(pt_entry) { if(!list) list = pt_entry; else play_tree_append_entry(list,pt_entry); - MSG_DBG2("Adding element %s to asx\n",element); + MSG_DBG2("Adding element %s to asx\n",element.name().c_str()); } - } else if(strcasecmp(element,"ENTRYREF") == 0) { - pt_entry = parser.entryref(libinput,body,attribs); + } else if(strcasecmp(element.name().c_str(),"ENTRYREF") == 0) { + pt_entry = parser.entryref(libinput,element.body().c_str(),element.attribs()); if(pt_entry) { if(!list) list = pt_entry; else play_tree_append_entry(list,pt_entry); - MSG_DBG2("Adding element %s to asx\n",element); + MSG_DBG2("Adding element %s to asx\n",element.name().c_str()); } - } else if(strcasecmp(element,"REPEAT") == 0) { - pt_entry = parser.repeat(libinput,body,attribs); + } else if(strcasecmp(element.name().c_str(),"REPEAT") == 0) { + pt_entry = parser.repeat(libinput,element.body().c_str(),element.attribs()); if(pt_entry) { if(!list) list = pt_entry; else play_tree_append_entry(list,pt_entry); - MSG_DBG2("Adding element %s to asx\n",element); + MSG_DBG2("Adding element %s to asx\n",element.name().c_str()); } - } else MSG_DBG2("Ignoring element %s\n",element); - if(body) delete body; + } else MSG_DBG2("Ignoring element %s\n",element.name().c_str()); } - delete asx_body; delete &parser; if(!list) { Modified: mplayerxp/libplaytree/asxparser.h =================================================================== --- mplayerxp/libplaytree/asxparser.h 2012-12-12 15:33:11 UTC (rev 551) +++ mplayerxp/libplaytree/asxparser.h 2012-12-12 16:21:04 UTC (rev 552) @@ -28,6 +28,24 @@ std::map<std::string,std::string,ASX_Attrib::stricomp> _attrib; }; + class ASX_Element { + public: + ASX_Element() {} + ~ASX_Element() {} + + const std::string& name(const std::string& s) { return _name=s; } + const std::string& body(const std::string& s) { return _body=s; } + ASX_Attrib& attribs(ASX_Attrib& a) { return _attribs=a; } + const std::string& name() const { return _name; } + const std::string& body() const { return _body; } + ASX_Attrib& attribs() { return _attribs; } + void clear() { name(""); body(""); attribs().clear(); } + private: + std::string _name; + std::string _body; + ASX_Attrib _attribs; + }; + class ASX_Parser : public Opaque { public: ASX_Parser(); @@ -35,19 +53,19 @@ static play_tree_t* build_tree(libinput_t* libinput,const char* buffer, int ref); - virtual int parse_attribs(char* buffer,ASX_Attrib& _attribs) const; + virtual int parse_attribs(const char* buffer,ASX_Attrib& _attribs) const; /* * Return -1 on error, 0 when nothing is found, 1 on sucess */ - virtual int get_element(const char** _buffer,char** _element,char** _body,ASX_Attrib& _attribs); + virtual int get_element(const char** _buffer,ASX_Element& _attribs); int get_line() const { return line; } private: play_tree_t* repeat(libinput_t*libinput,const char* buffer,ASX_Attrib& _attribs); - void warning_attrib_required(const char *e, const char *a) const; - void warning_body_parse_error(const char *e) const; + void warning_attrib_required(const char *elem, const char *attr) const; + void warning_body_parse_error(const char *elem) const; void param(ASX_Attrib& attribs, play_tree_t* pt) const; void ref(ASX_Attrib& attribs, play_tree_t* pt) const; - play_tree_t* entryref(libinput_t* libinput,char* buffer,ASX_Attrib& _attribs) const; + play_tree_t* entryref(libinput_t* libinput,const char* buffer,ASX_Attrib& _attribs) const; play_tree_t* entry(const char* buffer,ASX_Attrib& _attribs); int line; // Curent line Modified: mplayerxp/postproc/libmenu/menu.cpp =================================================================== --- mplayerxp/postproc/libmenu/menu.cpp 2012-12-12 15:33:11 UTC (rev 551) +++ mplayerxp/postproc/libmenu/menu.cpp 2012-12-12 16:21:04 UTC (rev 552) @@ -59,15 +59,14 @@ static int menu_parse_config(const char* buffer) { - char *element,*body; std::string name; - ASX_Attrib attribs; + ASX_Element element; menu_info_t* minfo = NULL; int r,i; ASX_Parser& parser = *new(zeromem) ASX_Parser; while(1) { - r = parser.get_element(&buffer,&element,&body,attribs); + r = parser.get_element(&buffer,element); if(r < 0) { MSG_WARN("[libmenu] Syntax error at line: %i\n",parser.get_line()); delete &parser; @@ -77,17 +76,15 @@ return 1; } // Has it a name ? - name = attribs.get("name"); + name = element.attribs().get("name"); if(name.empty()) { MSG_WARN("[libmenu] Menu definitions need a name attrib: %i\n",parser.get_line()); - delete element; - if(body) delete body; continue; } // Try to find this menu type in our list for(i = 0, minfo = NULL ; menu_info_list[i] ; i++) { - if(strcasecmp(element,menu_info_list[i]->name) == 0) { + if(strcasecmp(element.name().c_str(),menu_info_list[i]->name) == 0) { minfo = menu_info_list[i]; break; } @@ -98,9 +95,9 @@ menu_list[menu_count].name = mp_strdup(name.c_str()); menu_list[menu_count].type = minfo; menu_list[menu_count].cfg = m_struct_alloc(&minfo->priv_st); - menu_list[menu_count].args = body; + menu_list[menu_count].args = mp_strdup(element.body().c_str()); std::map<std::string,std::string,ASX_Attrib::stricomp>::iterator it; - std::map<std::string,std::string,ASX_Attrib::stricomp>& _map = attribs.map(); + std::map<std::string,std::string,ASX_Attrib::stricomp>& _map = element.attribs().map(); for(it=_map.begin();it!=_map.end();it++) { std::string sfirst,ssecond; sfirst=(*it).first; @@ -114,11 +111,8 @@ menu_count++; memset(&menu_list[menu_count],0,sizeof(menu_def_t)); } else { - MSG_WARN("[libmenu] Unknown menu type: %s %i\n",element,parser.get_line()); - if(body) delete body; + MSG_WARN("[libmenu] Unknown menu type: %s %i\n",element.name().c_str(),parser.get_line()); } - - delete element; } delete &parser; return 0; @@ -212,6 +206,10 @@ menu_t* m; int i; + if(menu_list == NULL) { + MSG_WARN("[libmenu] Menu was not initialized\n"); + return NULL; + } if(name == NULL) { MSG_WARN("[libmenu] Name of menu was not specified\n"); return NULL; @@ -286,6 +284,8 @@ int c = utf8_get_char((const char**)&txt); render_one_glyph(mpxp_context().video().output->font, c); } +#else + UNUSED(txt); #endif } Modified: mplayerxp/postproc/libmenu/menu_cmdlist.cpp =================================================================== --- mplayerxp/postproc/libmenu/menu_cmdlist.cpp 2012-12-12 15:33:11 UTC (rev 551) +++ mplayerxp/postproc/libmenu/menu_cmdlist.cpp 2012-12-12 16:21:04 UTC (rev 552) @@ -109,15 +109,14 @@ } static int parse_args(menu_t* menu,const char* args) { - char *element,*body; - ASX_Attrib attribs; + ASX_Element element; std::string name; list_entry_t* m = NULL; int r; ASX_Parser& parser = *new(zeromem) ASX_Parser; while(1) { - r = parser.get_element(&args,&element,&body,attribs); + r = parser.get_element(&args,element); if(r < 0) { MSG_WARN("[libmenu] Syntax error at line: %i\n",parser.get_line()); delete &parser; @@ -129,23 +128,18 @@ return m ? 1 : 0; } // Has it a name ? - name = attribs.get("name"); + name = element.attribs().get("name"); if(name.empty()) { MSG_WARN("[libmenu] ListMenu entry definitions need a name: %i\n",parser.get_line()); - delete element; - if(body) delete body; continue; } m = new(zeromem) struct list_entry_s; m->p.txt = mp_strdup(name.c_str()); - m->ok = mp_strdup(attribs.get("ok").c_str()); - m->cancel = mp_strdup(attribs.get("cancel").c_str()); - m->left = mp_strdup(attribs.get("left").c_str()); - m->right = mp_strdup(attribs.get("right").c_str()); + m->ok = mp_strdup(element.attribs().get("ok").c_str()); + m->cancel = mp_strdup(element.attribs().get("cancel").c_str()); + m->left = mp_strdup(element.attribs().get("left").c_str()); + m->right = mp_strdup(element.attribs().get("right").c_str()); menu_list_add_entry(menu,m); - - delete element; - if(body) delete body; } delete &parser; return -1; Modified: mplayerxp/postproc/libmenu/menu_param.cpp =================================================================== --- mplayerxp/postproc/libmenu/menu_param.cpp 2012-12-12 15:33:11 UTC (rev 551) +++ mplayerxp/postproc/libmenu/menu_param.cpp 2012-12-12 16:21:04 UTC (rev 552) @@ -92,8 +92,7 @@ } static int parse_args(menu_t* menu,const char* args) { - char *element,*body; - ASX_Attrib attribs; + ASX_Element element; std::string name,txt; list_entry_t* m = NULL; int r; @@ -101,7 +100,7 @@ ASX_Parser& parser = *new(zeromem) ASX_Parser; while(1) { - r = parser.get_element(&args,&element,&body,attribs); + r = parser.get_element(&args,element); if(r < 0) { MSG_ERR("[libmenu] Syntax error at line: %s\n",parser.get_line()); delete &parser; @@ -115,44 +114,40 @@ menu_list_add_entry(menu,m); return 1; } - if(!strcmp(element,"menu")) { - name = attribs.get("menu"); + if(!strcasecmp(element.name().c_str(),"menu")) { + name = element.attribs().get("menu"); if(name.empty()) { MSG_WARN("[libmenu] Submenu definition need a menu attribut\n"); - goto next_element; + continue; } m = new(zeromem) struct list_entry_s; m->menu = mp_strdup(name.c_str()); - m->p.txt = mp_strdup(attribs.get("name").c_str()); + m->p.txt = mp_strdup(element.attribs().get("name").c_str()); if(!m->p.txt) m->p.txt = mp_strdup(m->menu); menu_list_add_entry(menu,m); - goto next_element; + continue; } - name = attribs.get("property"); + name = element.attribs().get("property"); opt = NULL; if(!name.empty() && mp_property_do(name.c_str(),M_PROPERTY_GET_TYPE,&opt,menu->ctx) <= 0) { MSG_WARN("[libmenu] Invalid property: %s %i\n", name.c_str(),parser.get_line()); - goto next_element; + continue; } - txt = attribs.get("txt"); + txt = element.attribs().get("txt"); if(name.empty() || txt.empty()) { MSG_WARN("[libmenu] PrefMenu entry definitions need: %i\n",parser.get_line()); - goto next_element; + continue; } m = new(zeromem) struct list_entry_s; m->opt = opt; m->txt = mp_strdup(txt.c_str()); m->prop = mp_strdup(name.c_str()); - m->name = mp_strdup(attribs.get("name").c_str()); + m->name = mp_strdup(element.attribs().get("name").c_str()); if(!m->name) m->name = mp_strdup(opt ? opt->name : "-"); entry_set_text(menu,m); menu_list_add_entry(menu,m); - - next_element: - delete element; - if(body) delete body; } delete &parser; return -1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |