diff options
author | Martin Reddy <lynx@lindenlab.com> | 2009-09-23 13:57:06 +0000 |
---|---|---|
committer | Martin Reddy <lynx@lindenlab.com> | 2009-09-23 13:57:06 +0000 |
commit | 47abd559082f6023dcdfadd2ec740195b1d07990 (patch) | |
tree | 244c81063dd56a8095a8fc137d89ad87c0e024c5 /indra | |
parent | 658849ee953da606035efba20a6e599ea7e9eb0f (diff) |
EXT-944 EXT-1026: reverting my previous fix for these crashes.
This didn't work on Windows because wchar_t is 2 bytes on that
platform, not 4 bytes (whereas llwchar is 4 bytes everywhere).
Boost's regex methods need to work on wchar_t, but I believe
that using a UTF-16 string would still be prone to crashing on
Windows as UTF-16 is still a variable-length encoding. Besides,
trying to compile a UTF-16 solution generates weird link errors.
Instead, I'm going to fix this problem a different way. And
I'm starting by reverting the previous attempt. Thanks Win32.
Diffstat (limited to 'indra')
-rw-r--r-- | indra/llui/lltextbase.cpp | 2 | ||||
-rw-r--r-- | indra/llui/lltextbox.cpp | 4 | ||||
-rw-r--r-- | indra/llui/lltexteditor.cpp | 11 | ||||
-rw-r--r-- | indra/llui/llurlaction.cpp | 4 | ||||
-rw-r--r-- | indra/llui/llurlentry.cpp | 44 | ||||
-rw-r--r-- | indra/llui/llurlentry.h | 4 | ||||
-rw-r--r-- | indra/llui/llurlregistry.cpp | 12 | ||||
-rw-r--r-- | indra/llui/llurlregistry.h | 3 | ||||
-rw-r--r-- | indra/llui/tests/llurlentry_test.cpp | 34 |
9 files changed, 57 insertions, 61 deletions
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 325c7a8104..cb60b4fe36 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -429,7 +429,7 @@ LLContextMenu *LLTextBase::createUrlContextMenu(const std::string &in_url) // work out the XUI menu file to use for this url LLUrlMatch match; std::string url = in_url; - if (! LLUrlRegistry::instance().findUrl(utf8str_to_wstring(url), match)) + if (! LLUrlRegistry::instance().findUrl(url, match)) { return NULL; } diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 3cde42d75c..810626268f 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -297,7 +297,7 @@ LLWString LLTextBox::getWrappedText(const LLStringExplicit& in_text, F32 max_wid // find the next Url in the text string LLUrlMatch match; - while ( LLUrlRegistry::instance().findUrl(wtext, match)) + while ( LLUrlRegistry::instance().findUrl(wstring_to_utf8str(wtext), match)) { S32 start = match.getStart(); S32 end = match.getEnd() + 1; @@ -573,7 +573,7 @@ void LLTextBox::updateDisplayTextAndSegments() LLWString text = mText.getWString(); // find the next Url in the text string - while ( LLUrlRegistry::instance().findUrl(text, match, + while ( LLUrlRegistry::instance().findUrl(wstring_to_utf8str(text), match, boost::bind(&LLTextBox::onUrlLabelUpdated, this, _1, _2)) ) { // work out the char offset for the start/end of the url diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index f7680a0a2b..983777b747 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -3525,7 +3525,7 @@ void LLTextEditor::appendStyledText(const std::string &new_text, S32 start=0,end=0; LLUrlMatch match; - LLWString text = utf8str_to_wstring(new_text); + std::string text = new_text; while ( LLUrlRegistry::instance().findUrl(text, match, boost::bind(&LLTextEditor::onUrlLabelUpdated, this, _1, _2)) ) { @@ -3549,8 +3549,8 @@ void LLTextEditor::appendStyledText(const std::string &new_text, { part = (S32)LLTextParser::MIDDLE; } - std::string subtext = wstring_to_utf8str(text.substr(0,start)); - appendHighlightedText(subtext, allow_undo, prepend_newline, part, style_params); + std::string subtext=text.substr(0,start); + appendHighlightedText(subtext,allow_undo, prepend_newline, part, style_params); prepend_newline = false; } @@ -3595,8 +3595,7 @@ void LLTextEditor::appendStyledText(const std::string &new_text, } } if (part != (S32)LLTextParser::WHOLE) part=(S32)LLTextParser::END; - if (end < (S32)text.length()) appendHighlightedText(wstring_to_utf8str(text), allow_undo, - prepend_newline, part, style_params); + if (end < (S32)text.length()) appendHighlightedText(text,allow_undo, prepend_newline, part, style_params); } else { @@ -4138,7 +4137,7 @@ void LLTextEditor::updateLinkSegments() LLUrlMatch match; LLStyleSP style = static_cast<LLStyleSP>(segment->getStyle()); std::string url_label = getText().substr(segment->getStart(), segment->getEnd()-segment->getStart()); - if (LLUrlRegistry::instance().findUrl(utf8str_to_wstring(url_label), match)) + if (LLUrlRegistry::instance().findUrl(url_label, match)) { LLStringUtil::trim(url_label); style->setLinkHREF(url_label); diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 7721d0e502..3b689b93c0 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -112,7 +112,7 @@ void LLUrlAction::clickAction(std::string url) void LLUrlAction::teleportToLocation(std::string url) { LLUrlMatch match; - if (LLUrlRegistry::instance().findUrl(utf8str_to_wstring(url), match)) + if (LLUrlRegistry::instance().findUrl(url, match)) { if (! match.getLocation().empty()) { @@ -129,7 +129,7 @@ void LLUrlAction::copyURLToClipboard(std::string url) void LLUrlAction::copyLabelToClipboard(std::string url) { LLUrlMatch match; - if (LLUrlRegistry::instance().findUrl(utf8str_to_wstring(url), match)) + if (LLUrlRegistry::instance().findUrl(url, match)) { LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(match.getLabel())); } diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index e4bcc27428..c20212c375 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -148,8 +148,8 @@ void LLUrlEntryBase::callObservers(const std::string &id, const std::string &lab // LLUrlEntryHTTP::LLUrlEntryHTTP() { - mPattern = boost::wregex(L"https?://([-\\w\\.]+)+(:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?/?\\S*", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("https?://([-\\w\\.]+)+(:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?/?\\S*", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_http.xml"; mTooltip = LLTrans::getString("TooltipHttpUrl"); //mIcon = "gear.tga"; @@ -166,8 +166,8 @@ std::string LLUrlEntryHTTP::getLabel(const std::string &url, const LLUrlLabelCal // LLUrlEntryHTTPLabel::LLUrlEntryHTTPLabel() { - mPattern = boost::wregex(L"\\[https?://\\S+[ \t]+[^\\]]+\\]", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("\\[https?://\\S+[ \t]+[^\\]]+\\]", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_http.xml"; mTooltip = LLTrans::getString("TooltipHttpUrl"); } @@ -188,8 +188,8 @@ std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string) LLUrlEntrySLURL::LLUrlEntrySLURL() { // see http://slurl.com/about.php for details on the SLURL format - mPattern = boost::wregex(L"http://slurl.com/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("http://slurl.com/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slurl.xml"; mTooltip = LLTrans::getString("TooltipSLURL"); } @@ -260,8 +260,8 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const // LLUrlEntryAgent::LLUrlEntryAgent() { - mPattern = boost::wregex(L"secondlife:///app/agent/[\\da-f-]+/about", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("secondlife:///app/agent/[\\da-f-]+/about", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_agent.xml"; mTooltip = LLTrans::getString("TooltipAgentUrl"); } @@ -302,8 +302,8 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa // LLUrlEntryGroup::LLUrlEntryGroup() { - mPattern = boost::wregex(L"secondlife:///app/group/[\\da-f-]+/about", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("secondlife:///app/group/[\\da-f-]+/about", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_group.xml"; mTooltip = LLTrans::getString("TooltipGroupUrl"); } @@ -344,8 +344,8 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa /// LLUrlEntryParcel::LLUrlEntryParcel() { - mPattern = boost::wregex(L"secondlife:///app/parcel/[\\da-f-]+/about", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("secondlife:///app/parcel/[\\da-f-]+/about", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_parcel.xml"; mTooltip = LLTrans::getString("TooltipParcelUrl"); } @@ -360,8 +360,8 @@ std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelC // LLUrlEntryPlace::LLUrlEntryPlace() { - mPattern = boost::wregex(L"secondlife://\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("secondlife://\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slurl.xml"; mTooltip = LLTrans::getString("TooltipSLURL"); } @@ -416,8 +416,8 @@ std::string LLUrlEntryPlace::getLocation(const std::string &url) const // LLUrlEntryTeleport::LLUrlEntryTeleport() { - mPattern = boost::wregex(L"secondlife:///app/teleport/\\S+(/\\d+)?(/\\d+)?(/\\d+)?/?\\S*", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("secondlife:///app/teleport/\\S+(/\\d+)?(/\\d+)?(/\\d+)?/?\\S*", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_teleport.xml"; mTooltip = LLTrans::getString("TooltipTeleportUrl"); } @@ -488,8 +488,8 @@ std::string LLUrlEntryTeleport::getLocation(const std::string &url) const /// LLUrlEntryObjectIM::LLUrlEntryObjectIM() { - mPattern = boost::wregex(L"secondlife:///app/objectim/[\\da-f-]+\\??\\S*", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\\??\\S*", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_objectim.xml"; mTooltip = LLTrans::getString("TooltipObjectIMUrl"); } @@ -532,8 +532,8 @@ std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const // LLUrlEntrySL::LLUrlEntrySL() { - mPattern = boost::wregex(L"secondlife://(\\w+)?(:\\d+)?/\\S+", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("secondlife://(\\w+)?(:\\d+)?/\\S+", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slapp.xml"; mTooltip = LLTrans::getString("TooltipSLAPP"); } @@ -549,8 +549,8 @@ std::string LLUrlEntrySL::getLabel(const std::string &url, const LLUrlLabelCallb // LLUrlEntrySLLabel::LLUrlEntrySLLabel() { - mPattern = boost::wregex(L"\\[secondlife://\\S+[ \t]+[^\\]]+\\]", - boost::regex::perl|boost::regex::icase); + mPattern = boost::regex("\\[secondlife://\\S+[ \t]+[^\\]]+\\]", + boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slapp.xml"; mTooltip = LLTrans::getString("TooltipSLAPP"); } diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 36758566ed..54053872df 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -68,7 +68,7 @@ public: virtual ~LLUrlEntryBase(); /// Return the regex pattern that matches this Url - boost::wregex getPattern() const { return mPattern; } + boost::regex getPattern() const { return mPattern; } /// Return the url from a string that matched the regex virtual std::string getUrl(const std::string &string); @@ -102,7 +102,7 @@ protected: LLUrlLabelSignal *signal; } LLUrlEntryObserver; - boost::wregex mPattern; + boost::regex mPattern; std::string mIcon; std::string mMenuName; std::string mTooltip; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 2ea3c59e03..f2d340deb7 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -75,9 +75,9 @@ void LLUrlRegistry::registerUrl(LLUrlEntryBase *url) } } -static bool matchRegex(const wchar_t *text, boost::wregex regex, U32 &start, U32 &end) +static bool matchRegex(const char *text, boost::regex regex, U32 &start, U32 &end) { - boost::wcmatch result; + boost::cmatch result; bool found; // regex_search can potentially throw an exception, so check for it @@ -107,7 +107,7 @@ static bool matchRegex(const wchar_t *text, boost::wregex regex, U32 &start, U32 } // ignore a terminating ')' when Url contains no matching '(' // see DEV-19842 for details - else if (text[end] == ')' && LLWString(text+start, end-start).find('(') == std::string::npos) + else if (text[end] == ')' && std::string(text+start, end-start).find('(') == std::string::npos) { end--; } @@ -115,10 +115,10 @@ static bool matchRegex(const wchar_t *text, boost::wregex regex, U32 &start, U32 return true; } -bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUrlLabelCallback &cb) +bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb) { // avoid costly regexes if there is clearly no URL in the text - if (text.find(L"://") == std::string::npos) + if (text.find("://") == std::string::npos) { return false; } @@ -149,7 +149,7 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr if (match_entry) { // fill in the LLUrlMatch object and return it - std::string url = wstring_to_utf8str(text.substr(match_start, match_end - match_start + 1)); + std::string url = text.substr(match_start, match_end - match_start + 1); match.setValues(match_start, match_end, match_entry->getUrl(url), match_entry->getLabel(url, cb), diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index bf5257d630..84b033036c 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -37,7 +37,6 @@ #include "llurlentry.h" #include "llurlmatch.h" #include "llsingleton.h" -#include "llstring.h" #include <string> #include <vector> @@ -75,7 +74,7 @@ public: /// get the next Url in an input string, starting at a given character offset /// your callback is invoked if the matched Url's label changes in the future - bool findUrl(const LLWString &text, LLUrlMatch &match, + bool findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb = &LLUrlRegistryNullCallback); private: diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 89a80f1e73..1e7a0f7f2c 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -44,19 +44,17 @@ namespace namespace tut { - void testRegex(const std::string &testname, boost::wregex regex, + void testRegex(const std::string &testname, boost::regex regex, const char *text, const std::string &expected) { std::string url = ""; - boost::wcmatch result; - LLWString wtext = utf8str_to_wstring(text); - const wchar_t *wctext = wtext.c_str(); - bool found = boost::regex_search(wctext, result, regex); + boost::cmatch result; + bool found = boost::regex_search(text, result, regex); if (found) { - S32 start = static_cast<U32>(result[0].first - wctext); - S32 end = static_cast<U32>(result[0].second - wctext); - url = wstring_to_utf8str(wtext.substr(start, end-start)); + S32 start = static_cast<U32>(result[0].first - text); + S32 end = static_cast<U32>(result[0].second - text); + url = std::string(text+start, end-start); } ensure_equals(testname, url, expected); } @@ -68,7 +66,7 @@ namespace tut // test LLUrlEntryHTTP - standard http Urls // LLUrlEntryHTTP url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("no valid url", r, "htp://slurl.com/", @@ -147,7 +145,7 @@ namespace tut // test LLUrlEntryHTTPLabel - wiki-style http Urls with labels // LLUrlEntryHTTPLabel url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("invalid wiki url [1]", r, "[http://www.example.org]", @@ -189,7 +187,7 @@ namespace tut // test LLUrlEntrySLURL - second life URLs // LLUrlEntrySLURL url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("no valid slurl [1]", r, "htp://slurl.com/secondlife/Ahern/50/50/50/", @@ -261,7 +259,7 @@ namespace tut // test LLUrlEntryAgent - secondlife://app/agent Urls // LLUrlEntryAgent url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("Invalid Agent Url", r, "secondlife:///app/agent/0e346d8b-4433-4d66-XXXX-fd37083abc4c/about", @@ -287,7 +285,7 @@ namespace tut // test LLUrlEntryGroup - secondlife://app/group Urls // LLUrlEntryGroup url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("Invalid Group Url", r, "secondlife:///app/group/00005ff3-4044-c79f-XXXX-fb28ae0df991/about", @@ -313,7 +311,7 @@ namespace tut // test LLUrlEntryPlace - secondlife://<location> URLs // LLUrlEntryPlace url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("no valid slurl [1]", r, "secondlife://Ahern/FOO/50/", @@ -361,7 +359,7 @@ namespace tut // test LLUrlEntryParcel - secondlife://app/parcel Urls // LLUrlEntryParcel url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("Invalid Classified Url", r, "secondlife:///app/parcel/0000060e-4b39-e00b-XXXX-d98b1934e3a8/about", @@ -386,7 +384,7 @@ namespace tut // test LLUrlEntryTeleport - secondlife://app/teleport URLs // LLUrlEntryTeleport url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("no valid teleport [1]", r, "http://slurl.com/secondlife/Ahern/50/50/50/", @@ -462,7 +460,7 @@ namespace tut // test LLUrlEntrySL - general secondlife:// URLs // LLUrlEntrySL url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("no valid slapp [1]", r, "http:///app/", @@ -500,7 +498,7 @@ namespace tut // test LLUrlEntrySLLabel - general secondlife:// URLs with labels // LLUrlEntrySLLabel url; - boost::wregex r = url.getPattern(); + boost::regex r = url.getPattern(); testRegex("invalid wiki url [1]", r, "[secondlife:///app/]", |