xref: /original-bsd/lib/libcurses/scanw.c (revision e0851aa6)
1 /*
2  * Copyright (c) 1981 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)scanw.c	5.10 (Berkeley) 08/31/92";
10 #endif	/* not lint */
11 
12 /*
13  * scanw and friends.
14  */
15 
16 #include <curses.h>
17 
18 #if __STDC__
19 #include <stdarg.h>
20 #else
21 #include <varargs.h>
22 #endif
23 
24 static int __sscans __P((WINDOW *, const char *, va_list));
25 
26 /*
27  * scanw --
28  *	Implement a scanf on the standard screen.
29  */
30 int
31 #if __STDC__
32 scanw(const char *fmt, ...)
33 #else
34 scanw(fmt, va_alist)
35 	char *fmt;
36 	va_dcl
37 #endif
38 {
39 	va_list ap;
40 	int ret;
41 
42 #if __STDC__
43 	va_start(ap, fmt);
44 #else
45 	va_start(ap);
46 #endif
47 	ret = __sscans(stdscr, fmt, ap);
48 	va_end(ap);
49 	return (ret);
50 }
51 
52 /*
53  * wscanw --
54  *	Implements a scanf on the given window.
55  */
56 int
57 #if __STDC__
58 wscanw(WINDOW *win, const char *fmt, ...)
59 #else
60 wscanw(win, fmt, va_alist)
61 	WINDOW *win;
62 	char *fmt;
63 	va_dcl
64 #endif
65 {
66 	va_list ap;
67 	int ret;
68 
69 #if __STDC__
70 	va_start(ap, fmt);
71 #else
72 	va_start(ap);
73 #endif
74 	ret = __sscans(win, fmt, ap);
75 	va_end(ap);
76 	return (ret);
77 }
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  */
84 int
85 #if __STDC__
86 mvscanw(register int y, register int x, const char *fmt,...)
87 #else
88 mvscanw(y, x, fmt, va_alist)
89 	register int y, x;
90 	char *fmt;
91 	va_dcl
92 #endif
93 {
94 	va_list ap;
95 	int ret;
96 
97 	if (move(y, x) != OK)
98 		return (ERR);
99 #if __STDC__
100 	va_start(ap, fmt);
101 #else
102 	va_start(ap);
103 #endif
104 	ret = __sscans(stdscr, fmt, ap);
105 	va_end(ap);
106 	return (ret);
107 }
108 
109 int
110 #if __STDC__
111 mvwscanw(register WINDOW * win, register int y, register int x,
112     const char *fmt, ...)
113 #else
114 mvwscanw(win, y, x, fmt, va_alist)
115 	register WINDOW *win;
116 	register int y, x;
117 	char *fmt;
118 	va_dcl
119 #endif
120 {
121 	va_list ap;
122 	int ret;
123 
124 	if (move(y, x) != OK)
125 		return (ERR);
126 #if __STDC__
127 	va_start(ap, fmt);
128 #else
129 	va_start(ap);
130 #endif
131 	ret = __sscans(win, fmt, ap);
132 	va_end(ap);
133 	return (ret);
134 }
135 
136 /*
137  * __sscans --
138  *	This routine actually executes the scanf from the window.
139  *	THIS SHOULD BE RENAMED vwscanw AND EXPORTED
140  */
141 static int
142 __sscans(win, fmt, ap)
143 	WINDOW *win;
144 	const char *fmt;
145 	va_list ap;
146 {
147 
148 	char buf[1024];
149 
150 	return (wgetstr(win, buf) == OK ? vsscanf(buf, fmt, ap) : ERR);
151 }
152