1/*	$NetBSD: scanw.c,v 1.23 2019/06/30 22:16:20 blymn Exp $	*/
2
3/*
4 * Copyright (c) 1981, 1993, 1994
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33#ifndef lint
34#if 0
35static char sccsid[] = "@(#)scanw.c	8.3 (Berkeley) 5/4/94";
36#else
37__RCSID("$NetBSD: scanw.c,v 1.23 2019/06/30 22:16:20 blymn Exp $");
38#endif
39#endif				/* not lint */
40
41/*
42 * scanw and friends.
43 */
44
45#include <stdarg.h>
46
47#include "curses.h"
48
49/*
50 * scanw --
51 *	Implement a scanf on the standard screen.
52 */
53int
54scanw(const char *fmt,...)
55{
56	va_list ap;
57	int     ret;
58
59	va_start(ap, fmt);
60	ret = vw_scanw(stdscr, fmt, ap);
61	va_end(ap);
62	return ret;
63}
64/*
65 * wscanw --
66 *	Implements a scanf on the given window.
67 */
68int
69wscanw(WINDOW *win, const char *fmt,...)
70{
71	va_list ap;
72	int     ret;
73
74	va_start(ap, fmt);
75	ret = vw_scanw(win, fmt, ap);
76	va_end(ap);
77	return ret;
78}
79/*
80 * mvscanw, mvwscanw --
81 *	Implement the mvscanw commands.  Due to the variable number of
82 *	arguments, they cannot be macros.  Another sigh....
83 */
84int
85mvscanw(int y, int x, const char *fmt,...)
86{
87	va_list ap;
88	int     ret;
89
90	if (move(y, x) != OK)
91		return ERR;
92	va_start(ap, fmt);
93	ret = vw_scanw(stdscr, fmt, ap);
94	va_end(ap);
95	return ret;
96}
97
98int
99mvwscanw(WINDOW * win, int y, int x, const char *fmt,...)
100{
101	va_list ap;
102	int     ret;
103
104	if (move(y, x) != OK)
105		return ERR;
106	va_start(ap, fmt);
107	ret = vw_scanw(win, fmt, ap);
108	va_end(ap);
109	return ret;
110}
111/*
112 * vwscanw --
113 *	This routine actually executes the scanf from the window.
114 */
115int
116vw_scanw(WINDOW *win, const char *fmt, va_list ap)
117{
118	char    buf[1024];
119	int	ret;
120
121	ret = ERR;
122	if (wgetnstr(win, buf, (int) sizeof(buf)) == OK) {
123		if (vsscanf(buf, fmt, ap) > 0) {
124			ret = OK;
125		}
126	}
127
128	return ret;
129}
130
131__strong_alias(vwscanw, vw_scanw)
132