$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 #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);