changeset 3122:c2864508b524

[MSVC] enable readline compilation
author Michael Goffioul <michael.goffioul@gmail.com>
date Fri, 05 Jul 2013 22:25:41 -0400
parents 21f598a028ec
children 38ee52ac978e
files dist-files.mk src/msvc-readline-1.patch src/readline-1-binding.patch src/readline.mk
diffstat 4 files changed, 1627 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/dist-files.mk	Fri Jul 05 22:24:48 2013 -0400
+++ b/dist-files.mk	Fri Jul 05 22:25:41 2013 -0400
@@ -293,6 +293,7 @@
   msvc-nettle-1.patch \
   msvc-ncurses-1.patch \
   msvc-qhull-1.patch \
+  msvc-readline-1.patch \
   msvc-suitesparse-1.patch \
   msvc-tiff-1.patch \
   msys-bash.mk \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/msvc-readline-1.patch	Fri Jul 05 22:25:41 2013 -0400
@@ -0,0 +1,1619 @@
+diff -ur readline-6.2-orig/bind.c readline-6.2-new/bind.c
+--- readline-6.2-orig/bind.c	2011-02-11 10:50:09 -0500
++++ readline-6.2-new/bind.c	2013-07-05 21:41:35 -0400
+@@ -65,7 +65,7 @@
+ #include "rlshell.h"
+ #include "xmalloc.h"
+ 
+-#if !defined (strchr) && !defined (__STDC__)
++#if !defined (strchr) && !defined (__STDC__) && !defined (_MSC_VER)
+ extern char *strchr (), *strrchr ();
+ #endif /* !strchr && !__STDC__ */
+ 
+diff -ur readline-6.2-orig/complete.c readline-6.2-new/complete.c
+--- readline-6.2-orig/complete.c	2011-01-16 15:32:57 -0500
++++ readline-6.2-new/complete.c	2013-07-05 21:41:35 -0400
+@@ -64,7 +64,7 @@
+ #include "xmalloc.h"
+ #include "rlprivate.h"
+ 
+-#ifdef __STDC__
++#if defined (__STDC__) || defined (_MSC_VER)
+ typedef int QSFUNC (const void *, const void *);
+ #else
+ typedef int QSFUNC ();
+diff -ur readline-6.2-orig/config.h.in readline-6.2-new/config.h.in
+--- readline-6.2-orig/config.h.in	2009-03-10 10:57:45 -0400
++++ readline-6.2-new/config.h.in	2013-07-05 21:41:35 -0400
+@@ -259,7 +259,7 @@
+ #  define TERMIOS_MISSING
+ #endif
+ 
+-#if defined (__STDC__) && defined (HAVE_STDARG_H)
++#if (defined (__STDC__) || defined (_MSC_VER)) && defined (HAVE_STDARG_H)
+ #  define PREFER_STDARG
+ #  define USE_VARARGS
+ #else
+diff -ur readline-6.2-orig/display.c readline-6.2-new/display.c
+--- readline-6.2-orig/display.c	2013-07-05 21:40:58 -0400
++++ readline-6.2-new/display.c	2013-07-05 21:55:45 -0400
+@@ -60,7 +60,7 @@
+ #define hStdout GetStdHandle(STD_OUTPUT_HANDLE)
+ #endif
+ 
+-#if !defined (strchr) && !defined (__STDC__)
++#if !defined (strchr) && !defined (__STDC__) && !defined (_MSC_VER)
+ extern char *strchr (), *strrchr ();
+ #endif /* !strchr && !__STDC__ */
+ 
+diff -ur readline-6.2-orig/examples/Makefile.in readline-6.2-new/examples/Makefile.in
+--- readline-6.2-orig/examples/Makefile.in	2010-12-28 15:55:32 -0500
++++ readline-6.2-new/examples/Makefile.in	2013-07-05 21:41:36 -0400
+@@ -96,13 +96,13 @@
+ 	-rmdir $(DESTDIR)$(installdir)
+ 
+ rl$(EXEEXT): rl.o $(READLINE_LIB)
+-	$(PURIFY) $(CC) $(LDFLAGS) -o $@ rl.o $(READLINE_LIB) $(TERMCAP_LIB)
++	$(PURIFY) $(CC) $(LDFLAGS) -o $@ rl.o $(READLINE_LIB) $(TERMCAP_LIB) -lgetopt
+ 
+ rlcat$(EXEEXT): rlcat.o $(READLINE_LIB)
+-	$(PURIFY) $(CC) $(LDFLAGS) -o $@ rlcat.o $(READLINE_LIB) $(TERMCAP_LIB)
++	$(PURIFY) $(CC) $(LDFLAGS) -o $@ rlcat.o $(READLINE_LIB) $(TERMCAP_LIB) -lgetopt
+ 
+ rlevent$(EXEEXT): rlevent.o $(READLINE_LIB)
+-	$(PURIFY) $(CC) $(LDFLAGS) -o $@ rlevent.o $(READLINE_LIB) $(TERMCAP_LIB)
++	$(PURIFY) $(CC) $(LDFLAGS) -o $@ rlevent.o $(READLINE_LIB) $(TERMCAP_LIB) -lgetopt
+ 
+ fileman$(EXEEXT): fileman.o $(READLINE_LIB)
+ 	$(PURIFY) $(CC) $(LDFLAGS) -o $@ fileman.o $(READLINE_LIB) $(TERMCAP_LIB)
+diff -ur readline-6.2-orig/examples/fileman.c readline-6.2-new/examples/fileman.c
+--- readline-6.2-orig/examples/fileman.c	2009-01-04 14:32:33 -0500
++++ readline-6.2-new/examples/fileman.c	2013-07-05 21:41:36 -0400
+@@ -248,6 +248,8 @@
+ 
+   /* Tell the completer that we want a crack first. */
+   rl_attempted_completion_function = fileman_completion;
++
++  return 0;
+ }
+ 
+ /* Attempt to complete on the contents of TEXT.  START and END bound the
+@@ -470,6 +472,8 @@
+   fprintf (stderr,
+            "%s: Too dangerous for me to distribute.  Write it yourself.\n",
+            caller);
++
++  return 0;
+ }
+ 
+ /* Return non-zero if ARG is a valid argument for CALLER, else print
+diff -ur readline-6.2-orig/examples/rlevent.c readline-6.2-new/examples/rlevent.c
+--- readline-6.2-orig/examples/rlevent.c	2009-01-06 12:04:26 -0500
++++ readline-6.2-new/examples/rlevent.c	2013-07-05 21:41:36 -0400
+@@ -50,10 +50,16 @@
+ extern int optind;
+ extern char *optarg;
+ 
+-#if !defined (strchr) && !defined (__STDC__)
++#if !defined (strchr) && !defined (__STDC__) && !defined (_MSC_VER)
+ extern char *strrchr();
+ #endif
+ 
++#ifdef _MSC_VER
++# define WIN32_LEAN_AND_MEAN
++# include <windows.h>
++# define sleep(x) Sleep((x)*1000)
++#endif
++
+ static char *progname;
+ static char *deftext;
+ 
+diff -ur readline-6.2-orig/funmap.c readline-6.2-new/funmap.c
+--- readline-6.2-orig/funmap.c	2010-05-30 18:32:37 -0400
++++ readline-6.2-new/funmap.c	2013-07-05 21:41:36 -0400
+@@ -40,7 +40,7 @@
+ 
+ #include "xmalloc.h"
+ 
+-#ifdef __STDC__
++#if defined (__STDC__) || defined (_MSC_VER)
+ typedef int QSFUNC (const void *, const void *);
+ #else
+ typedef int QSFUNC ();
+diff -ur readline-6.2-orig/histlib.h readline-6.2-new/histlib.h
+--- readline-6.2-orig/histlib.h	2009-01-04 14:32:33 -0500
++++ readline-6.2-new/histlib.h	2013-07-05 21:41:36 -0400
+@@ -51,7 +51,7 @@
+ #endif
+ 
+ #ifndef member
+-#  ifndef strchr
++#  if !defined (strchr) && !defined (_MSC_VER)
+ extern char *strchr ();
+ #  endif
+ #define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0)
+diff -ur readline-6.2-orig/history.c readline-6.2-new/history.c
+--- readline-6.2-orig/history.c	2010-07-25 17:39:41 -0400
++++ readline-6.2-new/history.c	2013-07-05 21:41:36 -0400
+@@ -248,6 +248,9 @@
+ 
+   t = (time_t) time ((time_t *)0);
+ #if defined (HAVE_VSNPRINTF)		/* assume snprintf if vsnprintf exists */
++# if defined (_MSC_VER) && !defined (snprintf)
++#  define snprintf _snprintf
++# endif
+   snprintf (ts, sizeof (ts) - 1, "X%lu", (unsigned long) t);
+ #else
+   sprintf (ts, "X%lu", (unsigned long) t);
+diff -ur readline-6.2-orig/history.h readline-6.2-new/history.h
+--- readline-6.2-orig/history.h	2009-01-04 14:32:33 -0500
++++ readline-6.2-new/history.h	2013-07-05 21:41:36 -0400
+@@ -68,93 +68,93 @@
+ 
+ /* Begin a session in which the history functions might be used.  This
+    just initializes the interactive variables. */
+-extern void using_history PARAMS((void));
++READLINE_API void using_history PARAMS((void));
+ 
+ /* Return the current HISTORY_STATE of the history. */
+-extern HISTORY_STATE *history_get_history_state PARAMS((void));
++READLINE_API HISTORY_STATE *history_get_history_state PARAMS((void));
+ 
+ /* Set the state of the current history array to STATE. */
+-extern void history_set_history_state PARAMS((HISTORY_STATE *));
++READLINE_API void history_set_history_state PARAMS((HISTORY_STATE *));
+ 
+ /* Manage the history list. */
+ 
+ /* Place STRING at the end of the history list.
+    The associated data field (if any) is set to NULL. */
+-extern void add_history PARAMS((const char *));
++READLINE_API void add_history PARAMS((const char *));
+ 
+ /* Change the timestamp associated with the most recent history entry to
+    STRING. */
+-extern void add_history_time PARAMS((const char *));
++READLINE_API void add_history_time PARAMS((const char *));
+ 
+ /* A reasonably useless function, only here for completeness.  WHICH
+    is the magic number that tells us which element to delete.  The
+    elements are numbered from 0. */
+-extern HIST_ENTRY *remove_history PARAMS((int));
++READLINE_API HIST_ENTRY *remove_history PARAMS((int));
+ 
+ /* Free the history entry H and return any application-specific data
+    associated with it. */
+-extern histdata_t free_history_entry PARAMS((HIST_ENTRY *));
++READLINE_API histdata_t free_history_entry PARAMS((HIST_ENTRY *));
+ 
+ /* Make the history entry at WHICH have LINE and DATA.  This returns
+    the old entry so you can dispose of the data.  In the case of an
+    invalid WHICH, a NULL pointer is returned. */
+-extern HIST_ENTRY *replace_history_entry PARAMS((int, const char *, histdata_t));
++READLINE_API HIST_ENTRY *replace_history_entry PARAMS((int, const char *, histdata_t));
+ 
+ /* Clear the history list and start over. */
+-extern void clear_history PARAMS((void));
++READLINE_API void clear_history PARAMS((void));
+ 
+ /* Stifle the history list, remembering only MAX number of entries. */
+-extern void stifle_history PARAMS((int));
++READLINE_API void stifle_history PARAMS((int));
+ 
+ /* Stop stifling the history.  This returns the previous amount the
+    history was stifled by.  The value is positive if the history was
+    stifled, negative if it wasn't. */
+-extern int unstifle_history PARAMS((void));
++READLINE_API int unstifle_history PARAMS((void));
+ 
+ /* Return 1 if the history is stifled, 0 if it is not. */
+-extern int history_is_stifled PARAMS((void));
++READLINE_API int history_is_stifled PARAMS((void));
+ 
+ /* Information about the history list. */
+ 
+ /* Return a NULL terminated array of HIST_ENTRY which is the current input
+    history.  Element 0 of this list is the beginning of time.  If there
+    is no history, return NULL. */
+-extern HIST_ENTRY **history_list PARAMS((void));
++READLINE_API HIST_ENTRY **history_list PARAMS((void));
+ 
+ /* Returns the number which says what history element we are now
+    looking at.  */
+-extern int where_history PARAMS((void));
++READLINE_API int where_history PARAMS((void));
+   
+ /* Return the history entry at the current position, as determined by
+    history_offset.  If there is no entry there, return a NULL pointer. */
+-extern HIST_ENTRY *current_history PARAMS((void));
++READLINE_API HIST_ENTRY *current_history PARAMS((void));
+ 
+ /* Return the history entry which is logically at OFFSET in the history
+    array.  OFFSET is relative to history_base. */
+-extern HIST_ENTRY *history_get PARAMS((int));
++READLINE_API HIST_ENTRY *history_get PARAMS((int));
+ 
+ /* Return the timestamp associated with the HIST_ENTRY * passed as an
+    argument */
+-extern time_t history_get_time PARAMS((HIST_ENTRY *));
++READLINE_API time_t history_get_time PARAMS((HIST_ENTRY *));
+ 
+ /* Return the number of bytes that the primary history entries are using.
+    This just adds up the lengths of the_history->lines. */
+-extern int history_total_bytes PARAMS((void));
++READLINE_API int history_total_bytes PARAMS((void));
+ 
+ /* Moving around the history list. */
+ 
+ /* Set the position in the history list to POS. */
+-extern int history_set_pos PARAMS((int));
++READLINE_API int history_set_pos PARAMS((int));
+ 
+ /* Back up history_offset to the previous history entry, and return
+    a pointer to that entry.  If there is no previous entry, return
+    a NULL pointer. */
+-extern HIST_ENTRY *previous_history PARAMS((void));
++READLINE_API HIST_ENTRY *previous_history PARAMS((void));
+ 
+ /* Move history_offset forward to the next item in the input_history,
+    and return the a pointer to that entry.  If there is no next entry,
+    return a NULL pointer. */
+-extern HIST_ENTRY *next_history PARAMS((void));
++READLINE_API HIST_ENTRY *next_history PARAMS((void));
+ 
+ /* Searching the history list. */
+ 
+@@ -164,45 +164,45 @@
+    current_history () is the history entry, and the value of this function
+    is the offset in the line of that history entry that the string was
+    found in.  Otherwise, nothing is changed, and a -1 is returned. */
+-extern int history_search PARAMS((const char *, int));
++READLINE_API int history_search PARAMS((const char *, int));
+ 
+ /* Search the history for STRING, starting at history_offset.
+    The search is anchored: matching lines must begin with string.
+    DIRECTION is as in history_search(). */
+-extern int history_search_prefix PARAMS((const char *, int));
++READLINE_API int history_search_prefix PARAMS((const char *, int));
+ 
+ /* Search for STRING in the history list, starting at POS, an
+    absolute index into the list.  DIR, if negative, says to search
+    backwards from POS, else forwards.
+    Returns the absolute index of the history element where STRING
+    was found, or -1 otherwise. */
+-extern int history_search_pos PARAMS((const char *, int, int));
++READLINE_API int history_search_pos PARAMS((const char *, int, int));
+ 
+ /* Managing the history file. */
+ 
+ /* Add the contents of FILENAME to the history list, a line at a time.
+    If FILENAME is NULL, then read from ~/.history.  Returns 0 if
+    successful, or errno if not. */
+-extern int read_history PARAMS((const char *));
++READLINE_API int read_history PARAMS((const char *));
+ 
+ /* Read a range of lines from FILENAME, adding them to the history list.
+    Start reading at the FROM'th line and end at the TO'th.  If FROM
+    is zero, start at the beginning.  If TO is less than FROM, read
+    until the end of the file.  If FILENAME is NULL, then read from
+    ~/.history.  Returns 0 if successful, or errno if not. */
+-extern int read_history_range PARAMS((const char *, int, int));
++READLINE_API int read_history_range PARAMS((const char *, int, int));
+ 
+ /* Write the current history to FILENAME.  If FILENAME is NULL,
+    then write the history list to ~/.history.  Values returned
+    are as in read_history ().  */
+-extern int write_history PARAMS((const char *));
++READLINE_API int write_history PARAMS((const char *));
+ 
+ /* Append NELEMENT entries to FILENAME.  The entries appended are from
+    the end of the list minus NELEMENTs up to the end of the list. */
+-extern int append_history PARAMS((int, const char *));
++READLINE_API int append_history PARAMS((int, const char *));
+ 
+ /* Truncate the history file, leaving only the last NLINES lines. */
+-extern int history_truncate_file PARAMS((const char *, int));
++READLINE_API int history_truncate_file PARAMS((const char *, int));
+ 
+ /* History expansion. */
+ 
+@@ -218,12 +218,12 @@
+ 
+   If an error ocurred in expansion, then OUTPUT contains a descriptive
+   error message. */
+-extern int history_expand PARAMS((char *, char **));
++READLINE_API int history_expand PARAMS((char *, char **));
+ 
+ /* Extract a string segment consisting of the FIRST through LAST
+    arguments present in STRING.  Arguments are broken up as in
+    the shell. */
+-extern char *history_arg_extract PARAMS((int, int, const char *));
++READLINE_API char *history_arg_extract PARAMS((int, int, const char *));
+ 
+ /* Return the text of the history event beginning at the current
+    offset into STRING.  Pass STRING with *INDEX equal to the
+@@ -231,33 +231,33 @@
+    DELIMITING_QUOTE is a character that is allowed to end the string
+    specification for what to search for in addition to the normal
+    characters `:', ` ', `\t', `\n', and sometimes `?'. */
+-extern char *get_history_event PARAMS((const char *, int *, int));
++READLINE_API char *get_history_event PARAMS((const char *, int *, int));
+ 
+ /* Return an array of tokens, much as the shell might.  The tokens are
+    parsed out of STRING. */
+-extern char **history_tokenize PARAMS((const char *));
++READLINE_API char **history_tokenize PARAMS((const char *));
+ 
+ /* Exported history variables. */
+-extern int history_base;
+-extern int history_length;
+-extern int history_max_entries;
+-extern char history_expansion_char;
+-extern char history_subst_char;
+-extern char *history_word_delimiters;
+-extern char history_comment_char;
+-extern char *history_no_expand_chars;
+-extern char *history_search_delimiter_chars;
+-extern int history_quotes_inhibit_expansion;
++READLINE_API int history_base;
++READLINE_API int history_length;
++READLINE_API int history_max_entries;
++READLINE_API char history_expansion_char;
++READLINE_API char history_subst_char;
++READLINE_API char *history_word_delimiters;
++READLINE_API char history_comment_char;
++READLINE_API char *history_no_expand_chars;
++READLINE_API char *history_search_delimiter_chars;
++READLINE_API int history_quotes_inhibit_expansion;
+ 
+-extern int history_write_timestamps;
++READLINE_API int history_write_timestamps;
+ 
+ /* Backwards compatibility */
+-extern int max_input_history;
++READLINE_API int max_input_history;
+ 
+ /* If set, this function is called to decide whether or not a particular
+    history expansion should be treated as a special case for the calling
+    application and not expanded. */
+-extern rl_linebuf_func_t *history_inhibit_expansion_function;
++READLINE_API rl_linebuf_func_t *history_inhibit_expansion_function;
+ 
+ #ifdef __cplusplus
+ }
+diff -ur readline-6.2-orig/keymaps.h readline-6.2-new/keymaps.h
+--- readline-6.2-orig/keymaps.h	2010-07-06 21:27:26 -0400
++++ readline-6.2-new/keymaps.h	2013-07-05 21:41:36 -0400
+@@ -60,35 +60,35 @@
+ #define ISKMAP 1
+ #define ISMACR 2
+ 
+-extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap;
+-extern KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap;
++READLINE_API KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap;
++READLINE_API KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap;
+ 
+ /* Return a new, empty keymap.
+    Free it with free() when you are done. */
+-extern Keymap rl_make_bare_keymap PARAMS((void));
++READLINE_API Keymap rl_make_bare_keymap PARAMS((void));
+ 
+ /* Return a new keymap which is a copy of MAP. */
+-extern Keymap rl_copy_keymap PARAMS((Keymap));
++READLINE_API Keymap rl_copy_keymap PARAMS((Keymap));
+ 
+ /* Return a new keymap with the printing characters bound to rl_insert,
+    the lowercase Meta characters bound to run their equivalents, and
+    the Meta digits bound to produce numeric arguments. */
+-extern Keymap rl_make_keymap PARAMS((void));
++READLINE_API Keymap rl_make_keymap PARAMS((void));
+ 
+ /* Free the storage associated with a keymap. */
+-extern void rl_discard_keymap PARAMS((Keymap));
++READLINE_API void rl_discard_keymap PARAMS((Keymap));
+ 
+ /* These functions actually appear in bind.c */
+ 
+ /* Return the keymap corresponding to a given name.  Names look like
+    `emacs' or `emacs-meta' or `vi-insert'.  */
+-extern Keymap rl_get_keymap_by_name PARAMS((const char *));
++READLINE_API Keymap rl_get_keymap_by_name PARAMS((const char *));
+ 
+ /* Return the current keymap. */
+-extern Keymap rl_get_keymap PARAMS((void));
++READLINE_API Keymap rl_get_keymap PARAMS((void));
+ 
+ /* Set the current keymap to MAP. */
+-extern void rl_set_keymap PARAMS((Keymap));
++READLINE_API void rl_set_keymap PARAMS((Keymap));
+ 
+ #ifdef __cplusplus
+ }
+diff -ur readline-6.2-orig/parens.c readline-6.2-new/parens.c
+--- readline-6.2-orig/parens.c	2009-04-19 13:12:06 -0400
++++ readline-6.2-new/parens.c	2013-07-05 21:41:36 -0400
+@@ -46,7 +46,7 @@
+ #  include <strings.h>
+ #endif /* !HAVE_STRING_H */
+ 
+-#if !defined (strchr) && !defined (__STDC__)
++#if !defined (strchr) && !defined (__STDC__) && !defined (_MSC_VER)
+ extern char *strchr (), *strrchr ();
+ #endif /* !strchr && !__STDC__ */
+ 
+diff -ur readline-6.2-orig/readline.h readline-6.2-new/readline.h
+--- readline-6.2-orig/readline.h	2011-01-16 15:33:09 -0500
++++ readline-6.2-new/readline.h	2013-07-05 21:41:36 -0400
+@@ -62,7 +62,7 @@
+ } UNDO_LIST;
+ 
+ /* The current undo list for RL_LINE_BUFFER. */
+-extern UNDO_LIST *rl_undo_list;
++READLINE_API UNDO_LIST *rl_undo_list;
+ 
+ /* The data structure for mapping textual names to code addresses. */
+ typedef struct _funmap {
+@@ -70,7 +70,7 @@
+   rl_command_func_t *function;
+ } FUNMAP;
+ 
+-extern FUNMAP **funmap;
++READLINE_API FUNMAP **funmap;
+ 
+ /* **************************************************************** */
+ /*								    */
+@@ -79,199 +79,199 @@
+ /* **************************************************************** */
+ 
+ /* Bindable commands for numeric arguments. */
+-extern int rl_digit_argument PARAMS((int, int));
+-extern int rl_universal_argument PARAMS((int, int));
++READLINE_API int rl_digit_argument PARAMS((int, int));
++READLINE_API int rl_universal_argument PARAMS((int, int));
+ 
+ /* Bindable commands for moving the cursor. */
+-extern int rl_forward_byte PARAMS((int, int));
+-extern int rl_forward_char PARAMS((int, int));
+-extern int rl_forward PARAMS((int, int));
+-extern int rl_backward_byte PARAMS((int, int));
+-extern int rl_backward_char PARAMS((int, int));
+-extern int rl_backward PARAMS((int, int));
+-extern int rl_beg_of_line PARAMS((int, int));
+-extern int rl_end_of_line PARAMS((int, int));
+-extern int rl_forward_word PARAMS((int, int));
+-extern int rl_backward_word PARAMS((int, int));
+-extern int rl_refresh_line PARAMS((int, int));
+-extern int rl_clear_screen PARAMS((int, int));
+-extern int rl_skip_csi_sequence PARAMS((int, int));
+-extern int rl_arrow_keys PARAMS((int, int));
++READLINE_API int rl_forward_byte PARAMS((int, int));
++READLINE_API int rl_forward_char PARAMS((int, int));
++READLINE_API int rl_forward PARAMS((int, int));
++READLINE_API int rl_backward_byte PARAMS((int, int));
++READLINE_API int rl_backward_char PARAMS((int, int));
++READLINE_API int rl_backward PARAMS((int, int));
++READLINE_API int rl_beg_of_line PARAMS((int, int));
++READLINE_API int rl_end_of_line PARAMS((int, int));
++READLINE_API int rl_forward_word PARAMS((int, int));
++READLINE_API int rl_backward_word PARAMS((int, int));
++READLINE_API int rl_refresh_line PARAMS((int, int));
++READLINE_API int rl_clear_screen PARAMS((int, int));
++READLINE_API int rl_skip_csi_sequence PARAMS((int, int));
++READLINE_API int rl_arrow_keys PARAMS((int, int));
+ 
+ /* Bindable commands for inserting and deleting text. */
+-extern int rl_insert PARAMS((int, int));
+-extern int rl_quoted_insert PARAMS((int, int));
+-extern int rl_tab_insert PARAMS((int, int));
+-extern int rl_newline PARAMS((int, int));
+-extern int rl_do_lowercase_version PARAMS((int, int));
+-extern int rl_rubout PARAMS((int, int));
+-extern int rl_delete PARAMS((int, int));
+-extern int rl_rubout_or_delete PARAMS((int, int));
+-extern int rl_delete_horizontal_space PARAMS((int, int));
+-extern int rl_delete_or_show_completions PARAMS((int, int));
+-extern int rl_insert_comment PARAMS((int, int));
++READLINE_API int rl_insert PARAMS((int, int));
++READLINE_API int rl_quoted_insert PARAMS((int, int));
++READLINE_API int rl_tab_insert PARAMS((int, int));
++READLINE_API int rl_newline PARAMS((int, int));
++READLINE_API int rl_do_lowercase_version PARAMS((int, int));
++READLINE_API int rl_rubout PARAMS((int, int));
++READLINE_API int rl_delete PARAMS((int, int));
++READLINE_API int rl_rubout_or_delete PARAMS((int, int));
++READLINE_API int rl_delete_horizontal_space PARAMS((int, int));
++READLINE_API int rl_delete_or_show_completions PARAMS((int, int));
++READLINE_API int rl_insert_comment PARAMS((int, int));
+ 
+ /* Bindable commands for changing case. */
+-extern int rl_upcase_word PARAMS((int, int));
+-extern int rl_downcase_word PARAMS((int, int));
+-extern int rl_capitalize_word PARAMS((int, int));
++READLINE_API int rl_upcase_word PARAMS((int, int));
++READLINE_API int rl_downcase_word PARAMS((int, int));
++READLINE_API int rl_capitalize_word PARAMS((int, int));
+ 
+ /* Bindable commands for transposing characters and words. */
+-extern int rl_transpose_words PARAMS((int, int));
+-extern int rl_transpose_chars PARAMS((int, int));
++READLINE_API int rl_transpose_words PARAMS((int, int));
++READLINE_API int rl_transpose_chars PARAMS((int, int));
+ 
+ /* Bindable commands for searching within a line. */
+-extern int rl_char_search PARAMS((int, int));
+-extern int rl_backward_char_search PARAMS((int, int));
++READLINE_API int rl_char_search PARAMS((int, int));
++READLINE_API int rl_backward_char_search PARAMS((int, int));
+ 
+ /* Bindable commands for readline's interface to the command history. */
+-extern int rl_beginning_of_history PARAMS((int, int));
+-extern int rl_end_of_history PARAMS((int, int));
+-extern int rl_get_next_history PARAMS((int, int));
+-extern int rl_get_previous_history PARAMS((int, int));
++READLINE_API int rl_beginning_of_history PARAMS((int, int));
++READLINE_API int rl_end_of_history PARAMS((int, int));
++READLINE_API int rl_get_next_history PARAMS((int, int));
++READLINE_API int rl_get_previous_history PARAMS((int, int));
+ 
+ /* Bindable commands for managing the mark and region. */
+-extern int rl_set_mark PARAMS((int, int));
+-extern int rl_exchange_point_and_mark PARAMS((int, int));
++READLINE_API int rl_set_mark PARAMS((int, int));
++READLINE_API int rl_exchange_point_and_mark PARAMS((int, int));
+ 
+ /* Bindable commands to set the editing mode (emacs or vi). */
+-extern int rl_vi_editing_mode PARAMS((int, int));
+-extern int rl_emacs_editing_mode PARAMS((int, int));
++READLINE_API int rl_vi_editing_mode PARAMS((int, int));
++READLINE_API int rl_emacs_editing_mode PARAMS((int, int));
+ 
+ /* Bindable commands to change the insert mode (insert or overwrite) */
+-extern int rl_overwrite_mode PARAMS((int, int));
++READLINE_API int rl_overwrite_mode PARAMS((int, int));
+ 
+ /* Bindable commands for managing key bindings. */
+-extern int rl_re_read_init_file PARAMS((int, int));
+-extern int rl_dump_functions PARAMS((int, int));
+-extern int rl_dump_macros PARAMS((int, int));
+-extern int rl_dump_variables PARAMS((int, int));
++READLINE_API int rl_re_read_init_file PARAMS((int, int));
++READLINE_API int rl_dump_functions PARAMS((int, int));
++READLINE_API int rl_dump_macros PARAMS((int, int));
++READLINE_API int rl_dump_variables PARAMS((int, int));
+ 
+ /* Bindable commands for word completion. */
+-extern int rl_complete PARAMS((int, int));
+-extern int rl_possible_completions PARAMS((int, int));
+-extern int rl_insert_completions PARAMS((int, int));
+-extern int rl_old_menu_complete PARAMS((int, int));
+-extern int rl_menu_complete PARAMS((int, int));
+-extern int rl_backward_menu_complete PARAMS((int, int));
++READLINE_API int rl_complete PARAMS((int, int));
++READLINE_API int rl_possible_completions PARAMS((int, int));
++READLINE_API int rl_insert_completions PARAMS((int, int));
++READLINE_API int rl_old_menu_complete PARAMS((int, int));
++READLINE_API int rl_menu_complete PARAMS((int, int));
++READLINE_API int rl_backward_menu_complete PARAMS((int, int));
+ 
+ /* Bindable commands for killing and yanking text, and managing the kill ring. */
+-extern int rl_kill_word PARAMS((int, int));
+-extern int rl_backward_kill_word PARAMS((int, int));
+-extern int rl_kill_line PARAMS((int, int));
+-extern int rl_backward_kill_line PARAMS((int, int));
+-extern int rl_kill_full_line PARAMS((int, int));
+-extern int rl_unix_word_rubout PARAMS((int, int));
+-extern int rl_unix_filename_rubout PARAMS((int, int));
+-extern int rl_unix_line_discard PARAMS((int, int));
+-extern int rl_copy_region_to_kill PARAMS((int, int));
+-extern int rl_kill_region PARAMS((int, int));
+-extern int rl_copy_forward_word PARAMS((int, int));
+-extern int rl_copy_backward_word PARAMS((int, int));
+-extern int rl_yank PARAMS((int, int));
+-extern int rl_yank_pop PARAMS((int, int));
+-extern int rl_yank_nth_arg PARAMS((int, int));
+-extern int rl_yank_last_arg PARAMS((int, int));
++READLINE_API int rl_kill_word PARAMS((int, int));
++READLINE_API int rl_backward_kill_word PARAMS((int, int));
++READLINE_API int rl_kill_line PARAMS((int, int));
++READLINE_API int rl_backward_kill_line PARAMS((int, int));
++READLINE_API int rl_kill_full_line PARAMS((int, int));
++READLINE_API int rl_unix_word_rubout PARAMS((int, int));
++READLINE_API int rl_unix_filename_rubout PARAMS((int, int));
++READLINE_API int rl_unix_line_discard PARAMS((int, int));
++READLINE_API int rl_copy_region_to_kill PARAMS((int, int));
++READLINE_API int rl_kill_region PARAMS((int, int));
++READLINE_API int rl_copy_forward_word PARAMS((int, int));
++READLINE_API int rl_copy_backward_word PARAMS((int, int));
++READLINE_API int rl_yank PARAMS((int, int));
++READLINE_API int rl_yank_pop PARAMS((int, int));
++READLINE_API int rl_yank_nth_arg PARAMS((int, int));
++READLINE_API int rl_yank_last_arg PARAMS((int, int));
+ /* Not available unless __CYGWIN__ is defined. */
+ #ifdef __CYGWIN__
+-extern int rl_paste_from_clipboard PARAMS((int, int));
++READLINE_API int rl_paste_from_clipboard PARAMS((int, int));
+ #endif
+ 
+ /* Bindable commands for incremental searching. */
+-extern int rl_reverse_search_history PARAMS((int, int));
+-extern int rl_forward_search_history PARAMS((int, int));
++READLINE_API int rl_reverse_search_history PARAMS((int, int));
++READLINE_API int rl_forward_search_history PARAMS((int, int));
+ 
+ /* Bindable keyboard macro commands. */
+-extern int rl_start_kbd_macro PARAMS((int, int));
+-extern int rl_end_kbd_macro PARAMS((int, int));
+-extern int rl_call_last_kbd_macro PARAMS((int, int));
++READLINE_API int rl_start_kbd_macro PARAMS((int, int));
++READLINE_API int rl_end_kbd_macro PARAMS((int, int));
++READLINE_API int rl_call_last_kbd_macro PARAMS((int, int));
+ 
+ /* Bindable undo commands. */
+-extern int rl_revert_line PARAMS((int, int));
+-extern int rl_undo_command PARAMS((int, int));
++READLINE_API int rl_revert_line PARAMS((int, int));
++READLINE_API int rl_undo_command PARAMS((int, int));
+ 
+ /* Bindable tilde expansion commands. */
+-extern int rl_tilde_expand PARAMS((int, int));
++READLINE_API int rl_tilde_expand PARAMS((int, int));
+ 
+ /* Bindable terminal control commands. */
+-extern int rl_restart_output PARAMS((int, int));
+-extern int rl_stop_output PARAMS((int, int));
++READLINE_API int rl_restart_output PARAMS((int, int));
++READLINE_API int rl_stop_output PARAMS((int, int));
+ 
+ /* Miscellaneous bindable commands. */
+-extern int rl_abort PARAMS((int, int));
+-extern int rl_tty_status PARAMS((int, int));
++READLINE_API int rl_abort PARAMS((int, int));
++READLINE_API int rl_tty_status PARAMS((int, int));
+ 
+ /* Bindable commands for incremental and non-incremental history searching. */
+-extern int rl_history_search_forward PARAMS((int, int));
+-extern int rl_history_search_backward PARAMS((int, int));
+-extern int rl_noninc_forward_search PARAMS((int, int));
+-extern int rl_noninc_reverse_search PARAMS((int, int));
+-extern int rl_noninc_forward_search_again PARAMS((int, int));
+-extern int rl_noninc_reverse_search_again PARAMS((int, int));
++READLINE_API int rl_history_search_forward PARAMS((int, int));
++READLINE_API int rl_history_search_backward PARAMS((int, int));
++READLINE_API int rl_noninc_forward_search PARAMS((int, int));
++READLINE_API int rl_noninc_reverse_search PARAMS((int, int));
++READLINE_API int rl_noninc_forward_search_again PARAMS((int, int));
++READLINE_API int rl_noninc_reverse_search_again PARAMS((int, int));
+ 
+ /* Bindable command used when inserting a matching close character. */
+-extern int rl_insert_close PARAMS((int, int));
++READLINE_API int rl_insert_close PARAMS((int, int));
+ 
+ /* Not available unless READLINE_CALLBACKS is defined. */
+-extern void rl_callback_handler_install PARAMS((const char *, rl_vcpfunc_t *));
+-extern void rl_callback_read_char PARAMS((void));
+-extern void rl_callback_handler_remove PARAMS((void));
++READLINE_API void rl_callback_handler_install PARAMS((const char *, rl_vcpfunc_t *));
++READLINE_API void rl_callback_read_char PARAMS((void));
++READLINE_API void rl_callback_handler_remove PARAMS((void));
+ 
+ /* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */
+ /* VI-mode bindable commands. */
+-extern int rl_vi_redo PARAMS((int, int));
+-extern int rl_vi_undo PARAMS((int, int));
+-extern int rl_vi_yank_arg PARAMS((int, int));
+-extern int rl_vi_fetch_history PARAMS((int, int));
+-extern int rl_vi_search_again PARAMS((int, int));
+-extern int rl_vi_search PARAMS((int, int));
+-extern int rl_vi_complete PARAMS((int, int));
+-extern int rl_vi_tilde_expand PARAMS((int, int));
+-extern int rl_vi_prev_word PARAMS((int, int));
+-extern int rl_vi_next_word PARAMS((int, int));
+-extern int rl_vi_end_word PARAMS((int, int));
+-extern int rl_vi_insert_beg PARAMS((int, int));
+-extern int rl_vi_append_mode PARAMS((int, int));
+-extern int rl_vi_append_eol PARAMS((int, int));
+-extern int rl_vi_eof_maybe PARAMS((int, int));
+-extern int rl_vi_insertion_mode PARAMS((int, int));
+-extern int rl_vi_insert_mode PARAMS((int, int));
+-extern int rl_vi_movement_mode PARAMS((int, int));
+-extern int rl_vi_arg_digit PARAMS((int, int));
+-extern int rl_vi_change_case PARAMS((int, int));
+-extern int rl_vi_put PARAMS((int, int));
+-extern int rl_vi_column PARAMS((int, int));
+-extern int rl_vi_delete_to PARAMS((int, int));
+-extern int rl_vi_change_to PARAMS((int, int));
+-extern int rl_vi_yank_to PARAMS((int, int));
+-extern int rl_vi_rubout PARAMS((int, int));
+-extern int rl_vi_delete PARAMS((int, int));
+-extern int rl_vi_back_to_indent PARAMS((int, int));
+-extern int rl_vi_first_print PARAMS((int, int));
+-extern int rl_vi_char_search PARAMS((int, int));
+-extern int rl_vi_match PARAMS((int, int));
+-extern int rl_vi_change_char PARAMS((int, int));
+-extern int rl_vi_subst PARAMS((int, int));
+-extern int rl_vi_overstrike PARAMS((int, int));
+-extern int rl_vi_overstrike_delete PARAMS((int, int));
+-extern int rl_vi_replace PARAMS((int, int));
+-extern int rl_vi_set_mark PARAMS((int, int));
+-extern int rl_vi_goto_mark PARAMS((int, int));
++READLINE_API int rl_vi_redo PARAMS((int, int));
++READLINE_API int rl_vi_undo PARAMS((int, int));
++READLINE_API int rl_vi_yank_arg PARAMS((int, int));
++READLINE_API int rl_vi_fetch_history PARAMS((int, int));
++READLINE_API int rl_vi_search_again PARAMS((int, int));
++READLINE_API int rl_vi_search PARAMS((int, int));
++READLINE_API int rl_vi_complete PARAMS((int, int));
++READLINE_API int rl_vi_tilde_expand PARAMS((int, int));
++READLINE_API int rl_vi_prev_word PARAMS((int, int));
++READLINE_API int rl_vi_next_word PARAMS((int, int));
++READLINE_API int rl_vi_end_word PARAMS((int, int));
++READLINE_API int rl_vi_insert_beg PARAMS((int, int));
++READLINE_API int rl_vi_append_mode PARAMS((int, int));
++READLINE_API int rl_vi_append_eol PARAMS((int, int));
++READLINE_API int rl_vi_eof_maybe PARAMS((int, int));
++READLINE_API int rl_vi_insertion_mode PARAMS((int, int));
++READLINE_API int rl_vi_insert_mode PARAMS((int, int));
++READLINE_API int rl_vi_movement_mode PARAMS((int, int));
++READLINE_API int rl_vi_arg_digit PARAMS((int, int));
++READLINE_API int rl_vi_change_case PARAMS((int, int));
++READLINE_API int rl_vi_put PARAMS((int, int));
++READLINE_API int rl_vi_column PARAMS((int, int));
++READLINE_API int rl_vi_delete_to PARAMS((int, int));
++READLINE_API int rl_vi_change_to PARAMS((int, int));
++READLINE_API int rl_vi_yank_to PARAMS((int, int));
++READLINE_API int rl_vi_rubout PARAMS((int, int));
++READLINE_API int rl_vi_delete PARAMS((int, int));
++READLINE_API int rl_vi_back_to_indent PARAMS((int, int));
++READLINE_API int rl_vi_first_print PARAMS((int, int));
++READLINE_API int rl_vi_char_search PARAMS((int, int));
++READLINE_API int rl_vi_match PARAMS((int, int));
++READLINE_API int rl_vi_change_char PARAMS((int, int));
++READLINE_API int rl_vi_subst PARAMS((int, int));
++READLINE_API int rl_vi_overstrike PARAMS((int, int));
++READLINE_API int rl_vi_overstrike_delete PARAMS((int, int));
++READLINE_API int rl_vi_replace PARAMS((int, int));
++READLINE_API int rl_vi_set_mark PARAMS((int, int));
++READLINE_API int rl_vi_goto_mark PARAMS((int, int));
+ 
+ /* VI-mode utility functions. */
+-extern int rl_vi_check PARAMS((void));
+-extern int rl_vi_domove PARAMS((int, int *));
+-extern int rl_vi_bracktype PARAMS((int));
++READLINE_API int rl_vi_check PARAMS((void));
++READLINE_API int rl_vi_domove PARAMS((int, int *));
++READLINE_API int rl_vi_bracktype PARAMS((int));
+ 
+-extern void rl_vi_start_inserting PARAMS((int, int, int));
++READLINE_API void rl_vi_start_inserting PARAMS((int, int, int));
+ 
+ /* VI-mode pseudo-bindable commands, used as utility functions. */
+-extern int rl_vi_fWord PARAMS((int, int));
+-extern int rl_vi_bWord PARAMS((int, int));
+-extern int rl_vi_eWord PARAMS((int, int));
+-extern int rl_vi_fword PARAMS((int, int));
+-extern int rl_vi_bword PARAMS((int, int));
+-extern int rl_vi_eword PARAMS((int, int));
++READLINE_API int rl_vi_fWord PARAMS((int, int));
++READLINE_API int rl_vi_bWord PARAMS((int, int));
++READLINE_API int rl_vi_eWord PARAMS((int, int));
++READLINE_API int rl_vi_fword PARAMS((int, int));
++READLINE_API int rl_vi_bword PARAMS((int, int));
++READLINE_API int rl_vi_eword PARAMS((int, int));
+ 
+ /* **************************************************************** */
+ /*								    */
+@@ -281,190 +281,190 @@
+ 
+ /* Readline functions. */
+ /* Read a line of input.  Prompt with PROMPT.  A NULL PROMPT means none. */
+-extern char *readline PARAMS((const char *));
++READLINE_API char *readline PARAMS((const char *));
+ 
+-extern int rl_set_prompt PARAMS((const char *));
+-extern int rl_expand_prompt PARAMS((char *));
++READLINE_API int rl_set_prompt PARAMS((const char *));
++READLINE_API int rl_expand_prompt PARAMS((char *));
+ 
+-extern int rl_initialize PARAMS((void));
++READLINE_API int rl_initialize PARAMS((void));
+ 
+ /* Undocumented; unused by readline */
+-extern int rl_discard_argument PARAMS((void));
++READLINE_API int rl_discard_argument PARAMS((void));
+ 
+ /* Utility functions to bind keys to readline commands. */
+-extern int rl_add_defun PARAMS((const char *, rl_command_func_t *, int));
+-extern int rl_bind_key PARAMS((int, rl_command_func_t *));
+-extern int rl_bind_key_in_map PARAMS((int, rl_command_func_t *, Keymap));
+-extern int rl_unbind_key PARAMS((int));
+-extern int rl_unbind_key_in_map PARAMS((int, Keymap));
+-extern int rl_bind_key_if_unbound PARAMS((int, rl_command_func_t *));
+-extern int rl_bind_key_if_unbound_in_map PARAMS((int, rl_command_func_t *, Keymap));
+-extern int rl_unbind_function_in_map PARAMS((rl_command_func_t *, Keymap));
+-extern int rl_unbind_command_in_map PARAMS((const char *, Keymap));
+-extern int rl_bind_keyseq PARAMS((const char *, rl_command_func_t *));
+-extern int rl_bind_keyseq_in_map PARAMS((const char *, rl_command_func_t *, Keymap));
+-extern int rl_bind_keyseq_if_unbound PARAMS((const char *, rl_command_func_t *));
+-extern int rl_bind_keyseq_if_unbound_in_map PARAMS((const char *, rl_command_func_t *, Keymap));
+-extern int rl_generic_bind PARAMS((int, const char *, char *, Keymap));
++READLINE_API int rl_add_defun PARAMS((const char *, rl_command_func_t *, int));
++READLINE_API int rl_bind_key PARAMS((int, rl_command_func_t *));
++READLINE_API int rl_bind_key_in_map PARAMS((int, rl_command_func_t *, Keymap));
++READLINE_API int rl_unbind_key PARAMS((int));
++READLINE_API int rl_unbind_key_in_map PARAMS((int, Keymap));
++READLINE_API int rl_bind_key_if_unbound PARAMS((int, rl_command_func_t *));
++READLINE_API int rl_bind_key_if_unbound_in_map PARAMS((int, rl_command_func_t *, Keymap));
++READLINE_API int rl_unbind_function_in_map PARAMS((rl_command_func_t *, Keymap));
++READLINE_API int rl_unbind_command_in_map PARAMS((const char *, Keymap));
++READLINE_API int rl_bind_keyseq PARAMS((const char *, rl_command_func_t *));
++READLINE_API int rl_bind_keyseq_in_map PARAMS((const char *, rl_command_func_t *, Keymap));
++READLINE_API int rl_bind_keyseq_if_unbound PARAMS((const char *, rl_command_func_t *));
++READLINE_API int rl_bind_keyseq_if_unbound_in_map PARAMS((const char *, rl_command_func_t *, Keymap));
++READLINE_API int rl_generic_bind PARAMS((int, const char *, char *, Keymap));
+ 
+-extern char *rl_variable_value PARAMS((const char *));
+-extern int rl_variable_bind PARAMS((const char *, const char *));
++READLINE_API char *rl_variable_value PARAMS((const char *));
++READLINE_API int rl_variable_bind PARAMS((const char *, const char *));
+ 
+ /* Backwards compatibility, use rl_bind_keyseq_in_map instead. */
+-extern int rl_set_key PARAMS((const char *, rl_command_func_t *, Keymap));
++READLINE_API int rl_set_key PARAMS((const char *, rl_command_func_t *, Keymap));
+ 
+ /* Backwards compatibility, use rl_generic_bind instead. */
+-extern int rl_macro_bind PARAMS((const char *, const char *, Keymap));
++READLINE_API int rl_macro_bind PARAMS((const char *, const char *, Keymap));
+ 
+ /* Undocumented in the texinfo manual; not really useful to programs. */
+-extern int rl_translate_keyseq PARAMS((const char *, char *, int *));
+-extern char *rl_untranslate_keyseq PARAMS((int));
++READLINE_API int rl_translate_keyseq PARAMS((const char *, char *, int *));
++READLINE_API char *rl_untranslate_keyseq PARAMS((int));
+ 
+-extern rl_command_func_t *rl_named_function PARAMS((const char *));
+-extern rl_command_func_t *rl_function_of_keyseq PARAMS((const char *, Keymap, int *));
++READLINE_API rl_command_func_t *rl_named_function PARAMS((const char *));
++READLINE_API rl_command_func_t *rl_function_of_keyseq PARAMS((const char *, Keymap, int *));
+ 
+-extern void rl_list_funmap_names PARAMS((void));
+-extern char **rl_invoking_keyseqs_in_map PARAMS((rl_command_func_t *, Keymap));
+-extern char **rl_invoking_keyseqs PARAMS((rl_command_func_t *));
++READLINE_API void rl_list_funmap_names PARAMS((void));
++READLINE_API char **rl_invoking_keyseqs_in_map PARAMS((rl_command_func_t *, Keymap));
++READLINE_API char **rl_invoking_keyseqs PARAMS((rl_command_func_t *));
+  
+-extern void rl_function_dumper PARAMS((int));
+-extern void rl_macro_dumper PARAMS((int));
+-extern void rl_variable_dumper PARAMS((int));
++READLINE_API void rl_function_dumper PARAMS((int));
++READLINE_API void rl_macro_dumper PARAMS((int));
++READLINE_API void rl_variable_dumper PARAMS((int));
+ 
+-extern int rl_read_init_file PARAMS((const char *));
+-extern int rl_parse_and_bind PARAMS((char *));
++READLINE_API int rl_read_init_file PARAMS((const char *));
++READLINE_API int rl_parse_and_bind PARAMS((char *));
+ 
+ /* Functions for manipulating keymaps. */
+-extern Keymap rl_make_bare_keymap PARAMS((void));
+-extern Keymap rl_copy_keymap PARAMS((Keymap));
+-extern Keymap rl_make_keymap PARAMS((void));
+-extern void rl_discard_keymap PARAMS((Keymap));
+-
+-extern Keymap rl_get_keymap_by_name PARAMS((const char *));
+-extern char *rl_get_keymap_name PARAMS((Keymap));
+-extern void rl_set_keymap PARAMS((Keymap));
+-extern Keymap rl_get_keymap PARAMS((void));
++READLINE_API Keymap rl_make_bare_keymap PARAMS((void));
++READLINE_API Keymap rl_copy_keymap PARAMS((Keymap));
++READLINE_API Keymap rl_make_keymap PARAMS((void));
++READLINE_API void rl_discard_keymap PARAMS((Keymap));
++
++READLINE_API Keymap rl_get_keymap_by_name PARAMS((const char *));
++READLINE_API char *rl_get_keymap_name PARAMS((Keymap));
++READLINE_API void rl_set_keymap PARAMS((Keymap));
++READLINE_API Keymap rl_get_keymap PARAMS((void));
+ /* Undocumented; used internally only. */
+-extern void rl_set_keymap_from_edit_mode PARAMS((void));
+-extern char *rl_get_keymap_name_from_edit_mode PARAMS((void));
++READLINE_API void rl_set_keymap_from_edit_mode PARAMS((void));
++READLINE_API char *rl_get_keymap_name_from_edit_mode PARAMS((void));
+ 
+ /* Functions for manipulating the funmap, which maps command names to functions. */
+-extern int rl_add_funmap_entry PARAMS((const char *, rl_command_func_t *));
+-extern const char **rl_funmap_names PARAMS((void));
++READLINE_API int rl_add_funmap_entry PARAMS((const char *, rl_command_func_t *));
++READLINE_API const char **rl_funmap_names PARAMS((void));
+ /* Undocumented, only used internally -- there is only one funmap, and this
+    function may be called only once. */
+-extern void rl_initialize_funmap PARAMS((void));
++READLINE_API void rl_initialize_funmap PARAMS((void));
+ 
+ /* Utility functions for managing keyboard macros. */
+-extern void rl_push_macro_input PARAMS((char *));
++READLINE_API void rl_push_macro_input PARAMS((char *));
+ 
+ /* Functions for undoing, from undo.c */
+-extern void rl_add_undo PARAMS((enum undo_code, int, int, char *));
+-extern void rl_free_undo_list PARAMS((void));
+-extern int rl_do_undo PARAMS((void));
+-extern int rl_begin_undo_group PARAMS((void));
+-extern int rl_end_undo_group PARAMS((void));
+-extern int rl_modifying PARAMS((int, int));
++READLINE_API void rl_add_undo PARAMS((enum undo_code, int, int, char *));
++READLINE_API void rl_free_undo_list PARAMS((void));
++READLINE_API int rl_do_undo PARAMS((void));
++READLINE_API int rl_begin_undo_group PARAMS((void));
++READLINE_API int rl_end_undo_group PARAMS((void));
++READLINE_API int rl_modifying PARAMS((int, int));
+ 
+ /* Functions for redisplay. */
+-extern void rl_redisplay PARAMS((void));
+-extern int rl_on_new_line PARAMS((void));
+-extern int rl_on_new_line_with_prompt PARAMS((void));
+-extern int rl_forced_update_display PARAMS((void));
+-extern int rl_clear_message PARAMS((void));
+-extern int rl_reset_line_state PARAMS((void));
+-extern int rl_crlf PARAMS((void));
++READLINE_API void rl_redisplay PARAMS((void));
++READLINE_API int rl_on_new_line PARAMS((void));
++READLINE_API int rl_on_new_line_with_prompt PARAMS((void));
++READLINE_API int rl_forced_update_display PARAMS((void));
++READLINE_API int rl_clear_message PARAMS((void));
++READLINE_API int rl_reset_line_state PARAMS((void));
++READLINE_API int rl_crlf PARAMS((void));
+ 
+ #if defined (USE_VARARGS) && defined (PREFER_STDARG)
+-extern int rl_message (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
++READLINE_API int rl_message (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
+ #else
+-extern int rl_message ();
++READLINE_API int rl_message ();
+ #endif
+ 
+-extern int rl_show_char PARAMS((int));
++READLINE_API int rl_show_char PARAMS((int));
+ 
+ /* Undocumented in texinfo manual. */
+-extern int rl_character_len PARAMS((int, int));
++READLINE_API int rl_character_len PARAMS((int, int));
+ 
+ /* Save and restore internal prompt redisplay information. */
+-extern void rl_save_prompt PARAMS((void));
+-extern void rl_restore_prompt PARAMS((void));
++READLINE_API void rl_save_prompt PARAMS((void));
++READLINE_API void rl_restore_prompt PARAMS((void));
+ 
+ /* Modifying text. */
+-extern void rl_replace_line PARAMS((const char *, int));
+-extern int rl_insert_text PARAMS((const char *));
+-extern int rl_delete_text PARAMS((int, int));
+-extern int rl_kill_text PARAMS((int, int));
+-extern char *rl_copy_text PARAMS((int, int));
++READLINE_API void rl_replace_line PARAMS((const char *, int));
++READLINE_API int rl_insert_text PARAMS((const char *));
++READLINE_API int rl_delete_text PARAMS((int, int));
++READLINE_API int rl_kill_text PARAMS((int, int));
++READLINE_API char *rl_copy_text PARAMS((int, int));
+ 
+ /* Terminal and tty mode management. */
+-extern void rl_prep_terminal PARAMS((int));
+-extern void rl_deprep_terminal PARAMS((void));
+-extern void rl_tty_set_default_bindings PARAMS((Keymap));
+-extern void rl_tty_unset_default_bindings PARAMS((Keymap));
+-
+-extern int rl_reset_terminal PARAMS((const char *));
+-extern void rl_resize_terminal PARAMS((void));
+-extern void rl_set_screen_size PARAMS((int, int));
+-extern void rl_get_screen_size PARAMS((int *, int *));
+-extern void rl_reset_screen_size PARAMS((void));
++READLINE_API void rl_prep_terminal PARAMS((int));
++READLINE_API void rl_deprep_terminal PARAMS((void));
++READLINE_API void rl_tty_set_default_bindings PARAMS((Keymap));
++READLINE_API void rl_tty_unset_default_bindings PARAMS((Keymap));
++
++READLINE_API int rl_reset_terminal PARAMS((const char *));
++READLINE_API void rl_resize_terminal PARAMS((void));
++READLINE_API void rl_set_screen_size PARAMS((int, int));
++READLINE_API void rl_get_screen_size PARAMS((int *, int *));
++READLINE_API void rl_reset_screen_size PARAMS((void));
+ 
+-extern char *rl_get_termcap PARAMS((const char *));
++READLINE_API char *rl_get_termcap PARAMS((const char *));
+ 
+ /* Functions for character input. */
+-extern int rl_stuff_char PARAMS((int));
+-extern int rl_execute_next PARAMS((int));
+-extern int rl_clear_pending_input PARAMS((void));
+-extern int rl_read_key PARAMS((void));
+-extern int rl_getc PARAMS((FILE *));
+-extern int rl_set_keyboard_input_timeout PARAMS((int));
++READLINE_API int rl_stuff_char PARAMS((int));
++READLINE_API int rl_execute_next PARAMS((int));
++READLINE_API int rl_clear_pending_input PARAMS((void));
++READLINE_API int rl_read_key PARAMS((void));
++READLINE_API int rl_getc PARAMS((FILE *));
++READLINE_API int rl_set_keyboard_input_timeout PARAMS((int));
+ 
+ /* `Public' utility functions . */
+-extern void rl_extend_line_buffer PARAMS((int));
+-extern int rl_ding PARAMS((void));
+-extern int rl_alphabetic PARAMS((int));
+-extern void rl_free PARAMS((void *));
++READLINE_API void rl_extend_line_buffer PARAMS((int));
++READLINE_API int rl_ding PARAMS((void));
++READLINE_API int rl_alphabetic PARAMS((int));
++READLINE_API void rl_free PARAMS((void *));
+ 
+ /* Readline signal handling, from signals.c */
+-extern int rl_set_signals PARAMS((void));
+-extern int rl_clear_signals PARAMS((void));
+-extern void rl_cleanup_after_signal PARAMS((void));
+-extern void rl_reset_after_signal PARAMS((void));
+-extern void rl_free_line_state PARAMS((void));
++READLINE_API int rl_set_signals PARAMS((void));
++READLINE_API int rl_clear_signals PARAMS((void));
++READLINE_API void rl_cleanup_after_signal PARAMS((void));
++READLINE_API void rl_reset_after_signal PARAMS((void));
++READLINE_API void rl_free_line_state PARAMS((void));
+ 
+-extern void rl_echo_signal_char PARAMS((int)); 
++READLINE_API void rl_echo_signal_char PARAMS((int)); 
+ 
+-extern int rl_set_paren_blink_timeout PARAMS((int));
++READLINE_API int rl_set_paren_blink_timeout PARAMS((int));
+ 
+ /* Undocumented. */
+-extern int rl_maybe_save_line PARAMS((void));
+-extern int rl_maybe_unsave_line PARAMS((void));
+-extern int rl_maybe_replace_line PARAMS((void));
++READLINE_API int rl_maybe_save_line PARAMS((void));
++READLINE_API int rl_maybe_unsave_line PARAMS((void));
++READLINE_API int rl_maybe_replace_line PARAMS((void));
+ 
+ /* Completion functions. */
+-extern int rl_complete_internal PARAMS((int));
+-extern void rl_display_match_list PARAMS((char **, int, int));
++READLINE_API int rl_complete_internal PARAMS((int));
++READLINE_API void rl_display_match_list PARAMS((char **, int, int));
+ 
+-extern char **rl_completion_matches PARAMS((const char *, rl_compentry_func_t *));
+-extern char *rl_username_completion_function PARAMS((const char *, int));
+-extern char *rl_filename_completion_function PARAMS((const char *, int));
++READLINE_API char **rl_completion_matches PARAMS((const char *, rl_compentry_func_t *));
++READLINE_API char *rl_username_completion_function PARAMS((const char *, int));
++READLINE_API char *rl_filename_completion_function PARAMS((const char *, int));
+ 
+-extern int rl_completion_mode PARAMS((rl_command_func_t *));
++READLINE_API int rl_completion_mode PARAMS((rl_command_func_t *));
+ 
+ #if 0
+ /* Backwards compatibility (compat.c).  These will go away sometime. */
+-extern void free_undo_list PARAMS((void));
+-extern int maybe_save_line PARAMS((void));
+-extern int maybe_unsave_line PARAMS((void));
+-extern int maybe_replace_line PARAMS((void));
+-
+-extern int ding PARAMS((void));
+-extern int alphabetic PARAMS((int));
+-extern int crlf PARAMS((void));
+-
+-extern char **completion_matches PARAMS((char *, rl_compentry_func_t *));
+-extern char *username_completion_function PARAMS((const char *, int));
+-extern char *filename_completion_function PARAMS((const char *, int));
++READLINE_API void free_undo_list PARAMS((void));
++READLINE_API int maybe_save_line PARAMS((void));
++READLINE_API int maybe_unsave_line PARAMS((void));
++READLINE_API int maybe_replace_line PARAMS((void));
++
++READLINE_API int ding PARAMS((void));
++READLINE_API int alphabetic PARAMS((int));
++READLINE_API int crlf PARAMS((void));
++
++READLINE_API char **completion_matches PARAMS((char *, rl_compentry_func_t *));
++READLINE_API char *username_completion_function PARAMS((const char *, int));
++READLINE_API char *filename_completion_function PARAMS((const char *, int));
+ #endif
+ 
+ /* **************************************************************** */
+@@ -474,144 +474,144 @@
+ /* **************************************************************** */
+ 
+ /* The version of this incarnation of the readline library. */
+-extern const char *rl_library_version;		/* e.g., "4.2" */
+-extern int rl_readline_version;			/* e.g., 0x0402 */
++READLINE_API const char *rl_library_version;		/* e.g., "4.2" */
++READLINE_API int rl_readline_version;			/* e.g., 0x0402 */
+ 
+ /* True if this is real GNU readline. */
+-extern int rl_gnu_readline_p;
++READLINE_API int rl_gnu_readline_p;
+ 
+ /* Flags word encapsulating the current readline state. */
+-extern int rl_readline_state;
++READLINE_API int rl_readline_state;
+ 
+ /* Says which editing mode readline is currently using.  1 means emacs mode;
+    0 means vi mode. */
+-extern int rl_editing_mode;
++READLINE_API int rl_editing_mode;
+ 
+ /* Insert or overwrite mode for emacs mode.  1 means insert mode; 0 means
+    overwrite mode.  Reset to insert mode on each input line. */
+-extern int rl_insert_mode;
++READLINE_API int rl_insert_mode;
+ 
+ /* The name of the calling program.  You should initialize this to
+    whatever was in argv[0].  It is used when parsing conditionals. */
+-extern const char *rl_readline_name;
++READLINE_API const char *rl_readline_name;
+ 
+ /* The prompt readline uses.  This is set from the argument to
+    readline (), and should not be assigned to directly. */
+-extern char *rl_prompt;
++READLINE_API char *rl_prompt;
+ 
+ /* The prompt string that is actually displayed by rl_redisplay.  Public so
+    applications can more easily supply their own redisplay functions. */
+-extern char *rl_display_prompt;
++READLINE_API char *rl_display_prompt;
+ 
+ /* The line buffer that is in use. */
+-extern char *rl_line_buffer;
++READLINE_API char *rl_line_buffer;
+ 
+ /* The location of point, and end. */
+-extern int rl_point;
+-extern int rl_end;
++READLINE_API int rl_point;
++READLINE_API int rl_end;
+ 
+ /* The mark, or saved cursor position. */
+-extern int rl_mark;
++READLINE_API int rl_mark;
+ 
+ /* Flag to indicate that readline has finished with the current input
+    line and should return it. */
+-extern int rl_done;
++READLINE_API int rl_done;
+ 
+ /* If set to a character value, that will be the next keystroke read. */
+-extern int rl_pending_input;
++READLINE_API int rl_pending_input;
+ 
+ /* Non-zero if we called this function from _rl_dispatch().  It's present
+    so functions can find out whether they were called from a key binding
+    or directly from an application. */
+-extern int rl_dispatching;
++READLINE_API int rl_dispatching;
+ 
+ /* Non-zero if the user typed a numeric argument before executing the
+    current function. */
+-extern int rl_explicit_arg;
++READLINE_API int rl_explicit_arg;
+ 
+ /* The current value of the numeric argument specified by the user. */
+-extern int rl_numeric_arg;
++READLINE_API int rl_numeric_arg;
+ 
+ /* The address of the last command function Readline executed. */
+-extern rl_command_func_t *rl_last_func;
++READLINE_API rl_command_func_t *rl_last_func;
+ 
+ /* The name of the terminal to use. */
+-extern const char *rl_terminal_name;
++READLINE_API const char *rl_terminal_name;
+ 
+ /* The input and output streams. */
+-extern FILE *rl_instream;
+-extern FILE *rl_outstream;
++READLINE_API FILE *rl_instream;
++READLINE_API FILE *rl_outstream;
+ 
+ /* If non-zero, Readline gives values of LINES and COLUMNS from the environment
+    greater precedence than values fetched from the kernel when computing the
+    screen dimensions. */
+-extern int rl_prefer_env_winsize;
++READLINE_API int rl_prefer_env_winsize;
+ 
+ /* If non-zero, then this is the address of a function to call just
+    before readline_internal () prints the first prompt. */
+-extern rl_hook_func_t *rl_startup_hook;
++READLINE_API rl_hook_func_t *rl_startup_hook;
+ 
+ /* If non-zero, this is the address of a function to call just before
+    readline_internal_setup () returns and readline_internal starts
+    reading input characters. */
+-extern rl_hook_func_t *rl_pre_input_hook;
++READLINE_API rl_hook_func_t *rl_pre_input_hook;
+       
+ /* The address of a function to call periodically while Readline is
+    awaiting character input, or NULL, for no event handling. */
+-extern rl_hook_func_t *rl_event_hook;
++READLINE_API rl_hook_func_t *rl_event_hook;
+ 
+ /* The address of the function to call to fetch a character from the current
+    Readline input stream */
+-extern rl_getc_func_t *rl_getc_function;
++READLINE_API rl_getc_func_t *rl_getc_function;
+ 
+-extern rl_voidfunc_t *rl_redisplay_function;
++READLINE_API rl_voidfunc_t *rl_redisplay_function;
+ 
+-extern rl_vintfunc_t *rl_prep_term_function;
+-extern rl_voidfunc_t *rl_deprep_term_function;
++READLINE_API rl_vintfunc_t *rl_prep_term_function;
++READLINE_API rl_voidfunc_t *rl_deprep_term_function;
+ 
+ /* Dispatch variables. */
+-extern Keymap rl_executing_keymap;
+-extern Keymap rl_binding_keymap;
++READLINE_API Keymap rl_executing_keymap;
++READLINE_API Keymap rl_binding_keymap;
+ 
+ /* Display variables. */
+ /* If non-zero, readline will erase the entire line, including any prompt,
+    if the only thing typed on an otherwise-blank line is something bound to
+    rl_newline. */
+-extern int rl_erase_empty_line;
++READLINE_API int rl_erase_empty_line;
+ 
+ /* If non-zero, the application has already printed the prompt (rl_prompt)
+    before calling readline, so readline should not output it the first time
+    redisplay is done. */
+-extern int rl_already_prompted;
++READLINE_API int rl_already_prompted;
+ 
+ /* A non-zero value means to read only this many characters rather than
+    up to a character bound to accept-line. */
+-extern int rl_num_chars_to_read;
++READLINE_API int rl_num_chars_to_read;
+ 
+ /* The text of a currently-executing keyboard macro. */
+-extern char *rl_executing_macro;
++READLINE_API char *rl_executing_macro;
+ 
+ /* Variables to control readline signal handling. */
+ /* If non-zero, readline will install its own signal handlers for
+    SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */
+-extern int rl_catch_signals;
++READLINE_API int rl_catch_signals;
+ 
+ /* If non-zero, readline will install a signal handler for SIGWINCH
+    that also attempts to call any calling application's SIGWINCH signal
+    handler.  Note that the terminal is not cleaned up before the
+    application's signal handler is called; use rl_cleanup_after_signal()
+    to do that. */
+-extern int rl_catch_sigwinch;
++READLINE_API int rl_catch_sigwinch;
+ 
+ /* Completion variables. */
+ /* Pointer to the generator function for completion_matches ().
+    NULL means to use rl_filename_completion_function (), the default
+    filename completer. */
+-extern rl_compentry_func_t *rl_completion_entry_function;
++READLINE_API rl_compentry_func_t *rl_completion_entry_function;
+ 
+ /* Optional generator for menu completion.  Default is
+    rl_completion_entry_function (rl_filename_completion_function). */
+- extern rl_compentry_func_t *rl_menu_completion_entry_function;
++READLINE_API rl_compentry_func_t *rl_menu_completion_entry_function;
+ 
+ /* If rl_ignore_some_completions_function is non-NULL it is the address
+    of a function to call after all of the possible matches have been
+@@ -619,7 +619,7 @@
+    The function is called with one argument; a NULL terminated array
+    of (char *).  If your function removes any of the elements, they
+    must be free()'ed. */
+-extern rl_compignore_func_t *rl_ignore_some_completions_function;
++READLINE_API rl_compignore_func_t *rl_ignore_some_completions_function;
+ 
+ /* Pointer to alternative function to create matches.
+    Function is called with TEXT, START, and END.
+@@ -628,39 +628,39 @@
+    If this function exists and returns NULL then call the value of
+    rl_completion_entry_function to try to match, otherwise use the
+    array of strings returned. */
+-extern rl_completion_func_t *rl_attempted_completion_function;
++READLINE_API rl_completion_func_t *rl_attempted_completion_function;
+ 
+ /* The basic list of characters that signal a break between words for the
+    completer routine.  The initial contents of this variable is what
+    breaks words in the shell, i.e. "n\"\\'`@$>". */
+-extern const char *rl_basic_word_break_characters;
++READLINE_API const char *rl_basic_word_break_characters;
+ 
+ /* The list of characters that signal a break between words for
+    rl_complete_internal.  The default list is the contents of
+    rl_basic_word_break_characters.  */
+-extern /*const*/ char *rl_completer_word_break_characters;
++READLINE_API /*const*/ char *rl_completer_word_break_characters;
+ 
+ /* Hook function to allow an application to set the completion word
+    break characters before readline breaks up the line.  Allows
+    position-dependent word break characters. */
+-extern rl_cpvfunc_t *rl_completion_word_break_hook;
++READLINE_API rl_cpvfunc_t *rl_completion_word_break_hook;
+ 
+ /* List of characters which can be used to quote a substring of the line.
+    Completion occurs on the entire substring, and within the substring   
+    rl_completer_word_break_characters are treated as any other character,
+    unless they also appear within this list. */
+-extern const char *rl_completer_quote_characters;
++READLINE_API const char *rl_completer_quote_characters;
+ 
+ /* List of quote characters which cause a word break. */
+-extern const char *rl_basic_quote_characters;
++READLINE_API const char *rl_basic_quote_characters;
+ 
+ /* List of characters that need to be quoted in filenames by the completer. */
+-extern const char *rl_filename_quote_characters;
++READLINE_API const char *rl_filename_quote_characters;
+ 
+ /* List of characters that are word break characters, but should be left
+    in TEXT when it is passed to the completion function.  The shell uses
+    this to help determine what kind of completing to do. */
+-extern const char *rl_special_prefixes;
++READLINE_API const char *rl_special_prefixes;
+ 
+ /* If non-zero, then this is the address of a function to call when
+    completing on a directory name.  The function is called with
+@@ -671,7 +671,7 @@
+    the directory name pointer passed as an argument.  If the directory
+    completion hook returns 0, it should not modify the directory name
+    pointer passed as an argument. */
+-extern rl_icppfunc_t *rl_directory_completion_hook;
++READLINE_API rl_icppfunc_t *rl_directory_completion_hook;
+ 
+ /* If non-zero, this is the address of a function to call when completing
+    a directory name.  This function takes the address of the directory name
+@@ -684,7 +684,7 @@
+ 
+    I'm not happy with how this works yet, so it's undocumented.  I'm trying
+    it in bash to see how well it goes. */
+-extern rl_icppfunc_t *rl_directory_rewrite_hook;
++READLINE_API rl_icppfunc_t *rl_directory_rewrite_hook;
+ 
+ /* If non-zero, this is the address of a function to call when reading
+    directory entries from the filesystem for completion and comparing
+@@ -695,7 +695,7 @@
+    keyboard.  The returned value is what is added to the list of
+    matches.  The second argument is the length of the filename to be
+    converted. */
+-extern rl_dequote_func_t *rl_filename_rewrite_hook;
++READLINE_API rl_dequote_func_t *rl_filename_rewrite_hook;
+ 
+ /* Backwards compatibility with previous versions of readline. */
+ #define rl_symbolic_link_hook rl_directory_completion_hook
+@@ -707,76 +707,76 @@
+    where MATCHES is the array of strings that matched, NUM_MATCHES is the
+    number of strings in that array, and MAX_LENGTH is the length of the
+    longest string in that array. */
+-extern rl_compdisp_func_t *rl_completion_display_matches_hook;
++READLINE_API rl_compdisp_func_t *rl_completion_display_matches_hook;
+ 
+ /* Non-zero means that the results of the matches are to be treated
+    as filenames.  This is ALWAYS zero on entry, and can only be changed
+    within a completion entry finder function. */
+-extern int rl_filename_completion_desired;
++READLINE_API int rl_filename_completion_desired;
+ 
+ /* Non-zero means that the results of the matches are to be quoted using
+    double quotes (or an application-specific quoting mechanism) if the
+    filename contains any characters in rl_word_break_chars.  This is
+    ALWAYS non-zero on entry, and can only be changed within a completion
+    entry finder function. */
+-extern int rl_filename_quoting_desired;
++READLINE_API int rl_filename_quoting_desired;
+ 
+ /* Set to a function to quote a filename in an application-specific fashion.
+    Called with the text to quote, the type of match found (single or multiple)
+    and a pointer to the quoting character to be used, which the function can
+    reset if desired. */
+-extern rl_quote_func_t *rl_filename_quoting_function;
++READLINE_API rl_quote_func_t *rl_filename_quoting_function;
+ 
+ /* Function to call to remove quoting characters from a filename.  Called
+    before completion is attempted, so the embedded quotes do not interfere
+    with matching names in the file system. */
+-extern rl_dequote_func_t *rl_filename_dequoting_function;
++READLINE_API rl_dequote_func_t *rl_filename_dequoting_function;
+ 
+ /* Function to call to decide whether or not a word break character is
+    quoted.  If a character is quoted, it does not break words for the
+    completer. */
+-extern rl_linebuf_func_t *rl_char_is_quoted_p;
++READLINE_API rl_linebuf_func_t *rl_char_is_quoted_p;
+ 
+ /* Non-zero means to suppress normal filename completion after the
+    user-specified completion function has been called. */
+-extern int rl_attempted_completion_over;
++READLINE_API int rl_attempted_completion_over;
+ 
+ /* Set to a character describing the type of completion being attempted by
+    rl_complete_internal; available for use by application completion
+    functions. */
+-extern int rl_completion_type;
++READLINE_API int rl_completion_type;
+ 
+ /* Set to the last key used to invoke one of the completion functions */
+-extern int rl_completion_invoking_key;
++READLINE_API int rl_completion_invoking_key;
+ 
+ /* Up to this many items will be displayed in response to a
+    possible-completions call.  After that, we ask the user if she
+    is sure she wants to see them all.  The default value is 100. */
+-extern int rl_completion_query_items;
++READLINE_API int rl_completion_query_items;
+ 
+ /* Character appended to completed words when at the end of the line.  The
+    default is a space.  Nothing is added if this is '\0'. */
+-extern int rl_completion_append_character;
++READLINE_API int rl_completion_append_character;
+ 
+ /* If set to non-zero by an application completion function,
+    rl_completion_append_character will not be appended. */
+-extern int rl_completion_suppress_append;
++READLINE_API int rl_completion_suppress_append;
+ 
+ /* Set to any quote character readline thinks it finds before any application
+    completion function is called. */
+-extern int rl_completion_quote_character;
++READLINE_API int rl_completion_quote_character;
+ 
+ /* Set to a non-zero value if readline found quoting anywhere in the word to
+    be completed; set before any application completion function is called. */
+-extern int rl_completion_found_quote;
++READLINE_API int rl_completion_found_quote;
+ 
+ /* If non-zero, the completion functions don't append any closing quote.
+    This is set to 0 by rl_complete_internal and may be changed by an
+    application-specific completion function. */
+-extern int rl_completion_suppress_quote;
++READLINE_API int rl_completion_suppress_quote;
+ 
+ /* If non-zero, readline will sort the completion matches.  On by default. */
+-extern int rl_sort_completion_matches;
++READLINE_API int rl_sort_completion_matches;
+ 
+ /* If non-zero, a slash will be appended to completed filenames that are
+    symbolic links to directory names, subject to the value of the
+@@ -787,14 +787,14 @@
+    rl_complete_internal before any application-specific completion
+    function is called, so without that function doing anything, the user's
+    preferences are honored. */
+-extern int rl_completion_mark_symlink_dirs;
++READLINE_API int rl_completion_mark_symlink_dirs;
+ 
+ /* If non-zero, then disallow duplicates in the matches. */
+-extern int rl_ignore_completion_duplicates;
++READLINE_API int rl_ignore_completion_duplicates;
+ 
+ /* If this is non-zero, completion is (temporarily) inhibited, and the
+    completion character will be inserted as any other. */
+-extern int rl_inhibit_completion;
++READLINE_API int rl_inhibit_completion;
+ 
+ /* Input error; can be returned by (*rl_getc_function) if readline is reading
+    a top-level command (RL_ISSTATE (RL_STATE_READCMD)). */
+@@ -883,8 +883,8 @@
+   char reserved[64];
+ };
+ 
+-extern int rl_save_state PARAMS((struct readline_state *));
+-extern int rl_restore_state PARAMS((struct readline_state *));
++READLINE_API int rl_save_state PARAMS((struct readline_state *));
++READLINE_API int rl_restore_state PARAMS((struct readline_state *));
+ 
+ #ifdef __cplusplus
+ }
+diff -ur readline-6.2-orig/rldefs.h readline-6.2-new/rldefs.h
+--- readline-6.2-orig/rldefs.h	2009-01-04 14:32:33 -0500
++++ readline-6.2-new/rldefs.h	2013-07-05 21:41:36 -0400
+@@ -63,7 +63,7 @@
+ #  include <strings.h>
+ #endif /* !HAVE_STRING_H */
+ 
+-#if !defined (strchr) && !defined (__STDC__)
++#if !defined (strchr) && !defined (__STDC__) && !defined(_MSC_VER)
+ extern char *strchr (), *strrchr ();
+ #endif /* !strchr && !__STDC__ */
+ 
+diff -ur readline-6.2-orig/rlstdc.h readline-6.2-new/rlstdc.h
+--- readline-6.2-orig/rlstdc.h	2009-01-04 14:32:33 -0500
++++ readline-6.2-new/rlstdc.h	2013-07-05 21:41:36 -0400
+@@ -42,4 +42,14 @@
+ #  endif
+ #endif
+ 
++#if defined (_MSC_VER)
++# if defined (READLINE_DLL)
++#  define READLINE_API __declspec(dllexport)
++# else
++#  define READLINE_API __declspec(dllimport)
++# endif
++#else
++# define READLINE_API extern
++#endif
++
+ #endif /* !_RL_STDC_H_ */
+diff -ur readline-6.2-orig/support/shlib-install readline-6.2-new/support/shlib-install
+--- readline-6.2-orig/support/shlib-install	2009-10-28 09:30:18 -0400
++++ readline-6.2-new/support/shlib-install	2013-07-05 21:41:36 -0400
+@@ -75,8 +75,9 @@
+ 		chmod 555 ${INSTALLDIR}/${LIBNAME}
+ 	fi ;;
+ cygwin*|mingw*)
++	VCLIBNAME=`echo ${LIBNAME} | sed -e 's,\.dll,\.lib,'`
+ 	IMPLIBNAME=`echo ${LIBNAME} \
+-		| sed -e 's,^cyg,lib,' -e 's,[0-9]*.dll$,.dll.a,'`
++		| sed -e 's,^@@LIBRARY_PREFIX@@lib,,' -e 's,-[0-9]*@@LIBRARY_SUFFIX@@.dll$,.lib,'`
+ 	if [ -z "$uninstall" ]; then
+ 		${echo} $RM ${BINDIR}/${LIBNAME}.${OLDSUFF}
+ 		if [ -f "$BINDIR/$LIBNAME" ]; then
+@@ -84,7 +85,7 @@
+ 		fi
+ 		${echo} $MV ${INSTALLDIR}/${LIBNAME} ${BINDIR}/${LIBNAME}
+ 		${echo} chmod a+x ${BINDIR}/${LIBNAME}
+-		${echo} eval ${INSTALLPROG} ${LIBNAME}.a \
++		${echo} eval ${INSTALLPROG} ${VCLIBNAME} \
+ 			${INSTALLDIR}/${IMPLIBNAME}
+ 	else
+ 		${echo} ${RM} ${BINDIR}/${LIBNAME}
+diff -ur readline-6.2-orig/support/shobj-conf readline-6.2-new/support/shobj-conf
+--- readline-6.2-orig/support/shobj-conf	2009-10-28 09:20:21 -0400
++++ readline-6.2-new/support/shobj-conf	2013-07-05 21:41:36 -0400
+@@ -522,10 +522,12 @@
+ 
+ mingw*)
+ 	SHOBJ_LD='$(CC)'
+-	SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a'
++	SHOBJ_LDFLAGS='-shared'
++	SHLIB_LIBPREF='@@LIBRARY_PREFIX@@lib'
+ 	SHLIB_LIBSUFF='dll'
+-	SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)'
++	SHLIB_LIBVERSION='-$(SHLIB_DLLVERSION)@@LIBRARY_SUFFIX@@.$(SHLIB_LIBSUFF)'
+ 	SHLIB_LIBS='$(TERMCAP_LIB)'
++	SHOBJ_CFLAGS='-D__MINGW32__ -DREADLINE_DLL'
+ 
+ 	SHLIB_DOT=
+ 	# For official cygwin releases, DLLVERSION will be defined in the
+diff -ur readline-6.2-orig/util.c readline-6.2-new/util.c
+--- readline-6.2-orig/util.c	2010-05-30 18:36:02 -0400
++++ readline-6.2-new/util.c	2013-07-05 21:41:36 -0400
+@@ -389,7 +389,7 @@
+         break;
+       s2++;
+     }
+-  while (--count != 0)
++  while (--count != 0);
+ 
+   return (0);
+ }
+diff -ur readline-6.2-orig/vi_mode.c readline-6.2-new/vi_mode.c
+--- readline-6.2-orig/vi_mode.c	2010-11-20 19:51:39 -0500
++++ readline-6.2-new/vi_mode.c	2013-07-05 21:41:36 -0400
+@@ -1006,7 +1006,7 @@
+ {
+   _rl_vimotion_cxt *m;
+ 
+-  m = xmalloc (sizeof (_rl_vimotion_cxt));
++  m = (_rl_vimotion_cxt *) xmalloc (sizeof (_rl_vimotion_cxt));
+   _rl_mvcxt_init (m, op, key);
+   return m;
+ }
+diff -ur readline-6.2-orig/xmalloc.h readline-6.2-new/xmalloc.h
+--- readline-6.2-orig/xmalloc.h	2009-01-04 14:32:34 -0500
++++ readline-6.2-new/xmalloc.h	2013-07-05 21:41:36 -0400
+@@ -38,8 +38,8 @@
+ 
+ #endif /* !PTR_T */
+ 
+-extern PTR_T xmalloc PARAMS((size_t));
+-extern PTR_T xrealloc PARAMS((void *, size_t));
+-extern void xfree PARAMS((void *));
++READLINE_API PTR_T xmalloc PARAMS((size_t));
++READLINE_API PTR_T xrealloc PARAMS((void *, size_t));
++READLINE_API void xfree PARAMS((void *));
+ 
+ #endif /* _XMALLOC_H_ */
--- a/src/readline-1-binding.patch	Fri Jul 05 22:24:48 2013 -0400
+++ b/src/readline-1-binding.patch	Fri Jul 05 22:25:41 2013 -0400
@@ -1,7 +1,7 @@
 diff -uNr a/readline.c b/readline.c
 --- a/readline.c	2010-07-25 17:07:40.000000000 -0400
 +++ b/readline.c	2013-04-17 20:38:42.637674309 -0400
-@@ -1154,11 +1159,19 @@
+@@ -1154,11 +1159,14 @@
    rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line);
    rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line);
  
@@ -14,11 +14,6 @@
 +  rl_bind_keyseq_if_unbound ("\340G", rl_beg_of_line);
 +  rl_bind_keyseq_if_unbound ("\340O", rl_end_of_line);
 +  rl_bind_keyseq_if_unbound ("\340S", rl_delete);
-+#endif
-+
-+#ifdef _MSC_VER
-+  rl_bind_keyseq_if_unbound ("\033[3~", rl_delete);
-+  rl_bind_keyseq_if_unbound ("\033[X", _rl_update_terminal_size);
  #endif
  
    _rl_keymap = xkeymap;
--- a/src/readline.mk	Fri Jul 05 22:24:48 2013 -0400
+++ b/src/readline.mk	Fri Jul 05 22:25:41 2013 -0400
@@ -26,6 +26,12 @@
 define $(PKG)_BUILD
     $(SED) -i 's,^ *case SIGQUIT:.*,,' '$(1)/signals.c'
     $(SED) -i 's,^ *case SIGTSTP:.*,,' '$(1)/signals.c'
+    if test x$(MXE_SYSTEM) = xmsvc; then \
+        for f in '$(1)/support/shlib-install' '$(1)/support/shobj-conf'; do \
+            $(SED) -i -e 's/@@LIBRARY_PREFIX@@/$(LIBRARY_PREFIX)/g' \
+                      -e 's/@@LIBRARY_SUFFIX@@/$(LIBRARY_SUFFIX)/g' $$f; \
+        done; \
+    fi
     cd '$(1)' && ./configure \
         $(CONFIGURE_CPPFLAGS) $(CONFIGURE_LDFLAGS) \
         $(HOST_AND_BUILD_CONFIGURE_OPTIONS) \