A lot of string returns made RAII
This commit is contained in:
@ -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();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
13
src/html.cc
13
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 <a>, 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
|
15
src/uicmd.cc
15
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;
|
||||
}
|
||||
|
62
src/url.cc
62
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...
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user