I originally submitted this patch as a portability fix to Brian
Callahan's oksh, but he suggested I submit it here instead.

Conversion of function pointer to void pointer is not allowed in
ISO C, though POSIX requires it for dlsym(). However, here we are
also comparing function pointer to void pointer with the == operator
without using a cast, which is a constraint error[0].

Rather than add a cast, we can just use a typedef here for the
function pointer type, avoiding any C extensions, and adding a bit
of type-safety.

[0] https://port70.net/~nsz/c/c11/n1570.html#6.5.9p2
---
 bin/ksh/emacs.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/bin/ksh/emacs.c b/bin/ksh/emacs.c
index aa2cceb657d..b63735956a3 100644
--- a/bin/ksh/emacs.c
+++ b/bin/ksh/emacs.c
@@ -41,8 +41,10 @@ static       Area    aedit;
 #define        KEOL    1               /* ^M, ^J */
 #define        KINTR   2               /* ^G, ^C */
 
+typedef int (*kb_func)(int);
+
 struct x_ftab {
-       int             (*xf_func)(int c);
+       kb_func         xf_func;
        const char      *xf_name;
        short           xf_flags;
 };
@@ -861,7 +863,7 @@ x_eot_del(int c)
                return (x_del_char(c));
 }
 
-static void *
+static kb_func
 kb_find_hist_func(char c)
 {
        struct kb_entry         *k;
@@ -1315,7 +1317,7 @@ kb_del(struct kb_entry *k)
 }
 
 static struct kb_entry *
-kb_add_string(void *func, void *args, char *str)
+kb_add_string(kb_func func, void *args, char *str)
 {
        unsigned int            ele, count;
        struct kb_entry         *k;
@@ -1350,7 +1352,7 @@ kb_add_string(void *func, void *args, char *str)
 }
 
 static struct kb_entry *
-kb_add(void *func, ...)
+kb_add(kb_func func, ...)
 {
        va_list                 ap;
        unsigned char           ch;
-- 
2.26.2

Reply via email to