X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1d156af3247c862e51a7c62f569a3fd302052a42..7d6a4d96961eac84d05db8bb24c64d39003f6e54:/src/xrc/xmlres.cpp?ds=sidebyside diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index 7a3041e630..fe712f89d5 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -73,6 +73,10 @@ wxDateTime GetXRCFileModTime(const wxString& filename) } // anonymous namespace +// Assign the given value to the specified entry or add a new value with this +// name. +static void XRCID_Assign(const wxString& str_id, int value); + class wxXmlResourceDataRecord { public: @@ -103,7 +107,7 @@ class wxXmlResourceDataRecords : public wxVector // this is a class so that it can be forward-declared }; -WX_DECLARE_HASH_SET(int, wxIntegerHash, wxIntegerEqual, wxHashSetInt); +WX_DECLARE_HASH_SET_PTR(int, ::wxIntegerHash, ::wxIntegerEqual, wxHashSetInt); class wxIdRange // Holds data for a particular rangename { @@ -152,9 +156,6 @@ public: void FinaliseRanges(const wxXmlNode* node) const; // Searches for a known IdRange matching 'name', returning its index or -1 int Find(const wxString& rangename) const; - // Removes, if it exists, an entry from the XRCID table. Used in id-ranges - // to replace defunct or statically-initialised entries with current values - static void RemoveXRCIDEntry(const wxString& idstr); protected: wxIdRange* FindRangeForItem(const wxXmlNode* node, @@ -1216,13 +1217,10 @@ void wxIdRange::Finalise(const wxXmlNode* node) // Create the XRCIDs for (int i=m_start; i <= m_end; ++i) { - // First clear any pre-existing XRCID - // Necessary for wxXmlResource::Unload() followed by Load() - wxIdRangeManager::RemoveXRCIDEntry( - m_name + wxString::Format("[%i]", i-m_start)); + // Ensure that we overwrite any existing value as otherwise + // wxXmlResource::Unload() followed by Load() wouldn't work correctly. + XRCID_Assign(m_name + wxString::Format("[%i]", i-m_start), i); - // Use the second parameter of GetXRCID to force it to take the value i - wxXmlResource::GetXRCID(m_name + wxString::Format("[%i]", i-m_start), i); wxLogTrace("xrcrange", "integer = %i %s now returns %i", i, @@ -1230,10 +1228,8 @@ void wxIdRange::Finalise(const wxXmlNode* node) XRCID((m_name + wxString::Format("[%i]", i-m_start)).mb_str())); } // and these special ones - wxIdRangeManager::RemoveXRCIDEntry(m_name + "[start]"); - wxXmlResource::GetXRCID(m_name + "[start]", m_start); - wxIdRangeManager::RemoveXRCIDEntry(m_name + "[end]"); - wxXmlResource::GetXRCID(m_name + "[end]", m_end); + XRCID_Assign(m_name + "[start]", m_start); + XRCID_Assign(m_name + "[end]", m_end); wxLogTrace("xrcrange","%s[start] = %i %s[end] = %i", m_name.mb_str(),XRCID(wxString(m_name+"[start]").mb_str()), m_name.mb_str(),XRCID(wxString(m_name+"[end]").mb_str())); @@ -1558,7 +1554,7 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) // like "&File..." -- this is illegal in XML, so we use "_File..."): if ( *dt == amp_char ) { - if ( *(++dt) == amp_char ) + if ( dt+1 == str1.end() || *(++dt) == amp_char ) str2 << amp_char; else str2 << wxT('&') << *dt; @@ -2495,6 +2491,31 @@ static inline unsigned XRCIdHash(const char *str_id) return index; } +static void XRCID_Assign(const wxString& str_id, int value) +{ + const wxCharBuffer buf_id(str_id.mb_str()); + const unsigned index = XRCIdHash(buf_id); + + + XRCID_record *oldrec = NULL; + for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next) + { + if (wxStrcmp(rec->key, buf_id) == 0) + { + rec->id = value; + return; + } + oldrec = rec; + } + + XRCID_record **rec_var = (oldrec == NULL) ? + &XRCID_Records[index] : &oldrec->next; + *rec_var = new XRCID_record; + (*rec_var)->key = wxStrdup(str_id); + (*rec_var)->id = value; + (*rec_var)->next = NULL; +} + static int XRCID_Lookup(const char *str_id, int value_if_not_found = wxID_NONE) { const unsigned index = XRCIdHash(str_id); @@ -2700,30 +2721,6 @@ wxString wxXmlResource::FindXRCIDById(int numId) return wxString(); } -/* static */ -void wxIdRangeManager::RemoveXRCIDEntry(const wxString& idstr) -{ - const char *str_id = idstr.mb_str(); - - const unsigned index = XRCIdHash(str_id); - - XRCID_record **p_previousrec = &XRCID_Records[index]; - for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next) - { - if (wxStrcmp(rec->key, str_id) == 0) - { - // Found the item to be removed so delete its record; but first - // remove it from the linked list. - *p_previousrec = rec->next; - free(rec->key); - delete rec; - return; - } - - p_previousrec = &rec->next; - } -} - static void CleanXRCID_Record(XRCID_record *rec) { if (rec)