diff --git a/test/demo_defkey.c b/test/demo_defkey.c
index 045c2c7..4416672 100644
--- a/test/demo_defkey.c
+++ b/test/demo_defkey.c
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 2002-2012,2013 Free Software Foundation, Inc.              *
+ * Copyright 2018-2023,2024 Thomas E. Dickey                                *
+ * Copyright 2002-2016,2017 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            *
@@ -26,7 +27,7 @@
  * authorization.                                                           *
  ****************************************************************************/
 /*
- * $Id: demo_defkey.c,v 1.22 2013/09/28 22:02:17 tom Exp $
+ * $Id: demo_defkey.c,v 1.35 2024/01/20 20:46:12 tom Exp $
  *
  * Demonstrate the define_key() function.
  * Thomas Dickey - 2002/11/23
@@ -45,10 +46,10 @@
 log_last_line(WINDOW *win)
 {
     FILE *fp;
-    int y, x, n;
-    char temp[256];
 
     if ((fp = fopen(MY_LOGFILE, "a")) != 0) {
+	char temp[256];
+	int y, x, n;
 	int need = sizeof(temp) - 1;
 	if (need > COLS)
 	    need = COLS;
@@ -73,20 +74,20 @@
 static char *
 visichar(int ch)
 {
-    static char temp[10];
+    static char temp[20];
 
     ch = UChar(ch);
     assert(ch >= 0 && ch < 256);
     if (ch == '\\') {
-	strcpy(temp, "\\\\");
+	_nc_STRCPY(temp, "\\\\", sizeof(temp));
     } else if (ch == '\033') {
-	strcpy(temp, "\\E");
+	_nc_STRCPY(temp, "\\E", sizeof(temp));
     } else if (ch < ' ') {
-	sprintf(temp, "\\%03o", ch);
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\\%03o", ch);
     } else if (ch >= 127) {
-	sprintf(temp, "\\%03o", ch);
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\\%03o", ch);
     } else {
-	sprintf(temp, "%c", ch);
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%c", ch);
     }
     return temp;
 }
@@ -98,19 +99,21 @@
 visible(const char *string)
 {
     char *result = 0;
-    size_t need = 1;
-    int pass;
-    int n;
 
-    if (string != 0 && *string != '\0') {
+    if (VALID_STRING(string) && *string != '\0') {
+	int pass;
+	int n;
+	size_t need = 1;
+
 	for (pass = 0; pass < 2; ++pass) {
 	    for (n = 0; string[n] != '\0'; ++n) {
 		char temp[80];
-		strncpy(temp, visichar(string[n]), sizeof(temp) - 2);
-		if (pass)
-		    strcat(result, temp);
-		else
+		_nc_STRNCPY(temp, visichar(string[n]), sizeof(temp) - 2);
+		if (pass) {
+		    _nc_STRCAT(result, temp, need);
+		} else {
 		    need += strlen(temp);
+		}
 	    }
 	    if (!pass)
 		result = typeCalloc(char, need);
@@ -131,7 +134,7 @@
     char temp[80];
 
     if (code_name == 0) {
-	sprintf(temp, "Keycode %d", code);
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "Keycode %d", code);
 	code_name = temp;
     }
 
@@ -145,11 +148,7 @@
     }
     log_last_line(win);
 
-    if (vis_string != 0) {
-	free(vis_string);
-	vis_string = 0;
-    }
-
+    free(vis_string);
     vis_string = visible(new_string);
     if ((rc = key_defined(new_string)) > 0) {
 	wprintw(win, "%s was bound to %s\n", vis_string, keyname(rc));
@@ -182,17 +181,18 @@
 {
     char *value = tigetstr(name);
 
-    if (value != 0) {
+    if (VALID_STRING(value)) {
 	const char *prefix = 0;
-	char temp[BUFSIZ];
 
-	if (!strncmp(value, "\033[", (size_t) 2)) {
+	if (!(strncmp) (value, "\033[", (size_t) 2)) {
 	    prefix = "\033O";
-	} else if (!strncmp(value, "\033O", (size_t) 2)) {
+	} else if (!(strncmp) (value, "\033O", (size_t) 2)) {
 	    prefix = "\033[";
 	}
 	if (prefix != 0) {
-	    sprintf(temp, "%s%s", prefix, value + 2);
+	    char temp[BUFSIZ];
+	    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			"%s%s", prefix, value + 2);
 	    really_define_key(win, temp, code);
 	}
     }
@@ -210,16 +210,50 @@
     really_define_key(win, 0, code);
 }
 
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_defkey [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
 int
-main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
+main(int argc, char *argv[])
 {
     char *fkeys[12];
     int n;
     int ch;
     WINDOW *win;
 
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
     unlink(MY_LOGFILE);
 
+    setlocale(LC_ALL, "");
     initscr();
     (void) cbreak();		/* take input chars one at a time, no wait for \n */
     (void) noecho();		/* don't echo input */
@@ -238,8 +272,8 @@
      * keypad() initializes the corresponding data.
      */
     for (n = 0; n < 12; ++n) {
-	char name[10];
-	sprintf(name, "kf%d", n + 1);
+	char name[20];
+	_nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "kf%d", n + 1);
 	fkeys[n] = tigetstr(name);
     }
     for (n = 0; n < 12; ++n) {
@@ -270,7 +304,7 @@
 	    break;
     }
     endwin();
-    ExitProgram(EXIT_FAILURE);
+    ExitProgram(EXIT_SUCCESS);
 }
 #else
 int
