From 2dd41b440e054d947d9a907b058c631b41af223063aa6e42cc84105e778c5a00 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Tue, 12 Aug 2025 03:48:47 -0400 Subject: [PATCH] A lot of string returns made RAII --- src/flenser.cc | 14 +++++------- src/form.cc | 6 +---- src/html.cc | 13 ++++------- src/menu.cc | 5 ++-- src/nav.cc | 5 ++-- src/uicmd.cc | 15 +++++------- src/url.cc | 62 ++++++++++++++++++++++++-------------------------- src/url.hh | 6 ++--- 8 files changed, 55 insertions(+), 71 deletions(-) diff --git a/src/flenser.cc b/src/flenser.cc index c5aacd3..0c03a0f 100644 --- a/src/flenser.cc +++ b/src/flenser.cc @@ -373,7 +373,7 @@ static DilloUrl *makeStartUrl(char *str, bool local) using namespace std::literals::string_literals; std::string url_str; std::string p; - DilloUrl *start_url; + std::unique_ptr< DilloUrl >start_url; /* Relative path to a local file? */ p = (*str == '/') ? str : @@ -382,19 +382,17 @@ static DilloUrl *makeStartUrl(char *str, bool local) if (access(p.c_str(), F_OK) == 0) { /* absolute path may have non-URL characters */ url_str = a_Misc_escape_chars(p.c_str(), "% #"); - start_url = a_Url_new(url_str.c_str() + 1, "file:/").release(); + start_url = a_Url_new(url_str.c_str() + 1, "file:/"); } else { /* Not a file, filter URL string */ - char *const tmp= a_Url_string_strip_delimiters(str); - url_str = tmp; - dFree( tmp ); - start_url = a_Url_new(url_str.c_str(), NULL).release(); + url_str = a_Url_string_strip_delimiters(str).value(); // Already was `str` dereferenced, so it's "safe" + start_url = a_Url_new(url_str.c_str(), NULL); } if (local) - a_Url_set_flags(start_url, URL_FLAGS(start_url) | URL_SpamSafe); + a_Url_set_flags(start_url.get(), URL_FLAGS(start_url) | URL_SpamSafe); - return start_url; + return start_url.release(); } /* diff --git a/src/form.cc b/src/form.cc index 3385fc2..8156495 100644 --- a/src/form.cc +++ b/src/form.cc @@ -1342,11 +1342,7 @@ std::string DilloHtmlFormImpl::encodeText(iconv_t char_encoder, std::string &&in void DilloHtmlFormImpl::strUrlencodeAppend(std::string &dstr, std::string_view str_) { const std::string str{ str_ }; - auto encoded= Alepha::AutoRAII - { - [&]{ return a_Url_encode_hex_str(str.c_str()); }, - dFree - }; + auto encoded= a_Url_encode_hex_str(str.c_str()).value(); dstr+= encoded; } diff --git a/src/html.cc b/src/html.cc index 1e6f3f6..23fdd86 100644 --- a/src/html.cc +++ b/src/html.cc @@ -2648,24 +2648,21 @@ static void Html_tag_open_a(DilloHtml *html, const char *tag, int tagsize) html->styleEngine->inheritBackgroundColor (); if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "name"))) { - char *nameVal; const char *id = html->styleEngine->getId (); if (prefs.show_extra_warnings) Html_check_name_val(html, attrbuf, "name"); - nameVal = a_Url_decode_hex_str(attrbuf); + if( auto nameVal= a_Url_decode_hex_str( attrbuf ) ) + { - if (nameVal) { /* We compare the "id" value with the url-decoded "name" value */ - if (!id || strcmp(nameVal, id)) { + if (!id || strcmp(nameVal.value().c_str(), id)) { if (id) BUG_MSG("In , id ('%s') and name ('%s') attributes differ.", - id, nameVal); - Html_add_anchor(html, nameVal); + id, nameVal.value().c_str()); + Html_add_anchor(html, nameVal.value().c_str()); } - - dFree(nameVal); } } } diff --git a/src/menu.cc b/src/menu.cc index 027649a..05629d1 100644 --- a/src/menu.cc +++ b/src/menu.cc @@ -247,13 +247,12 @@ static void Menu_bugmeter_validate(const char *validator_url) *ptr = strrchr(popup_str, '#'); char *no_fragment = ptr ? dStrndup(popup_str, ptr - popup_str) : dStrdup(popup_str); - char *encoded = a_Url_encode_hex_str(no_fragment); + auto encoded = a_Url_encode_hex_str(no_fragment); Dstr *dstr = dStr_sized_new(128); - dStr_sprintf(dstr, validator_url, encoded); + dStr_sprintf(dstr, validator_url, encoded.value().c_str()); a_UIcmd_open_urlstr(popup_bw, dstr->str); dStr_free(dstr, 1); - dFree(encoded); dFree(no_fragment); } } diff --git a/src/nav.cc b/src/nav.cc index 7d024b5..f550f97 100644 --- a/src/nav.cc +++ b/src/nav.cc @@ -262,7 +262,7 @@ void a_Nav_cancel_expect_if_eq(BrowserWindow *bw, const DilloUrl *url) void a_Nav_expect_done(BrowserWindow *bw) { int m, url_idx, posx, posy, reload, repush, e2equery, goto_old_scroll=TRUE; - char *fragment = NULL; + std::optional< std::string > fragment; dReturn_if_fail(bw != NULL); @@ -312,13 +312,12 @@ void a_Nav_expect_done(BrowserWindow *bw) _MSG("Nav: expect_done scrolling to x=%d y=%d\n", posx, posy); } else if (fragment) { /* Scroll to fragment */ - a_UIcmd_set_scroll_by_fragment(bw, fragment); + a_UIcmd_set_scroll_by_fragment(bw, fragment->c_str()); } else { /* Scroll to origin */ a_UIcmd_set_scroll_xy(bw, 0, 0); } - dFree(fragment); Nav_stack_clean(bw); a_UIcmd_set_buttons_sens(bw); _MSG("Nav: a_Nav_expect_done\n"); diff --git a/src/uicmd.cc b/src/uicmd.cc index 7d86b07..a5e8fad 100644 --- a/src/uicmd.cc +++ b/src/uicmd.cc @@ -761,7 +761,6 @@ static std::optional< std::string > UIcmd_find_search_str(const char *str) */ void a_UIcmd::a_UIcmd_open_urlstr(BrowserWindow *bw, const char *urlstr) { - char *new_urlstr; std::optional< std::string > search_urlstr; std::unique_ptr< DilloUrl > url; int ch; @@ -771,22 +770,21 @@ void a_UIcmd::a_UIcmd_open_urlstr(BrowserWindow *bw, const char *urlstr) } if (urlstr && *urlstr) { /* Filter URL string */ - new_urlstr = a_Url_string_strip_delimiters(urlstr); + auto new_urlstr= a_Url_string_strip_delimiters(urlstr).value(); - if (!dStrnAsciiCasecmp(new_urlstr, "file:", 5)) { + if (!dStrnAsciiCasecmp(new_urlstr.c_str(), "file:", 5)) { /* file URI */ ch = new_urlstr[5]; if (!ch || ch == '.') { url = a_Url_new(Paths::getOldWorkingDir(), "file:"); } else { - url = a_Url_new(new_urlstr, "file:"); + url = a_Url_new(new_urlstr.c_str(), "file:"); } } else { /* common case */ - url = a_Url_new(new_urlstr, NULL); + url = a_Url_new(new_urlstr.c_str(), NULL); } - dFree(new_urlstr); if (url) { a_UIcmd_open_url(bw, url.release()); @@ -1167,8 +1165,8 @@ static std::string UIcmd_make_search_str(const char *str) { char *l, *u, *c; - char *keys = a_Url_encode_hex_str(str), - *src = (char*)dList_nth_data(prefs.search_urls, prefs.search_url_idx); + std::string keys = a_Url_encode_hex_str(str).value_or( "" ); + char *src = (char*)dList_nth_data(prefs.search_urls, prefs.search_url_idx); std::string search_url; /* parse search_url into label and url */ @@ -1189,7 +1187,6 @@ UIcmd_make_search_str(const char *str) search_url+= *c; } } - dFree(keys); return search_url; } diff --git a/src/url.cc b/src/url.cc index e9c6422..62b4f8e 100644 --- a/src/url.cc +++ b/src/url.cc @@ -563,27 +563,24 @@ static int Url_decode_hex_octet(const char *s) * Parse possible hexadecimal octets in the URI path. * Returns a new allocated string. */ -char *a_Url_decode_hex_str(const char *str) +std::optional< std::string > +a_Url_decode_hex_str(const char *str) { - char *new_str, *dest; + std::string new_str; int i, val; if (!str) - return NULL; + return std::nullopt; /* most cases won't have hex octets */ if (!strchr(str, '%')) - return dStrdup(str); - - dest = new_str = dNew(char, strlen(str) + 1); + return str; for (i = 0; str[i]; i++) { - *dest++ = (str[i] == '%' && (val = Url_decode_hex_octet(str+i+1)) >= 0) ? - i+=2, val : str[i]; + new_str.push_back( (str[i] == '%' && (val = Url_decode_hex_octet(str+i+1)) >= 0) ? + i+=2, val : str[i] ); } - *dest++ = 0; - new_str = reinterpret_cast< char * >( dRealloc(new_str, sizeof(char) * (dest - new_str)) ); return new_str; } @@ -597,17 +594,17 @@ char *a_Url_decode_hex_str(const char *str) * Note: the content type "application/x-www-form-urlencoded" is used: * i.e., ' ' -> '+' and '\n' -> CR LF (see HTML 4.01, Sec. 17.13.4) */ -char *a_Url_encode_hex_str(const char *str) +std::optional< std::string > +a_Url_encode_hex_str(const char *str) { static const char *const verbatim = "-_.*"; - char *newstr, *c; if (!str) - return NULL; + return std::nullopt; - newstr = dNew(char, 6*strlen(str)+1); + std::string newstr; - for (c = newstr; *str; str++) + for (auto c= std::back_inserter( newstr ); *str; str++) if ((dIsalnum(*str) && d_isascii(*str)) || strchr(verbatim, *str)) *c++ = *str; else if (*str == ' ') @@ -624,7 +621,6 @@ char *a_Url_encode_hex_str(const char *str) *c++ = HEX[(*str >> 4) & 15]; *c++ = HEX[*str & 15]; } - *c = 0; return newstr; } @@ -635,26 +631,28 @@ char *a_Url_encode_hex_str(const char *str) * Strip: "URL:", enclosing < >, and embedded whitespace. * (We also strip illegal chars: 00-1F and 7F-FF) */ -char *a_Url_string_strip_delimiters(const char *str) +std::optional< std::string > +a_Url_string_strip_delimiters(const char *str) { - char *p, *new_str, *text; + char *p, *text; - new_str = text = dStrdup(str); + if( not str ) return std::nullopt; + std::string new_str= str; + text= new_str.data(); - if (new_str) { - if (strncmp(new_str, "URL:", 4) == 0) - text += 4; - if (*text == '<') - text++; + if (strncmp(new_str.c_str(), "URL:", 4) == 0) + text += 4; + if (*text == '<') + text++; - for (p = new_str; *text; text++) - if (*text > 0x1F && *text < 0x7F && *text != ' ') - *p++ = *text; - if (p > new_str && p[-1] == '>') - --p; - *p = 0; - } - return new_str; + for (p = new_str.data(); *text; text++) + if (*text > 0x1F && *text < 0x7F && *text != ' ') + *p++ = *text; + if (p > new_str.data() && p[-1] == '>') + --p; + *p = 0; + + return new_str.c_str(); // TODO: Rewrite this more cleanly... } /** diff --git a/src/url.hh b/src/url.hh index 8296795..de011d5 100644 --- a/src/url.hh +++ b/src/url.hh @@ -132,9 +132,9 @@ operator == ( const DilloUrl &lhs, const DilloUrl &rhs ) void a_Url_set_flags(DilloUrl *u, int flags); void a_Url_set_data(DilloUrl *u, std::string_view data); void a_Url_set_ismap_coords(DilloUrl *u, char *coord_str); -char *a_Url_decode_hex_str(const char *str); -char *a_Url_encode_hex_str(const char *str); -char *a_Url_string_strip_delimiters(const char *str); +std::optional< std::string > a_Url_decode_hex_str(const char *str); +std::optional< std::string > a_Url_encode_hex_str(const char *str); +std::optional< std::string > a_Url_string_strip_delimiters(const char *str); int a_Url_host_type(const char *host); bool_t a_Url_same_organization(const DilloUrl &u1, const DilloUrl &u2); #ifdef __cplusplus