diff --git a/test/cardfile.c b/test/cardfile.c
index b750241..092483b 100644
--- a/test/cardfile.c
+++ b/test/cardfile.c
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 1999-2012,2013 Free Software Foundation, Inc.              *
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1999-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            *
@@ -29,7 +30,7 @@
 /*
  * Author: Thomas E. Dickey
  *
- * $Id: cardfile.c,v 1.42 2013/09/28 22:02:17 tom Exp $
+ * $Id: cardfile.c,v 1.51 2022/12/04 00:40:11 tom Exp $
  *
  * File format: text beginning in column 1 is a title; other text is content.
  */
@@ -125,15 +126,19 @@
 static void
 add_content(CARD * card, const char *content)
 {
-    size_t total, offset;
+    size_t total;
 
     content = skip(content);
     if ((total = strlen(content)) != 0) {
+	size_t offset;
+
 	if (card->content != 0 && (offset = strlen(card->content)) != 0) {
 	    total += 1 + offset;
 	    card->content = typeRealloc(char, total + 1, card->content);
-	    if (card->content)
-		strcpy(card->content + offset++, " ");
+	    if (card->content) {
+		_nc_STRCPY(card->content + offset, " ", total + 1 - offset);
+		offset++;
+	    }
 	} else {
 	    offset = 0;
 	    if (card->content != 0)
@@ -141,7 +146,7 @@
 	    card->content = typeMalloc(char, total + 1);
 	}
 	if (card->content)
-	    strcpy(card->content + offset, content);
+	    _nc_STRCPY(card->content + offset, content, total + 1 - offset);
 	else
 	    failed("add_content");
     }
@@ -171,10 +176,11 @@
 read_data(char *fname)
 {
     FILE *fp;
-    CARD *card = 0;
-    char buffer[BUFSIZ];
 
     if ((fp = fopen(fname, "r")) != 0) {
+	CARD *card = 0;
+	char buffer[BUFSIZ];
+
 	while (fgets(buffer, sizeof(buffer), fp)) {
 	    trim(buffer);
 	    if (isspace(UChar(*buffer))) {
@@ -195,15 +201,17 @@
 write_data(const char *fname)
 {
     FILE *fp;
-    CARD *p = 0;
-    int n;
 
     if (!strcmp(fname, default_name))
 	fname = "cardfile.out";
 
     if ((fp = fopen(fname, "w")) != 0) {
+	CARD *p = 0;
+
 	for (p = all_cards; p != 0; p = p->link) {
 	    FIELD **f = form_fields(p->form);
+	    int n;
+
 	    for (n = 0; f[n] != 0; n++) {
 		char *s = field_buffer(f[n], 0);
 		if (s != 0
@@ -288,7 +296,7 @@
 static CARD *
 first_card(CARD * now)
 {
-    if (!isVisible(now))
+    if (now != NULL && !isVisible(now))
 	now = next_card(now);
     return now;
 }
@@ -363,7 +371,7 @@
 
 #if (defined(KEY_RESIZE) && HAVE_WRESIZE) || NO_LEAKS
 static void
-free_form_fields(FIELD ** f)
+free_form_fields(FIELD **f)
 {
     int n;
 
@@ -389,7 +397,6 @@
     int form_high;
     int y;
     int x;
-    int ch = ERR;
     int finished = FALSE;
 
     show_legend();
@@ -430,6 +437,8 @@
     order_cards(top_card, visible_cards);
 
     while (!finished) {
+	int ch = ERR;
+
 	update_panels();
 	doupdate();
 
@@ -520,13 +529,11 @@
     }
 #if NO_LEAKS
     while (all_cards != 0) {
-	FIELD **f;
-
 	p = all_cards;
 	all_cards = all_cards->link;
 
 	if (isVisible(p)) {
-	    f = form_fields(p->form);
+	    FIELD **f = form_fields(p->form);
 
 	    unpost_form(p->form);	/* ...so we can free it */
 	    free_form(p->form);	/* this also disconnects the fields */
@@ -543,37 +550,45 @@
 }
 
 static void
-usage(void)
+usage(int ok)
 {
     static const char *msg[] =
     {
-	"Usage: view [options] file"
+	"Usage: cardfile [options] file"
 	,""
+	,USAGE_COMMON
 	,"Options:"
 	," -c       use color if terminal supports it"
     };
     size_t n;
     for (n = 0; n < SIZEOF(msg); n++)
 	fprintf(stderr, "%s\n", msg[n]);
-    ExitProgram(EXIT_FAILURE);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
 }
 
 /*******************************************************************************/
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
 
 int
 main(int argc, char *argv[])
 {
-    int n;
+    int ch;
 
     setlocale(LC_ALL, "");
 
-    while ((n = getopt(argc, argv, "c")) != -1) {
-	switch (n) {
+    while ((ch = getopt(argc, argv, OPTS_COMMON "c")) != -1) {
+	switch (ch) {
 	case 'c':
 	    try_color = TRUE;
 	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
 	default:
-	    usage();
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
 	}
     }
 
@@ -593,6 +608,7 @@
     }
 
     if (optind + 1 == argc) {
+	int n;
 	for (n = 1; n < argc; n++)
 	    read_data(argv[n]);
 	if (count_cards() == 0)
