A bit more memory grind...
This commit is contained in:
@ -275,13 +275,15 @@ const char *a_Dialog_select_file(const char *title,
|
|||||||
*
|
*
|
||||||
* @return pointer to chosen filename, or NULL on Cancel.
|
* @return pointer to chosen filename, or NULL on Cancel.
|
||||||
*/
|
*/
|
||||||
char *a_Dialog_open_file(const char *title,
|
std::optional< std::string >
|
||||||
const char *pattern, const char *fname)
|
a_Dialog_open_file(const std::string &title,
|
||||||
|
const std::optional< std::string > &pattern, const std::string &fname)
|
||||||
{
|
{
|
||||||
const char *fc_name;
|
const char *fc_name;
|
||||||
|
const char *const pat= pattern.has_value() ? pattern.value().c_str() : nullptr;
|
||||||
fc_name = fl_file_chooser(title, pattern, fname);
|
fc_name = fl_file_chooser(title.c_str(), pat, fname.c_str());
|
||||||
return (fc_name) ? a_Misc_escape_chars(fc_name, "% #") : NULL;
|
if( not fc_name ) return std::nullopt;
|
||||||
|
return a_Misc_escape_chars(fc_name, "% #");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -18,8 +18,14 @@ const char *a_Dialog_save_file(const char *title,
|
|||||||
const char *pattern, const char *fname);
|
const char *pattern, const char *fname);
|
||||||
const char *a_Dialog_select_file(const char *title,
|
const char *a_Dialog_select_file(const char *title,
|
||||||
const char *pattern, const char *fname);
|
const char *pattern, const char *fname);
|
||||||
char *a_Dialog_open_file(const char *title,
|
#ifdef __cplusplus
|
||||||
const char *pattern, const char *fname);
|
extern "C++" {
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
std::optional< std::string > a_Dialog_open_file(const std::string &title,
|
||||||
|
const std::optional< std::string > &pattern, const std::string &fname);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
void a_Dialog_text_window(const char *title, const char *txt);
|
void a_Dialog_text_window(const char *title, const char *txt);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
12
src/dillo.cc
12
src/dillo.cc
@ -370,7 +370,8 @@ static void setColors()
|
|||||||
*/
|
*/
|
||||||
static DilloUrl *makeStartUrl(char *str, bool local)
|
static DilloUrl *makeStartUrl(char *str, bool local)
|
||||||
{
|
{
|
||||||
char *url_str, *p;
|
std::string url_str;
|
||||||
|
char *p;
|
||||||
DilloUrl *start_url;
|
DilloUrl *start_url;
|
||||||
|
|
||||||
/* Relative path to a local file? */
|
/* Relative path to a local file? */
|
||||||
@ -380,14 +381,15 @@ static DilloUrl *makeStartUrl(char *str, bool local)
|
|||||||
if (access(p, F_OK) == 0) {
|
if (access(p, F_OK) == 0) {
|
||||||
/* absolute path may have non-URL characters */
|
/* absolute path may have non-URL characters */
|
||||||
url_str = a_Misc_escape_chars(p, "% #");
|
url_str = a_Misc_escape_chars(p, "% #");
|
||||||
start_url = a_Url_new(url_str + 1, "file:/");
|
start_url = a_Url_new(url_str.c_str() + 1, "file:/");
|
||||||
} else {
|
} else {
|
||||||
/* Not a file, filter URL string */
|
/* Not a file, filter URL string */
|
||||||
url_str = a_Url_string_strip_delimiters(str);
|
char *const tmp= a_Url_string_strip_delimiters(str);
|
||||||
start_url = a_Url_new(url_str, NULL);
|
url_str = tmp;
|
||||||
|
dFree( tmp );
|
||||||
|
start_url = a_Url_new(url_str.c_str(), NULL);
|
||||||
}
|
}
|
||||||
dFree(p);
|
dFree(p);
|
||||||
dFree(url_str);
|
|
||||||
|
|
||||||
if (local)
|
if (local)
|
||||||
a_Url_set_flags(start_url, URL_FLAGS(start_url) | URL_SpamSafe);
|
a_Url_set_flags(start_url, URL_FLAGS(start_url) | URL_SpamSafe);
|
||||||
|
|||||||
42
src/misc.cc
42
src/misc.cc
@ -23,27 +23,33 @@
|
|||||||
* Escape characters as %XX sequences.
|
* Escape characters as %XX sequences.
|
||||||
* Return value: New string.
|
* Return value: New string.
|
||||||
*/
|
*/
|
||||||
char *a_Misc_escape_chars(const char *str, const char *esc_set)
|
std::string
|
||||||
|
a_Misc_escape_chars( const std::string_view str,
|
||||||
|
const std::string_view esc_set )
|
||||||
{
|
{
|
||||||
static const char hex[] = "0123456789ABCDEF";
|
using namespace std::literals::string_view_literals;
|
||||||
char *p = NULL;
|
|
||||||
Dstr *dstr;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
dstr = dStr_sized_new(64);
|
const auto hex= "0123456789ABCDEF"sv;
|
||||||
for (i = 0; str[i]; ++i) {
|
|
||||||
if (str[i] <= 0x1F || str[i] == 0x7F || strchr(esc_set, str[i])) {
|
|
||||||
dStr_append_c(dstr, '%');
|
|
||||||
dStr_append_c(dstr, hex[(str[i] >> 4) & 15]);
|
|
||||||
dStr_append_c(dstr, hex[str[i] & 15]);
|
|
||||||
} else {
|
|
||||||
dStr_append_c(dstr, str[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p = dstr->str;
|
|
||||||
dStr_free(dstr, FALSE);
|
|
||||||
|
|
||||||
return p;
|
std::string rv;
|
||||||
|
rv.reserve( 64 );
|
||||||
|
|
||||||
|
|
||||||
|
for( const char ch: str )
|
||||||
|
{
|
||||||
|
if( ch <= 0x1F or ch == 0x7F or esc_set.contains( ch ) )
|
||||||
|
{
|
||||||
|
rv+= '%';
|
||||||
|
rv+= hex[ ( ch >> 4 ) & 0xF ];
|
||||||
|
rv+= hex[ ch & 0xF ];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rv+= ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TAB_SIZE 8
|
#define TAB_SIZE 8
|
||||||
|
|||||||
@ -4,7 +4,12 @@
|
|||||||
|
|
||||||
#define d_isascii(c) (((c) & ~0x7f) == 0)
|
#define d_isascii(c) (((c) & ~0x7f) == 0)
|
||||||
|
|
||||||
char *a_Misc_escape_chars(const char *str, const char *esc_set);
|
#ifdef __cplusplus
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
std::string a_Misc_escape_chars(std::string_view str, std::string_view esc_set);
|
||||||
|
#endif
|
||||||
|
|
||||||
int a_Misc_expand_tabs(char **start, char *end, char *buf, int buflen);
|
int a_Misc_expand_tabs(char **start, char *end, char *buf, int buflen);
|
||||||
int a_Misc_get_content_type_from_data(void *Data, size_t Size,const char **PT);
|
int a_Misc_get_content_type_from_data(void *Data, size_t Size,const char **PT);
|
||||||
int a_Misc_content_type_check(const char *EntryType, const char *DetectedType);
|
int a_Misc_content_type_check(const char *EntryType, const char *DetectedType);
|
||||||
|
|||||||
@ -1152,16 +1152,14 @@ void a_UIcmd_tools(void *vbw, int x, int y)
|
|||||||
*/
|
*/
|
||||||
void a_UIcmd_open_file(void *vbw)
|
void a_UIcmd_open_file(void *vbw)
|
||||||
{
|
{
|
||||||
char *name;
|
|
||||||
DilloUrl *url;
|
DilloUrl *url;
|
||||||
|
|
||||||
name = a_Dialog_open_file("Flenser: Open File", NULL, "");
|
auto name = a_Dialog_open_file("Flenser: Open File", std::nullopt, "");
|
||||||
|
|
||||||
if (name) {
|
if (name.has_value()) {
|
||||||
url = a_Url_new(name, "file:");
|
url = a_Url_new(name.value().c_str(), "file:");
|
||||||
a_UIcmd_open_url((BrowserWindow*)vbw, url);
|
a_UIcmd_open_url((BrowserWindow*)vbw, url);
|
||||||
a_Url_free(url);
|
a_Url_free(url);
|
||||||
dFree(name);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user