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

--- lib/libxview/textsw/txt_again.c.orig	1993-06-29 05:17:32.000000000 +0000
+++ lib/libxview/textsw/txt_again.c
@@ -24,10 +24,11 @@ static char     sccsid[] = "@(#)txt_agai
 #include <string.h>
 #endif /* SVR4 */
 
-Pkg_private CHAR    *STRNCPY();
 Pkg_private Es_index textsw_do_input();
 Pkg_private Es_index textsw_do_pending_delete();
 
+static int textsw_string_min_free();
+
 string_t        null_string = {0, 0, 0};
 
 #define	TEXT_DELIMITER	"\\"
@@ -182,6 +183,7 @@ textsw_string_min_free(ptr_to_string, mi
  * Following is stolen from 3.2ALPHA sprintf(str, fmt, va_alist) SIDE_EFFECT:
  * TXTSW_STRING_FREE(ptr_to_string) is modified by this routine.
  */
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__)
 #ifndef SVR4
 
 /* VARARGS2 */
@@ -325,6 +327,46 @@ va_dcl
 
 #endif /* SVR4 */
 
+#elif defined(__DragonFly__)
+static int
+textsw_printf(register string_t *ptr_to_string, char  *fmt, ...)
+{
+    int result;
+    va_list args;
+
+    VA_START(args, fmt);
+    result = vsnprintf(TXTSW_STRING_FREE(ptr_to_string), ptr_to_string->max_length - TXTSW_STRING_LENGTH(ptr_to_string), fmt, args);
+    if (result >=0)
+	TXTSW_STRING_FREE(ptr_to_string) += result;
+    return(result);
+}
+
+
+#else /* __FreeBSD__ */
+/*inspiration taken from sprintf.c */
+
+static int
+textsw_printf(register string_t *ptr_to_string, char  *fmt, ...)
+{ 
+    FILE            _strbuf;
+    int             result;
+    va_list         args;
+    _strbuf._flags = __SWR | __SSTR;
+    _strbuf._bf._base = _strbuf._p = (char *) TXTSW_STRING_FREE(ptr_to_string);
+    _strbuf._bf._size = _strbuf._w = ptr_to_string->max_length - TXTSW_STRING_LENGTH(ptr_to_string);
+    VA_START(args, fmt);
+    result = vfprintf (&_strbuf, fmt, args);
+    va_end(args);
+    TXTSW_STRING_FREE(ptr_to_string) = (char *) _strbuf._p;
+#ifndef lint
+    if (result >= 0)
+    putc('\0', &_strbuf);
+#endif
+    return (result); 
+}
+
+#endif /* __FreeBSD__ */
+
 static	void
 textsw_record_buf(again, buffer, buffer_length)
     register string_t *again;
@@ -619,6 +661,8 @@ textsw_record_trash_insert(textsw)
  */
 /* VARARGS2 */
 
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__)
+
 static int
 #ifdef ANSI_FUNC_PROTO
 textsw_scanf(register string_t *ptr_to_string, register char  *fmt, ...)
@@ -705,6 +749,57 @@ va_dcl
 
 #endif /* OW_I18N */
 }
+#elif defined(__DragonFly__)
+static int
+textsw_scanf(register string_t *ptr_to_string, char  *fmt, ...)
+{
+	va_list args;
+	int result;
+	size_t len = TXTSW_STRING_LENGTH(ptr_to_string);
+	char *str = malloc(len + 1);
+	if (str == NULL)
+	    return -1;
+	memcpy(str, TXTSW_STRING_BASE(ptr_to_string), len);
+	str[len] = '\0';
+	VA_START(args, fmt);
+	result = vsscanf(str, fmt, args);
+	va_end(args);
+	free(str);
+	return(result);
+}
+
+#else /* __FreeBSD__ */
+/*inspiration/code taken from sscanf.c */
+
+static int
+eofread(cookie, buf, len)
+        void *cookie;
+        char *buf;
+        int len;
+{
+
+        return (0);
+}   
+
+static int
+textsw_scanf(register string_t *ptr_to_string, char  *fmt, ...)
+{
+    FILE            _strbuf;
+    int             result;
+    va_list         args;
+
+    memset(&_strbuf, '\0', sizeof(_strbuf));
+    _strbuf._flags = __SRD;
+    _strbuf._bf._base = _strbuf._p = (char *) TXTSW_STRING_BASE(ptr_to_string);
+    _strbuf._bf._size = _strbuf._r = TXTSW_STRING_LENGTH(ptr_to_string);
+    _strbuf._read = eofread;
+    VA_START(args, fmt);
+    result = __svfscanf(&_strbuf, fmt, args);
+    va_end(args);
+    TXTSW_STRING_BASE(ptr_to_string) = (char *) _strbuf._p;
+    return (result);
+}       
+#endif /* __FreeBSD__ */
 
 static int
 textsw_next_is_delimiter(again)
@@ -848,7 +943,7 @@ textsw_get_recorded_x(view)
     int             found_it_already = FALSE;
 
     if (!TXTSW_DO_AGAIN(folio))
-	return;
+	return -1;
     again = &folio->again[0];
     if (TXTSW_STRING_IS_NULL(again)) {
 	return (result);
