diff --git a/NEWS b/NEWS
index b98c48302..736158c92 100644
--- a/NEWS
+++ b/NEWS
@@ -8,9 +8,265 @@ file for details.
ELinks now:
-----------
-* Native FSP protocol support (replaces CGI program in contrib/fsp/)
-* SEE Ecmascript backend
-* Minimalistic RSS renderer
+This list now contains all the important changes from ELinks 0.11.0 to
+ELinks 0.12.GIT (26473f72f59641aa60277f14f703f8a76dda5a82). The next
+step will be to scan through Bugzilla and look for bug numbers that
+were not mentioned in related commit messages.
+
+The list no doubt includes several changes that are not really
+important enough. Please move them to the separate "should be removed
+from NEWS" list below, or coalesce several changes into one entry (but
+do list all bug numbers). It might be a good idea to sort the entries
+roughly in decreasing order of importance.
+
+* Miscellaneous
+ - (bugfix) If ELinks logs debug information to a file, it now opens
+ that in binary mode.
+ - (bugfix) Use PF_* instead of AF_* as first parameter of socket(2).
+ - (enhancement 752) Documentation updates
+ - (enhancement 381) Reduce memory consumption of codepages and some
+ other arrays.
+ - (bugfix) Secure file saving: restore umask after _all_ failure
+ conditions
+ - (bugfix 830) Fix misparsing of -remote URLs containing parenthesis.
+ - (bugfix 868) kill_timer from timer->func can crash check_timers.
+ - (enhancement 831) -remote openURL(URL) can include quoted commas.
+ - (enhancement) Reject invalid UTF-8 input from documents and
+ terminals.
+* Changes in terminal support
+ - (new feature) Support for pasting from GNU screen clipboard
+ - (enhancement) Make ELinks FreeBSD friendly. Defined keys used on
+ FreeBSD console
+ - (enhancement) Mouse wheel support on BSD via moused -z 4
+ - (enhancement) Support for mouse wheel over GPM
+ - (experimental, new feature) UTF-8 as terminal charset: not merely
+ UTF-8 I/O of a unibyte codepage as in previous versions.
+ Double-cell (aka fullwidth) and non-BMP characters work too, but
+ combining characters and right-to-left text do not. The only
+ multibyte charset ELinks can decode is still UTF-8, so if the
+ server outputs e.g. Shift-JIS, you'd better recode with a proxy.
+ - (bugfix) Kill the ESC timer when blocking the terminal.
+ - (bugfix 724) Better parsing of escape sequences and control
+ sequences from the terminal.
+ - (bugfix) Decode UTF-8 only from bytes, not from codes of special
+ keys.
+ - (bugfix) Do not call toupper with potentially out-of-range values.
+ - (new feature) 24-bit truecolor mode
+ - (enhancement) "Resize terminal" tries to use the window size
+ increment.
+ - (new feature) Support Ctrl+Alt+letter key combinations.
+ - (bugfix) Subprocess forked for SIGTSTP calls _exit, not exit.
+ - (new feature 772) Recognize Shift+Tab on Xterm.
+ - (enhancement) Turn terminal transparency off by default.
+ - (bugfix 871) Lock down the numbering of terminal.*.colors
+ regardless of config options. This change makes elinks.conf
+ portable between different configurations but unfortunately not
+ between this and previous versions.
+* Changes in cookies and bookmarks
+ - (new feature) "Add server" button in the cookie manager.
+ - (enhancement) Tell the user how to move bookmarks.
+ - (bugfix) Fix crash when moving bookmarks out of a folder.
+ - (bugfix) Fixed crash if XBEL bookmark has no title
+ - (bugfix 886) If the user edits or deletes a cookie, mark the
+ cookie list as needing to be saved.
+ - (enhancement 887) Save in cookie manager should save cookies even
+ if unmodified.
+* Changes in the user interface
+ - (new feature) Internal clipboard support
+ - (enhancement) Place the cursor on the current listbox item, to
+ help screen readers
+ - (enhancement) Localization updates
+ - (bugfix 355) Add documents displayed via "What to do" dialog to
+ globhist
+ - (new feature) Autocreate directories needed to download a file.
+ - (new feature) Option ui.show_menu_bar_always
+ - (new feature) Option ui.tabs moves the tab bar to the top.
+ - (bugfix) Fix searching in menus past unselectable items.
+ - (bugfix) Fix crash with empty File extensions menu.
+ - (new feature) New actions: kill-word-back, move-backward-word,
+ move-forward-word
+ - (bugfix) Use internal OFF_T_FORMAT instead of PRId64
+ - (bugfix) Two small fixes in the authentication dialog.
+ - (enhancement) Ctrl+characters don't trigger hotkeys in menus and
+ dialogs.
+ - (bugfix 396) Never show empty filename in the what-to-do dialog
+* Changes in support for URI schemes, protocols, caching, and encodings
+ - (workaround 841) SMB is now disabled because of CVE-2006-5925.
+ - (new feature) Native FSP protocol support (replaces CGI program in
+ contrib/fsp/)
+ - (new feature) Local CGI
+ - (experimental, bugfix) Gopher changes, including crash fixes
+ - (enhancement) FTP handler parses file sizes better
+ - (bugfix) Fixes cache-control issue. See elinks-users mail from 28 Oct 2005
+ - (new feature) LZMA decompression
+ - (bugfix) Local files in a directory whose name contained + were
+ unreachable.
+ - (new feature) HTTP negotiate-auth using GSSAPI
+ - (bugfix 769) HTTP digest auth computed MD5 from insufficient input.
+ - (bugfix 770) Download resuming simply restarts the download
+ - (bugfix) Fix IPv4 DNS lookup bug
+ - (bugfix) Fix null-pointer crash caused by malformed $HTTP_PROXY.
+ - (enhancement) If-Modified-Since and If-None-Match
+ - (bugfix) gzip_read: always call gzclearerr
+ - (bugfix 107) Recognize "localhost" in file: URIs.
+ - (bugfix 729) Fix crashes with various bogus BitTorrent URLs.
+ - (bugfix 756) "assertion (cached)->object.refcount >= 0 failed"
+ after HTTP proxy was changed
+ - (bugfix 899, Debian 403139) Fix size handling in FTP directory
+ listings.
+ - (bugfix 919) Fixed a buffer overflow when shrinking a cached fragment.
+* Changes in parsing and rendering of HTML (without DOM)
+ - (enhancement) The list of SGML character entities has been updated
+ from unicode.org. However, it still isn't subsetted per DTD like
+ it probably should be.
+ - (new feature) Add support for forcing wrapping at the screen boundary
+ - (bugfix 741) HTML comments shouldn't be evaluated inside STYLE elements
+ - (bugfix) Use frame->name instead of target avoiding possible segfault.
+ - (bugfix 284) Render closing parentheses for HTML elements SUB, SUP
+ in the same line; don't let them fall to the next.
+ - (enhancement) Show quote characters for HTML element Q, rather
+ than italics.
+ - (enhancement) Add support for parsing space separated CSS class
+ attribute values
+ - (enhancement 767) HTML meta refresh finds the URL even without "URL=".
+ - (enhancement 396) If the server doesn't say what the Content-Type is
+ but the data contains "", assume it is text/html.
+ - (bugfix 387) Treat
inside
...
as a newline.
+* Changes in parsing and rendering of non-HTML content-types
+ - (new feature) If a mailcap entry indicates copiousoutput, ELinks
+ itself acts as a pager.
+ - (new feature) Let plain text change colors with ESC [ 31 m or
+ similar control sequences.
+* Changes in the document viewer and tabs
+ - (new feature) Highlight links as one enters link prefixes.
+ - (new feature) Backspace backs out the last digit of the prefix.
+ - (bugfix) Tabs opened by -remote now go behind existing dialogs.
+ - (new feature) -dump-color-mode
+ - (bugfix) Fix accesskeys so that they work when priority is 0
+ - (enhancement) Text type-ahead searching: don't follow current link
+ on enter
+ - (bugfix) Take the terminal charset in account when comparing
+ accesskeys.
+ - (enhancement) Display accesskeys as e.g. (Alt-f), not just (f).
+ - (bugfix) Decode the fragment identifier extracted from the URI
+ when looking it up
+ - (bugfix 908) radio button writes via a dangling pointer (potential
+ crash)
+* Changes in user scripting
+ - (bugfix, Gentoo 121247) Ruby: Fix segfaults.
+ - (enhancement) Guile: Read hooks.scm rather than internal-hooks.scm.
+ (Keep reading user-hooks.scm, too.)
+ - (bugfix) Lua: current_document_formatted now works.
+ - (bugfix) Lua: Don't write to the string returned by lua_tostring.
+ - (experimental, new feature, bugfix) Python: Many additions and
+ bug fixes.
+ - (bugfix) SMJS: Don't complain about a missing hooks.js on startup.
+ - (new feature) SMJS: The elinks.preformat_html hook gets a second
+ argument: a view_state object with .uri and .plain properties.
+ - (enhancement) SMJS: elinks.alert no longer displays as an "error".
+ - (new feature) SMJS: New properties elinks.action, elinks.globhist,
+ elinks.vs.
+ - (new feature) SMJS: New function elinks.load_uri.
+ - (new feature) SMJS: New method elinks.execute.
+ - (enhancement) SMJS: Garbage-collect SMJS objects before flushing
+ caches.
+ - (bugfix 870) SMJS: Don't panic if a property ID is unrecognized.
+ (The bug also affected SMJS on web pages, but that's experimental.)
+ - (bitrot) Perl: Don't assume POPpx stores the length to n_a.
+ - (bugfix) Perl: Fix pre_format_html hook wrt. binary files.
+* Build system and compile-time errors (ignore if you don't build ELinks)
+ - (bugfix) Fixed some bugs about compiling outside the source
+ directory.
+ - (bugfix) Don't use cmp -b, which FreeBSD doesn't support.
+ - (bugfix) Don't include for MIN and MAX because it
+ may interfere with CONFIG_IPV6 on Linux.
+ - (bugfix) When the configure script cleans old object files, this
+ no longer causes it to loop.
+ - (experimental, new feature) --with-python=DIRECTORY, --with-gc=DIRECTORY
+ - (bugfix) Include and fix compilation on an old
+ PPC/Debian system
+ - (bitrot) Fix compilation under gcc 4.x. Backported from gentoo portage.
+ - (bitrot) Update SpiderMonkey configure check Debian compatibility
+ - (new feature) Tiny C Compiler support
+ - (experimental, new feature) Native Win32 port
+ - (enhancement) If make -k was used and a sub-Make fails, build the
+ rest before propagating.
+ - (experimental, bitrot 768) Look for e.g. -lpython2.4 rather than
+ -lpython.
+ - (enhancement) Avoid compilation of vernum.c in 'make install'
+ - (bugfix) Don't use $(AM_CFLAGS) anymore. Use $(CPPFLAGS) instead.
+ - (bugfix) Fix compilation on Minix3.
+ - (new feature) make uninstall
+ - (bitrot) Fix two warnings on Mac OS X.
+* (experimental) Changes in ECMAScript support
+ - (enhancement) Disable ECMAScript by default.
+ - (new feature) SEE ECMAScript backend, an alternative to SpiderMonkey.
+ - (new feature) Handling onsubmit
+ - (workaround) window.open remembers the last few URLs and doesn't
+ reopen them when incremental rendering reruns the onload script.
+ - (enhancement) Recognize document.location.href for SMJS.
+ - (enhancement) Better handling of form.action assignments
+ - (bugfix) SMJS: fix segfault on exit.
+ - (enhancement) form[x] looks up controls also by id, not only name.
+ - (new feature) New property input.selectedIndex.
+ - (new feature) Activate link only when onClick returns true.
+ - (enhancement) input.accessKey can be any Unicode character except
+ U+0000.
+ - (new feature) window.setTimeout, window.status
+ - (bugfix 846) Fix potentially exploitable crashes if properties
+ were invoked with "this" objects of unexpected types.
+* (experimental) Changes in SGML/DOM implementation
+ - (new feature) Minimalistic RSS renderer
+ - (enhancement) Source highlighting also recognizes
+ application/xhtml+xml and application/docbook+xml. It doesn't yet
+ support arbitrary XML though.
+ - (enhancement) Make it possible to use more CSS properties with the
+ source highlighting
+ - (enhancement) Handle for HTML source rendering
+ - (enhancement) Add support for scanning comment endings such as
+ '--!>' correctly
+ - (new feature) Incremental parsing
+ - And more.
+
+The following changes should be removed from NEWS before ELinks 0.12.0
+is released. They are currently listed here just to show that they
+have already been considered.
+
+* Only partially fixed bugs:
+ - (bugfix 764) int/long type punning in options
+ - (bugfix 725) Fixes version checking for Ruby in 'configure'
+* Fixed bugs that were not in previous versions:
+ - (bugfix) Fix a crash when adding a server in the cookie manager.
+ - (bugfix) cookies: "Add Server" ignores "cookies.accept_policy".
+ - (bugfix) Fix data: protocol.
+ - (bugfix) Properly deselect the main menu instead of crashing
+ - (bugfix 778) ELinks crashes on binary files when
+ document.plain.display_links is set
+ - (bugfix 784) UTF-8 mode misconverts non-ASCII entity in Latin-1
+ document
+ - (bugfix 782) UTF-8 buffer overwritten while in use
+ - (bugfix) switch_to_tab: Prevent "tab number out of range"
+ assertion failure.
+ - (bugfix) Fixed about:
+ - (bugfix 821) I cannot enter national characters in dialog boxes
+ - (bugfix 834) Gzip decompression doesn't work
+ - (bugfix) Fix out-of-bound access to the quote_char buffer
+ - (bugfix 880) Prevent SIGSEGV in init_python when -no-home is used.
+ - (bugfix 788) compile error with --enable-perl
+ - (bugfix 827) Crash with term charset set to Unicode and UTF-8 I/O
+ disabled
+ - (bugfix 826) too small table for double-cell characters
+ - (bugfix 902) crash: "overflow detected realloc()" in realloc_line
+ - (bugfix 912) wrong color in one cell of an HTML input field
+* Reverted changes:
+ - (new feature) document.write, reverted in
+ 2c087e52e74528a720621186b91880463e039d50
+ - (enhancement) restore Linux console mode (UTF-8 or not), reverted
+ in 10d72cae7eafa6b90db1c8f303deb200555734c2
+ - (enhancement) wcwidth, reverted in
+ d050cb67aa37390ab938b0a308c7541f19578506
+* Unimportant changes:
+ - (enhancement) If select fails, save its errno.
ELinks 0.11.0 (Elated):
-----------------------
diff --git a/contrib/python/hooks.py b/contrib/python/hooks.py
index 0d4151acf..a4726e490 100644
--- a/contrib/python/hooks.py
+++ b/contrib/python/hooks.py
@@ -46,7 +46,7 @@ dumbprefixes = {
"sd" : "http://www.slashdot.org/"
}
-def goto_url_hook(url, current_url):
+def goto_url_hook(url):
"""Rewrite a URL that was entered in a "Go to URL" dialog box.
This function should return a URL for ELinks to follow, or None if
@@ -55,8 +55,6 @@ def goto_url_hook(url, current_url):
Arguments:
url -- The URL provided by the user.
- current_url -- The URL of the document being viewed, or None if no
- document is being viewed.
"""
if url in dumbprefixes:
@@ -136,13 +134,12 @@ class goto_url_in_new_tab:
"""Prompter that opens a given URL in a new tab."""
def __init__(self):
"""Prompt for a URL."""
- self.current_location = elinks.current_url()
elinks.input_box("Enter URL", self._callback, title="Go to URL")
def _callback(self, url):
"""Open the given URL in a new tab."""
if 'goto_url_hook' in globals():
# Mimic the standard "Go to URL" dialog by calling goto_url_hook().
- url = goto_url_hook(url, self.current_location) or url
+ url = goto_url_hook(url) or url
if url:
elinks.open(url, new_tab=True)
# The elinks.bind_key() function can be used to create a keystroke binding
diff --git a/doc/python.txt b/doc/python.txt
index baf81357d..a5225150e 100644
--- a/doc/python.txt
+++ b/doc/python.txt
@@ -44,7 +44,7 @@ FUNCTIONS
url -- The URL of the link.
- goto_url_hook(url, current_url)
+ goto_url_hook(url)
Rewrite a URL that was entered in a "Go to URL" dialog box.
This function should return a URL for ELinks to follow, or None if
@@ -53,8 +53,6 @@ FUNCTIONS
Arguments:
url -- The URL provided by the user.
- current_url -- The URL of the document being viewed, or None if no
- document is being viewed.
pre_format_html_hook(url, html)
Rewrite the body of a document before it's formatted.
diff --git a/po/Makefile b/po/Makefile
index 4d76c8d89..77d62fccd 100644
--- a/po/Makefile
+++ b/po/Makefile
@@ -71,7 +71,6 @@ $(srcdir)$(PACKAGE).pot: $(srcdir)$(POTFILES_ABS_LIST) $(srcdir)perl/gather-acce
# either or .po when calling make. Example: make update-po PO=is
update-po: Makefile $(srcdir)$(PACKAGE).pot
- @test -z "$(srcdir)" || cd $(srcdir)
@$(foreach lang,$(basename $(if $(strip $(PO)),$(PO),$(GMOFILES))), \
echo -n "$(lang): "; \
if $(MSGMERGE) $(srcdir)$(lang).po $(srcdir)$(PACKAGE).pot -o $(lang).new.po; then \
diff --git a/src/bookmarks/backend/xbel.c b/src/bookmarks/backend/xbel.c
index 25ef2cbd6..f7042792c 100644
--- a/src/bookmarks/backend/xbel.c
+++ b/src/bookmarks/backend/xbel.c
@@ -195,7 +195,7 @@ print_xml_entities(struct secure_save_info *ssi, const unsigned char *str)
secure_fprintf(ssi, "%i;", (int) *str);
}
else {
- unsigned char *s = u2cp_no_nbsp(*str, cp);
+ const unsigned char *s = u2cp_no_nbsp(*str, cp);
if (s) print_xml_entities(ssi, s);
}
diff --git a/src/intl/charsets.c b/src/intl/charsets.c
index 0d3347131..560443137 100644
--- a/src/intl/charsets.c
+++ b/src/intl/charsets.c
@@ -70,7 +70,7 @@ struct codepage_desc {
#include "intl/entity.inc"
-static char strings[256][2] = {
+static const char strings[256][2] = {
"\000", "\001", "\002", "\003", "\004", "\005", "\006", "\007",
"\010", "\011", "\012", "\013", "\014", "\015", "\016", "\017",
"\020", "\021", "\022", "\023", "\024", "\025", "\026", "\033",
@@ -117,7 +117,12 @@ free_translation_table(struct conv_table *p)
mem_free(p);
}
-static unsigned char *no_str = "*";
+/* A string used in conversion tables when there is no correct
+ * conversion. This is compared by address and therefore should be a
+ * named array rather than a pointer so that it won't share storage
+ * with any other string literal that happens to have the same
+ * characters. */
+static const unsigned char no_str[] = "*";
static void
new_translation_table(struct conv_table *p)
@@ -163,7 +168,7 @@ static const unicode_val_T strange_chars[32] = {
#define SYSTEM_CHARSET_FLAG 128
#define is_cp_ptr_utf8(cp_ptr) ((cp_ptr)->aliases == aliases_utf8)
-unsigned char *
+const unsigned char *
u2cp_(unicode_val_T u, int to, enum nbsp_mode nbsp_mode)
{
int j;
@@ -251,7 +256,7 @@ encode_utf8(unicode_val_T u)
#ifdef CONFIG_UTF8
/* Number of bytes utf8 character indexed by first byte. Illegal bytes are
* equal ones and handled different. */
-static char utf8char_len_tab[256] = {
+static const char utf8char_len_tab[256] = {
1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,
@@ -736,7 +741,7 @@ cp2u(int from, unsigned char c)
}
/* This slow and ugly code is used by the terminal utf_8_io */
-unsigned char *
+const unsigned char *
cp2utf8(int from, int c)
{
from &= ~SYSTEM_CHARSET_FLAG;
@@ -767,7 +772,7 @@ cp_to_unicode(int codepage, unsigned char **string, unsigned char *end)
static void
-add_utf8(struct conv_table *ct, unicode_val_T u, unsigned char *str)
+add_utf8(struct conv_table *ct, unicode_val_T u, const unsigned char *str)
{
unsigned char *p = encode_utf8(u);
@@ -796,6 +801,10 @@ add_utf8(struct conv_table *ct, unicode_val_T u, unsigned char *str)
ct[*p].u.str = str;
}
+/* A conversion table from some charset to UTF-8.
+ * If it is from UTF-8 to UTF-8, it converts each byte separately.
+ * Unlike in other translation tables, the strings in elements 0x80 to
+ * 0xFF are allocated dynamically. */
struct conv_table utf_table[256];
int utf_table_init = 1;
@@ -804,8 +813,9 @@ free_utf_table(void)
{
int i;
+ /* Cast away const. */
for (i = 128; i < 256; i++)
- mem_free(utf_table[i].u.str);
+ mem_free((unsigned char *) utf_table[i].u.str);
}
static struct conv_table *
@@ -857,7 +867,8 @@ get_translation_table_to_utf8(int from)
return utf_table;
}
-struct conv_table table[256];
+/* A conversion table between two charsets, where the target is not UTF-8. */
+static struct conv_table table[256];
static int first = 1;
void
@@ -917,7 +928,7 @@ get_translation_table(int from, int to)
for (i = 128; i < 256; i++) {
if (codepages[from].highhalf[i - 0x80] != 0xFFFF) {
- unsigned char *u;
+ const unsigned char *u;
u = u2cp(codepages[from].highhalf[i - 0x80], to);
if (u) table[i].u.str = u;
@@ -953,7 +964,7 @@ struct entity_cache {
unsigned int hits;
int strlen;
int encoding;
- unsigned char *result;
+ const unsigned char *result;
unsigned char str[20]; /* Suffice in any case. */
};
@@ -977,7 +988,7 @@ compare_entities(const void *key_, const void *element_)
return xxstrcmp(first, second, length);
}
-unsigned char *
+const unsigned char *
get_entity_string(const unsigned char *str, const int strlen, int encoding)
{
#define ENTITY_CACHE_SIZE 10 /* 10 seems a good value. */
@@ -987,7 +998,7 @@ get_entity_string(const unsigned char *str, const int strlen, int encoding)
static unsigned int nb_entity_cache[ENTITY_CACHE_MAXLEN];
static int first_time = 1;
unsigned int slen = 0;
- unsigned char *result = NULL;
+ const unsigned char *result = NULL;
if (strlen <= 0) return NULL;
@@ -1181,7 +1192,7 @@ convert_string(struct conv_table *convert_table,
/* Iterate ;-) */
while (charspos < charslen) {
- unsigned char *translit;
+ const unsigned char *translit;
#define PUTC do { \
buffer[bufferpos++] = chars[charspos++]; \
diff --git a/src/intl/charsets.h b/src/intl/charsets.h
index 34c416869..7f95e3e84 100644
--- a/src/intl/charsets.h
+++ b/src/intl/charsets.h
@@ -31,10 +31,24 @@ typedef uint32_t unicode_val_T;
#define NBSP_CHAR ((unsigned char) 1)
#define NBSP_CHAR_STRING "\001"
+/* How to convert a byte from a source charset. This is used in an
+ * array (struct conv_table[256]) indexed by the byte value. */
struct conv_table {
+ /* 0 if this is the final byte of a character, or 1 if more
+ * bytes are needed. */
int t;
union {
- unsigned char *str;
+ /* If @t==0: a null-terminated string that is the
+ * corresponding character in the target charset.
+ * Normally, the string is statically allocated.
+ * However, if the translation table is to UTF-8,
+ * then the strings in elements 0x80 to 0xFF are
+ * allocated with mem_alloc. */
+ const unsigned char *str;
+ /* If @t==1: a pointer to a nested conversion table
+ * (with 256 elements) that describes how to convert
+ * each possible subsequent byte. The conversion
+ * table owns the nested conversion table. */
struct conv_table *tbl;
} u;
};
@@ -58,7 +72,8 @@ enum nbsp_mode {
};
struct conv_table *get_translation_table(int, int);
-unsigned char *get_entity_string(const unsigned char *str, const int strlen, int encoding);
+const unsigned char *get_entity_string(const unsigned char *str,
+ const int strlen, int encoding);
/* The convert_string() name is also used by Samba (version 3.0.3), which
* provides libnss_wins.so.2, which is called somewhere inside
@@ -121,9 +136,9 @@ unicode_val_T cp_to_unicode(int, unsigned char **, unsigned char *);
#endif /* CONFIG_UTF8 */
unicode_val_T cp2u(int, unsigned char);
-unsigned char *cp2utf8(int, int);
+const unsigned char *cp2utf8(int, int);
-unsigned char *u2cp_(unicode_val_T, int, enum nbsp_mode);
+const unsigned char *u2cp_(unicode_val_T, int, enum nbsp_mode);
#define u2cp(u, to) u2cp_(u, to, NBSP_MODE_HACK)
#define u2cp_no_nbsp(u, to) u2cp_(u, to, NBSP_MODE_ASCII)
diff --git a/src/scripting/python/hooks.c b/src/scripting/python/hooks.c
index 23a07f07d..9ff63df18 100644
--- a/src/scripting/python/hooks.c
+++ b/src/scripting/python/hooks.c
@@ -15,7 +15,6 @@
#include "main/event.h"
#include "protocol/uri.h"
#include "scripting/python/core.h"
-#include "session/location.h"
#include "session/session.h"
#include "util/memory.h"
#include "util/string.h"
@@ -64,28 +63,7 @@ script_hook_url(va_list ap, void *data)
python_ses = ses;
- /*
- * Historical note: The only reason the goto and follow hooks are
- * treated differently is to maintain backwards compatibility for
- * people who already have a goto_url_hook() function in hooks.py
- * that expects a second argument. If we were starting over from
- * scratch, we could treat the goto and follow hooks identically and
- * simply pass @url as the sole argument in both cases; the Python
- * code for the goto hook no longer needs its @current_url argument
- * since it could instead determine the current URL by calling the
- * Python interpreter's elinks.current_url() function.
- */
- if (!strcmp(method, "goto_url_hook")) {
- unsigned char *current_url = NULL;
-
- if (python_ses && have_location(python_ses))
- current_url = struri(cur_loc(ses)->vs.uri);
-
- result = PyObject_CallMethod(python_hooks, method, "ss", *url,
- current_url);
- } else {
- result = PyObject_CallMethod(python_hooks, method, "s", *url);
- }
+ result = PyObject_CallMethod(python_hooks, method, "s", *url);
if (!result || !replace_with_python_string(url, result))
alert_python_error();
diff --git a/src/terminal/event.c b/src/terminal/event.c
index 49913aaba..6d5dc40c7 100644
--- a/src/terminal/event.c
+++ b/src/terminal/event.c
@@ -143,7 +143,7 @@ term_send_ucs(struct terminal *term, unicode_val_T u,
term_send_event(term, &ev);
#else /* !CONFIG_UTF8 */
struct term_event ev;
- unsigned char *recoded;
+ const unsigned char *recoded;
set_kbd_term_event(&ev, KBD_UNDEF, modifier);
recoded = u2cp_no_nbsp(u, get_opt_codepage_tree(term->spec, "charset"));
diff --git a/src/util/error.c b/src/util/error.c
index e2d5408e8..34e4c88f1 100644
--- a/src/util/error.c
+++ b/src/util/error.c
@@ -52,7 +52,7 @@ er(int bell, int shall_sleep, unsigned char *fmt, va_list params)
}
int errline;
-unsigned char *errfile;
+const unsigned char *errfile;
void
elinks_debug(unsigned char *fmt, ...)
diff --git a/src/util/error.h b/src/util/error.h
index 4b56b51d9..a97c921b8 100644
--- a/src/util/error.h
+++ b/src/util/error.h
@@ -11,7 +11,7 @@
/* This errfile thing is needed, as we don't have var-arg macros in standart,
* only as gcc extension :(. */
extern int errline;
-extern unsigned char *errfile;
+extern const unsigned char *errfile;
/* @DBG(format_string) is used for printing of debugging information. It
* should not be used anywhere in the official codebase (although it is often
diff --git a/src/util/memdebug.c b/src/util/memdebug.c
index 26c653807..612a91565 100644
--- a/src/util/memdebug.c
+++ b/src/util/memdebug.c
@@ -114,7 +114,7 @@ struct alloc_header {
#endif
int size;
int line;
- unsigned char *file;
+ const unsigned char *file;
unsigned char *comment;
#ifdef CHECK_XFLOWS
@@ -167,8 +167,8 @@ INIT_LIST_HEAD(memory_list);
#ifdef LOG_MEMORY_ALLOC
static void
-dump_short_info(struct alloc_header *ah, unsigned char *file, int line,
- unsigned char *type)
+dump_short_info(struct alloc_header *ah, const unsigned char *file, int line,
+ const unsigned char *type)
{
fprintf(stderr, "%p", PTR_AH2BASE(ah)), fflush(stderr);
fprintf(stderr, ":%d", ah->size), fflush(stderr);
@@ -184,8 +184,8 @@ dump_short_info(struct alloc_header *ah, unsigned char *file, int line,
#endif
static void
-dump_info(struct alloc_header *ah, unsigned char *info,
- unsigned char *file, int line, unsigned char *type)
+dump_info(struct alloc_header *ah, const unsigned char *info,
+ const unsigned char *file, int line, const unsigned char *type)
{
fprintf(stderr, "%p", PTR_AH2BASE(ah)); fflush(stderr);
/* In some extreme cases, we may core here, as 'ah' can no longer point
@@ -213,8 +213,8 @@ dump_info(struct alloc_header *ah, unsigned char *info,
#ifdef CHECK_AH_SANITY
static inline int
-bad_ah_sanity(struct alloc_header *ah, unsigned char *info,
- unsigned char *file, int line)
+bad_ah_sanity(struct alloc_header *ah, const unsigned char *info,
+ const unsigned char *file, int line)
{
if (!ah) return 1;
if (ah->magic != AH_SANITY_MAGIC) {
@@ -228,8 +228,8 @@ bad_ah_sanity(struct alloc_header *ah, unsigned char *info,
#ifdef CHECK_XFLOWS
static inline int
-bad_xflow_magic(struct alloc_header *ah, unsigned char *info,
- unsigned char *file, int line)
+bad_xflow_magic(struct alloc_header *ah, const unsigned char *info,
+ const unsigned char *file, int line)
{
if (!ah) return 1;
@@ -282,7 +282,7 @@ check_memory_leaks(void)
static int alloc_try = 0;
static int
-patience(unsigned char *file, int line, unsigned char *of)
+patience(const unsigned char *file, int line, const unsigned char *of)
{
errfile = file;
errline = line;
@@ -310,7 +310,7 @@ patience(unsigned char *file, int line, unsigned char *of)
}
void *
-debug_mem_alloc(unsigned char *file, int line, size_t size)
+debug_mem_alloc(const unsigned char *file, int line, size_t size)
{
struct alloc_header *ah;
size_t true_size;
@@ -354,7 +354,7 @@ debug_mem_alloc(unsigned char *file, int line, size_t size)
}
void *
-debug_mem_calloc(unsigned char *file, int line, size_t eltcount, size_t eltsize)
+debug_mem_calloc(const unsigned char *file, int line, size_t eltcount, size_t eltsize)
{
struct alloc_header *ah;
size_t size = eltcount * eltsize;
@@ -405,7 +405,7 @@ debug_mem_calloc(unsigned char *file, int line, size_t eltcount, size_t eltsize)
}
void
-debug_mem_free(unsigned char *file, int line, void *ptr)
+debug_mem_free(const unsigned char *file, int line, void *ptr)
{
struct alloc_header *ah;
int ok = 1;
@@ -485,7 +485,7 @@ debug_mem_free(unsigned char *file, int line, void *ptr)
}
void *
-debug_mem_realloc(unsigned char *file, int line, void *ptr, size_t size)
+debug_mem_realloc(const unsigned char *file, int line, void *ptr, size_t size)
{
struct alloc_header *ah, *ah2;
size_t true_size;
@@ -558,7 +558,7 @@ debug_mem_realloc(unsigned char *file, int line, void *ptr, size_t size)
}
void
-set_mem_comment(void *ptr, unsigned char *str, int len)
+set_mem_comment(void *ptr, const unsigned char *str, int len)
{
struct alloc_header *ah;
diff --git a/src/util/memdebug.h b/src/util/memdebug.h
index 3917be4fc..bcccd41a5 100644
--- a/src/util/memdebug.h
+++ b/src/util/memdebug.h
@@ -12,11 +12,11 @@ struct mem_stats {
extern struct mem_stats mem_stats;
-void *debug_mem_alloc(unsigned char *, int, size_t);
-void *debug_mem_calloc(unsigned char *, int, size_t, size_t);
-void debug_mem_free(unsigned char *, int, void *);
-void *debug_mem_realloc(unsigned char *, int, void *, size_t);
-void set_mem_comment(void *, unsigned char *, int);
+void *debug_mem_alloc(const unsigned char *, int, size_t);
+void *debug_mem_calloc(const unsigned char *, int, size_t, size_t);
+void debug_mem_free(const unsigned char *, int, void *);
+void *debug_mem_realloc(const unsigned char *, int, void *, size_t);
+void set_mem_comment(void *, const unsigned char *, int);
void check_memory_leaks(void);
diff --git a/src/util/memory.c b/src/util/memory.c
index 81dfbc82a..78ef23d23 100644
--- a/src/util/memory.c
+++ b/src/util/memory.c
@@ -187,7 +187,7 @@ mem_mmap_realloc(void *p, size_t old_size, size_t new_size)
void *p2 = mem_mmap_alloc(new_size);
if (p2) {
- memcpy(p2, p, old_size);
+ memcpy(p2, p, MIN(old_size, new_size));
mem_mmap_free(p, old_size);
return p2;
}
diff --git a/src/util/string.c b/src/util/string.c
index b8865568a..d6a213463 100644
--- a/src/util/string.c
+++ b/src/util/string.c
@@ -40,7 +40,7 @@
#ifdef DEBUG_MEMLEAK
unsigned char *
-debug_memacpy(unsigned char *f, int l, unsigned char *src, int len)
+debug_memacpy(const unsigned char *f, int l, const unsigned char *src, int len)
{
unsigned char *m;
@@ -57,7 +57,7 @@ debug_memacpy(unsigned char *f, int l, unsigned char *src, int len)
}
unsigned char *
-debug_stracpy(unsigned char *f, int l, unsigned char *src)
+debug_stracpy(const unsigned char *f, int l, const unsigned char *src)
{
string_assert(f, l, src, "stracpy");
if_assert_failed return NULL;
@@ -68,7 +68,7 @@ debug_stracpy(unsigned char *f, int l, unsigned char *src)
#else /* DEBUG_MEMLEAK */
unsigned char *
-memacpy(unsigned char *src, int len)
+memacpy(const unsigned char *src, int len)
{
unsigned char *m;
@@ -85,7 +85,7 @@ memacpy(unsigned char *src, int len)
}
unsigned char *
-stracpy(unsigned char *src)
+stracpy(const unsigned char *src)
{
assertm(src, "[stracpy]");
if_assert_failed return NULL;
@@ -116,7 +116,8 @@ add_to_strn(unsigned char **dst, unsigned char *src)
}
unsigned char *
-insert_in_string(unsigned char **dst, int pos, unsigned char *seq, int seqlen)
+insert_in_string(unsigned char **dst, int pos,
+ const unsigned char *seq, int seqlen)
{
int dstlen = strlen(*dst);
unsigned char *string = mem_realloc(*dst, dstlen + seqlen + 1);
diff --git a/src/util/string.h b/src/util/string.h
index 4e04bac6f..d3a0320cf 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -25,17 +25,17 @@
/* Allocates NUL terminated string with @len bytes from @src.
* If @src == NULL or @len < 0 only one byte is allocated and set it to 0. */
/* Returns the string or NULL on allocation failure. */
-unsigned char *memacpy(unsigned char *src, int len);
+unsigned char *memacpy(const unsigned char *src, int len);
/* Allocated NUL terminated string with the content of @src. */
-unsigned char *stracpy(unsigned char *src);
+unsigned char *stracpy(const unsigned char *src);
#else /* DEBUG_MEMLEAK */
-unsigned char *debug_memacpy(unsigned char *, int, unsigned char *, int);
+unsigned char *debug_memacpy(const unsigned char *, int, const unsigned char *, int);
#define memacpy(s, l) debug_memacpy(__FILE__, __LINE__, s, l)
-unsigned char *debug_stracpy(unsigned char *, int, unsigned char *);
+unsigned char *debug_stracpy(const unsigned char *, int, const unsigned char *);
#define stracpy(s) debug_stracpy(__FILE__, __LINE__, s)
#endif /* DEBUG_MEMLEAK */
@@ -47,8 +47,8 @@ void add_to_strn(unsigned char **str, unsigned char *src);
/* Inserts @seqlen chars from @seq at position @pos in the @dst string. */
/* If reallocation of @dst fails it is not touched and NULL is returned. */
-unsigned char *
-insert_in_string(unsigned char **dst, int pos, unsigned char *seq, int seqlen);
+unsigned char *insert_in_string(unsigned char **dst, int pos,
+ const unsigned char *seq, int seqlen);
/* Takes a list of strings where the last parameter _must_ be NULL and
* concatenates them. */
diff --git a/src/viewer/text/form.c b/src/viewer/text/form.c
index 83d904f4f..483931f68 100644
--- a/src/viewer/text/form.c
+++ b/src/viewer/text/form.c
@@ -1355,6 +1355,7 @@ field_op(struct session *ses, struct document_view *doc_view,
struct form_state *fs;
enum edit_action action_id;
unsigned char *text;
+ const unsigned char *ctext;
int length;
enum frame_event_status status = FRAME_EVENT_REFRESH;
#ifdef CONFIG_UTF8
@@ -1748,19 +1749,19 @@ field_op(struct session *ses, struct document_view *doc_view,
if (ses->tab->term->utf8) {
/* fs->value is in UTF-8 regardless of
* the charset of the terminal. */
- text = encode_utf8(get_kbd_key(ev));
+ ctext = encode_utf8(get_kbd_key(ev));
} else {
/* fs->value is in the charset of the
* terminal. */
int cp = get_opt_codepage_tree(ses->tab->term->spec,
"charset");
- text = u2cp_no_nbsp(get_kbd_key(ev), cp);
+ ctext = u2cp_no_nbsp(get_kbd_key(ev), cp);
}
- length = strlen(text);
+ length = strlen(ctext);
if (strlen(fs->value) + length > fc->maxlength
- || !insert_in_string(&fs->value, fs->state, text, length)) {
+ || !insert_in_string(&fs->value, fs->state, ctext, length)) {
status = FRAME_EVENT_OK;
break;
}