ncurses 6.0 - patch 20161210
[ncurses.git] / ncurses / base / keyok.c
index 706e540568ce958a12fd8d68f01c5c2e35eba3b5..37fddecfa526880c7d654a592f3b5d22f858473e 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2006,2009 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2012,2014 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -33,7 +33,7 @@
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: keyok.c,v 1.8 2009/02/15 00:31:38 tom Exp $")
+MODULE_ID("$Id: keyok.c,v 1.14 2014/03/08 20:32:59 tom Exp $")
 
 /*
  * Enable (or disable) ncurses' interpretation of a keycode by adding (or
@@ -49,31 +49,47 @@ NCURSES_EXPORT(int)
 NCURSES_SP_NAME(keyok) (NCURSES_SP_DCLx int c, bool flag)
 {
     int code = ERR;
-    int count = 0;
-    char *s;
 
-    T((T_CALLED("keyok(%d,%d)"), c, flag));
-    if (c >= 0) {
-       unsigned ch = (unsigned) c;
-       if (flag) {
-           while ((s = _nc_expand_try(SP_PARM->_key_ok, ch, &count, 0)) != 0
-                  && _nc_remove_key(&(SP_PARM->_key_ok), ch)) {
-               code = _nc_add_to_try(&(SP_PARM->_keytry), s, ch);
-               free(s);
-               count = 0;
-               if (code != OK)
-                   break;
-           }
-       } else {
-           while ((s = _nc_expand_try(SP_PARM->_keytry, ch, &count, 0)) != 0
-                  && _nc_remove_key(&(SP_PARM->_keytry), ch)) {
-               code = _nc_add_to_try(&(SP_PARM->_key_ok), s, ch);
-               free(s);
-               count = 0;
-               if (code != OK)
-                   break;
+    if (HasTerminal(SP_PARM)) {
+       T((T_CALLED("keyok(%p, %d,%d)"), (void *) SP_PARM, c, flag));
+#ifdef USE_TERM_DRIVER
+       code = CallDriver_2(sp, td_kyOk, c, flag);
+#else
+       T((T_CALLED("keyok(%d,%d)"), c, flag));
+       if (c >= 0) {
+           int count = 0;
+           char *s;
+           unsigned ch = (unsigned) c;
+
+           if (flag) {
+               while ((s = _nc_expand_try(SP_PARM->_key_ok,
+                                          ch, &count, (size_t) 0)) != 0) {
+                   if (_nc_remove_key(&(SP_PARM->_key_ok), ch)) {
+                       code = _nc_add_to_try(&(SP_PARM->_keytry), s, ch);
+                       free(s);
+                       count = 0;
+                       if (code != OK)
+                           break;
+                   } else {
+                       free(s);
+                   }
+               }
+           } else {
+               while ((s = _nc_expand_try(SP_PARM->_keytry,
+                                          ch, &count, (size_t) 0)) != 0) {
+                   if (_nc_remove_key(&(SP_PARM->_keytry), ch)) {
+                       code = _nc_add_to_try(&(SP_PARM->_key_ok), s, ch);
+                       free(s);
+                       count = 0;
+                       if (code != OK)
+                           break;
+                   } else {
+                       free(s);
+                   }
+               }
            }
        }
+#endif
     }
     returnCode(code);
 }