$NetBSD: patch-cy,v 1.6 2017/12/12 20:42:41 hauke Exp $

--- lib/libxview/textsw/txt_file.c.orig	1993-06-29 05:17:48.000000000 +0000
+++ lib/libxview/textsw/txt_file.c
@@ -18,6 +18,7 @@ static char     sccsid[] = "@(#)txt_file
 #include <xview_private/txt_impl.h>
 #include <xview_private/ev_impl.h>
 #include <xview_private/txt_18impl.h>
+#include <limits.h>
 #ifdef SVR4
 #include <dirent.h>
 #include <string.h>
@@ -43,15 +44,26 @@ static char     sccsid[] = "@(#)txt_file
 	if ((unsigned)(to_test) != 0) (flags) |= (flag);	\
 	else (flags) &= ~(flag)
 
-extern CHAR    *STRCAT();
-extern CHAR    *STRNCAT();
-#ifdef SVR4
+#if (defined(SVR4) || (__NetBSD_Version__ >= 103080000)) || defined(__DragonFly__)
+#define GETCWD
+#endif
+
+#ifdef GETCWD
 extern char    *getcwd();
 #else
 extern char    *getwd();
-#endif /* SVR4 */
+#endif /* GETCWD */
+#if (defined(BSD) && (BSD >= 199306))
+#if defined(__DragonFly__) || (defined(__NetBSD__) && __NetBSD_Version__ > 103080000)
+#include <errno.h>
+#else
+extern int      errno, sys_nerr;
+extern const char *const sys_errlist[];
+#endif
+#else
 extern int      errno, sys_nerr;
 extern char    *sys_errlist[];
+#endif
 
 Pkg_private int textsw_change_directory();
 Pkg_private void textsw_display(), textsw_display_view_margins();
@@ -314,7 +326,11 @@ textsw_load_selection(folio, locx, locy,
     register int    locx, locy;
     int             no_cd;
 {
+#ifdef NAME_MAX
+    CHAR            filename[NAME_MAX];
+#else
     CHAR            filename[MAXNAMLEN];
+#endif
     register int    result;
 
     if (textsw_get_selection_as_filename(
@@ -354,21 +370,21 @@ textsw_full_pathname(name)
     }
 
 #ifdef		OW_I18N
-#ifdef SVR4
+#ifdef GETCWD
     if (getcwd(pathname_mb, MAXPATHLEN) == 0)
 #else
     if (getwd(pathname_mb) == 0)
-#endif /* SVR4 */
+#endif /* GETCWD */
 	return (0);
     (void) mbstowcs(pathname, pathname_mb, MAXPATHLEN-1);
 
 #else		/* OW_I18N */
 
-#ifdef SVR4
+#ifdef GETCWD
     if (getcwd(pathname, MAXPATHLEN) == 0)
 #else
     if (getwd(pathname) == 0)
-#endif /* SVR4 */
+#endif /* GETCWD */
 	return (0);
 #endif		/* OW_I18N */
 
@@ -459,8 +475,13 @@ textsw_load_file(abstract, filename, res
     int             reset_views;
     int             locx, locy;
 {
+#ifdef NAME_MAX
+    char            notice_msg_buf[NAME_MAX + 100];
+    CHAR            scratch_name[NAME_MAX];
+#else
     char            notice_msg_buf[MAXNAMLEN + 100];
     CHAR            scratch_name[MAXNAMLEN];
+#endif
     int             result;
     Es_status       status;
     Es_handle       new_esh;
@@ -546,7 +567,11 @@ textsw_load_file_quietly(abstract, filen
     int             reset_views;
     int             locx, locy;
 {
+#ifdef NAME_MAX
+    CHAR            scratch_name[NAME_MAX];
+#else
     CHAR            scratch_name[MAXNAMLEN];
+#endif
     Es_status       status;
     Es_handle       new_esh;
     Es_index        start_at;
@@ -587,7 +612,11 @@ textsw_save_store_common(folio, output_n
     CHAR           *output_name;
     int             reload;
 {
+#ifdef NAME_MAX
+    CHAR            scratch_name[NAME_MAX];
+#else
     CHAR            scratch_name[MAXNAMLEN];
+#endif
     Es_handle       new_esh;
     register Es_handle output;
     Es_status       result;
@@ -604,9 +633,16 @@ textsw_save_store_common(folio, output_n
 	es_destroy(output);
 	if (folio->checkpoint_name) {
 #ifdef OW_I18N
+#ifdef NAME_MAX
+	    char	temp_mb[NAME_MAX];
+
+	    (void) wcstombs(temp_mb, folio->checkpoint_name, NAME_MAX);
+#else
 	    char	temp_mb[MAXNAMLEN];
 
 	    (void) wcstombs(temp_mb, folio->checkpoint_name, MAXNAMLEN);
+#endif
+
 	    if (unlink(temp_mb) == -1) {	/* } for match */
 #else
 	    if (unlink(folio->checkpoint_name) == -1) {
@@ -733,7 +769,11 @@ textsw_save_internal(folio, error_buf, l
     int             locx, locy;	/* Currently unused */
 {
     Pkg_private Es_handle es_file_make_backup();
+#ifdef NAME_MAX
+    CHAR            original_name[NAME_MAX], *name;
+#else
     CHAR            original_name[MAXNAMLEN], *name;
+#endif
     register char  *msg;
     Es_handle       backup, original = ES_NULL;
     int             status;
@@ -826,10 +866,16 @@ Was the file edited with another editor?
 	    textsw_save_store_common(folio, original_name, RELOAD)) {
       case ES_SUCCESS: {
 #ifdef OW_I18N
+#ifdef NAME_MAX
+	char	original_name_mb[NAME_MAX];
+
+	(void) wcstombs(original_name_mb, original_name, NAME_MAX);
+#else
 	char	original_name_mb[MAXNAMLEN];
 
 	(void) wcstombs(original_name_mb, original_name, MAXNAMLEN);
 #endif
+#endif
 	(void) es_destroy(original);
 	textsw_notify(folio->first_view,
 #ifdef OW_I18N
@@ -868,7 +914,11 @@ textsw_save(abstract, locx, locy)
     Textsw          abstract;
     int             locx, locy;
 {
+#ifdef NAME_MAX
+    char            error_buf[NAME_MAX];
+#else
     char            error_buf[MAXNAMLEN + 100];
+#endif
     Es_status       status;
     Textsw_view_handle view = VIEW_ABS_TO_REP(abstract);
 
@@ -964,12 +1014,16 @@ textsw_get_from_fd(view, fd, print_error
     return (result);
 }
 
-Pkg_private int
+Pkg_private void
 textsw_cd(textsw, locx, locy)
     Textsw_folio    textsw;
     int             locx, locy;
 {
+#ifdef NAME_MAX
+    CHAR            buf[NAME_MAX];
+#else
     CHAR            buf[MAXNAMLEN];
+#endif
 
     if (0 == textsw_get_selection_as_filename(
 				    textsw, buf, SIZEOF(buf), locx, locy)) {
@@ -988,15 +1042,27 @@ textsw_get_from_file(view, filename, pri
     int             fd;
     Es_status       status;
     Textsw_status   result = TEXTSW_STATUS_CANNOT_INSERT_FROM_FILE;
+#ifdef NAME_MAX
+    CHAR            buf[NAME_MAX];
+#else
     CHAR            buf[MAXNAMLEN];
+#endif
 
     if (!TXTSW_IS_READ_ONLY(folio) && ((int)STRLEN(filename) > 0)) {
 	STRCPY(buf, filename);
 #ifdef OW_I18N
+#ifdef NAME_MAX
+	if (textsw_expand_filename(folio, buf, NAME_MAX, -1, -1) == 0) {/* } */
+	    char	buf_mb[NAME_MAX];
+
+	    (void) wcstombs(buf_mb, buf, NAME_MAX);
+#else
 	if (textsw_expand_filename(folio, buf, MAXNAMLEN, -1, -1) == 0) {/* } */
 	    char	buf_mb[MAXNAMLEN];
 
 	    (void) wcstombs(buf_mb, buf, MAXNAMLEN);
+#endif
+
 	    if ((fd = open(buf_mb, 0)) >= 0) {	/* } for match */
 		textsw_implicit_commit(folio);
 #else
@@ -1027,16 +1093,22 @@ textsw_get_from_file(view, filename, pri
 }
 
 
-Pkg_private int
+Pkg_private void
 textsw_file_stuff(view, locx, locy)
     Textsw_view_handle view;
     int             locx, locy;
 {
     Textsw_folio    folio = FOLIO_FOR_VIEW(view);
     int             fd;
+#ifdef NAME_MAX
+    CHAR            buf[NAME_MAX];
+    char            msg[NAME_MAX + 100], *sys_msg;
+    char            notice_msg1[NAME_MAX + 100];
+#else
     CHAR            buf[MAXNAMLEN];
     char            msg[MAXNAMLEN + 100], *sys_msg;
     char            notice_msg1[MAXNAMLEN + 100];
+#endif
     char           *notice_msg2;
     Es_status       status;
     int             cannot_open = 0;
@@ -1047,9 +1119,15 @@ textsw_file_stuff(view, locx, locy)
     if (0 == textsw_get_selection_as_filename(
 				     folio, buf, SIZEOF(buf), locx, locy)) {
 #ifdef OW_I18N
+#ifdef NAME_MAX
+	char	    buf_mb[NAME_MAX];
+
+	(void) wcstombs(buf_mb, buf, NAME_MAX);
+#else
 	char	    buf_mb[MAXNAMLEN];
 
 	(void) wcstombs(buf_mb, buf, MAXNAMLEN);
+#endif
 	if ((fd = open(buf_mb, 0)) < 0) {		/* } for match */
 #else
 	if ((fd = open(buf, 0)) < 0) {
@@ -1141,8 +1219,13 @@ textsw_file_stuff_from_str(view, buf, lo
 {
     Textsw_folio    folio = FOLIO_FOR_VIEW(view);
     int             fd;
+#ifdef NAME_MAX
+    char            msg[NAME_MAX + 100], *sys_msg;
+    char            notice_msg1[NAME_MAX + 100];
+#else
     char            msg[MAXNAMLEN + 100], *sys_msg;
     char            notice_msg1[MAXNAMLEN + 100];
+#endif
     char           *notice_msg2;
     Es_status       status;
     int             cannot_open = 0;
@@ -1150,9 +1233,15 @@ textsw_file_stuff_from_str(view, buf, lo
     Xv_Notice	    text_notice;
     Frame	    frame;
 #ifdef OW_I18N
+#ifdef NAME_MAX
+    char            buf_mb[NAME_MAX];
+
+    (void) wcstombs(buf_mb, buf, NAME_MAX);
+#else
     char            buf_mb[MAXNAMLEN];
 
     (void) wcstombs(buf_mb, buf, MAXNAMLEN);
+#endif
     if ((fd = open(buf_mb, 0)) < 0) {	/* } for match */
 #else
     if ((fd = open(buf, 0)) < 0) {
@@ -1245,9 +1334,15 @@ textsw_store_init(textsw, filename)
 {
     struct stat     stat_buf;
 #ifdef OW_I18N
+#ifdef NAME_MAX
+    char            filename_mb[NAME_MAX];
+
+    (void) wcstombs(filename_mb, filename, NAME_MAX);
+#else
     char            filename_mb[MAXNAMLEN];
 
     (void) wcstombs(filename_mb, filename, MAXNAMLEN);
+#endif
     if (stat(filename_mb, &stat_buf) == 0) {	/* } for match */
 #else
     if (stat(filename, &stat_buf) == 0) {
@@ -1310,10 +1405,16 @@ textsw_process_store_error(textsw, filen
       case ES_CANNOT_OVERWRITE:
 #ifdef OW_I18N
       {
+#ifdef NAME_MAX
+	char	filename_mb[NAME_MAX];
+
+	(void) wcstombs(filename_mb, filename, NAME_MAX);
+#else
 	char	filename_mb[MAXNAMLEN];
 
 	(void) wcstombs(filename_mb, filename, MAXNAMLEN);
 #endif
+#endif
         frame = FRAME_FROM_FOLIO_OR_VIEW(textsw);
         text_notice = (Xv_Notice)xv_get(frame, 
                                 XV_KEY_DATA, text_notice_key, 
@@ -1465,9 +1566,12 @@ textsw_store_file_internal(abstract, fil
 	if (status == ES_SUCCESS) {
 	    if (textsw->state & TXTSW_STORE_CHANGES_FILE) {
 #ifdef OW_I18N
-		char	filename_mbs[MAXNAMLEN];
+#ifdef NAME_MAX
+		char	filename_mbs[NAME_MAX];
 
-		(void) wcstombs(filename_mbs, filename, MAXNAMLEN);
+		(void) wcstombs(filename_mbs, filename, NAME_MAX);
+#else
+#endif
 		textsw_notify(textsw->first_view,
 			      TEXTSW_ACTION_LOADED_FILE, filename_mbs,
 			      TEXTSW_ACTION_LOADED_FILE_WCS, filename, 0);
@@ -1491,9 +1595,15 @@ textsw_store_file(abstract, filename, lo
     int             locx, locy;
 {
 #ifdef OW_I18N
+#ifdef NAME_MAX
+    CHAR	filename_wcs[NAME_MAX];
+
+    (void) mbstowcs(filename_wcs, filename, NAME_MAX);
+#else
     CHAR	filename_wcs[MAXNAMLEN];
 
     (void) mbstowcs(filename_wcs, filename, MAXNAMLEN);
+#endif
     return (textsw_store_file_internal(abstract, filename_wcs, locx, locy));
 #else
     return (textsw_store_file_internal(abstract, filename, locx, locy));
@@ -1516,7 +1626,11 @@ textsw_store_to_selection(textsw, locx, 
     Textsw_folio    textsw;
     int             locx, locy;
 {
+#ifdef NAME_MAX
+    CHAR            filename[NAME_MAX];
+#else
     CHAR            filename[MAXNAMLEN];
+#endif
 
     if (textsw_get_selection_as_filename(
 			    textsw, filename, SIZEOF(filename), locx, locy))
@@ -1545,11 +1659,19 @@ textsw_reset_2(abstract, locx, locy, pre
 #endif /* SVR4 */
     Pkg_private Es_handle es_mem_create();
     Es_handle       piece_esh, old_original_esh, new_original_esh;
+    char	    *temp_name;
+#ifdef NAME_MAX
+#ifdef OW_I18N
+    CHAR           *name, save_name[NAME_MAX], scratch_name[NAME_MAX];
+#else
+    char           *name, save_name[NAME_MAX], scratch_name[NAME_MAX];
+#endif
+#else
 #ifdef OW_I18N
     CHAR           *name, save_name[MAXNAMLEN], scratch_name[MAXNAMLEN];
-    char	   *temp_name;
 #else
-    char           *name, save_name[MAXNAMLEN], scratch_name[MAXNAMLEN], *temp_name;
+    char           *name, save_name[MAXNAMLEN], scratch_name[MAXNAMLEN];
+#endif
 #endif
     int             status;
     Textsw_folio    folio = FOLIO_FOR_VIEW(VIEW_ABS_TO_REP(abstract));
@@ -1591,7 +1713,11 @@ textsw_reset_2(abstract, locx, locy, pre
 	    (char *) window_get(abstract, TEXTSW_TEMP_FILENAME);
 	if (temp_name)
 #ifdef OW_I18N
+#ifdef NAME_MAX
+	    (void) mbstowcs(save_name, temp_name, NAME_MAX);
+#else
 	    (void) mbstowcs(save_name, temp_name, MAXNAMLEN);
+#endif
 #else
 	    (void) STRCPY(save_name, temp_name);
 #endif
@@ -2150,7 +2276,11 @@ textsw_post_error(folio_or_view, locx, l
     int             locx, locy;	/* Unused */
     char           *msg1, *msg2;
 {
+#ifdef NAME_MAX
+    char            buf[NAME_MAX + 1000];
+#else
     char            buf[MAXNAMLEN + 1000];
+#endif
     int             size_to_use = sizeof(buf);
     Frame	    frame;
     Xv_Notice	    text_notice;
@@ -2226,8 +2356,13 @@ textsw_change_directory(textsw, filename
     CHAR           *full_pathname_wc;
     char            filename[MAXPATHLEN];
 #endif
+#ifdef NAME_MAX
+    char            msg[NAME_MAX + 100];
+    char            notice_msg[NAME_MAX + 100];
+#else
     char            msg[MAXNAMLEN + 100];
     char            notice_msg[MAXNAMLEN + 100];
+#endif
     struct stat     stat_buf;
     int             result = 0;
     int             notice_result;
@@ -2402,8 +2537,13 @@ textsw_checkpoint_internal(folio)
 	CHAR           *name;
 	if (textsw_file_name(folio, &name) != 0)
 	    return (ES_CANNOT_GET_NAME);
+#ifdef NAME_MAX
+	if ((folio->checkpoint_name = (CHAR *) MALLOC(NAME_MAX)) == 0)
+	    return (ES_CANNOT_GET_NAME);
+#else
 	if ((folio->checkpoint_name = (CHAR *) MALLOC(MAXNAMLEN)) == 0)
 	    return (ES_CANNOT_GET_NAME);
+#endif
 #ifdef OW_I18N
 	(void) SPRINTF(folio->checkpoint_name, "%ws%%%%", name);
 #else
@@ -2773,7 +2913,11 @@ textsw_invalid_data_notice(view, filenam
     int			 flag;
 {
     Xv_Notice	text_notice;
+#ifdef NAME_MAX
+    char	notice_msg[NAME_MAX + 300];
+#else
     char	notice_msg[MAXNAMLEN + 300];
+#endif
     Frame	frame = FRAME_FROM_FOLIO_OR_VIEW(view);
 
     if (flag) {
