1 /* Public Domain Curses */
2 
3 #include <curspriv.h>
4 
5 /*man-start**************************************************************
6 
7 instr
8 -----
9 
10 ### Synopsis
11 
12     int instr(char *str);
13     int innstr(char *str, int n);
14     int winstr(WINDOW *win, char *str);
15     int winnstr(WINDOW *win, char *str, int n);
16     int mvinstr(int y, int x, char *str);
17     int mvinnstr(int y, int x, char *str, int n);
18     int mvwinstr(WINDOW *win, int y, int x, char *str);
19     int mvwinnstr(WINDOW *win, int y, int x, char *str, int n);
20 
21     int inwstr(wchar_t *wstr);
22     int innwstr(wchar_t *wstr, int n);
23     int winwstr(WINDOW *win, wchar_t *wstr);
24     int winnwstr(WINDOW *win, wchar_t *wstr, int n);
25     int mvinwstr(int y, int x, wchar_t *wstr);
26     int mvinnwstr(int y, int x, wchar_t *wstr, int n);
27     int mvwinwstr(WINDOW *win, int y, int x, wchar_t *wstr);
28     int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *wstr, int n);
29 
30 ### Description
31 
32    These functions take characters (or wide characters) from the
33    current or specified position in the window, and return them as
34    a string in str (or wstr). Attributes are ignored. The functions
35    with n as the last argument return a string at most n characters
36    long.
37 
38 ### Return Value
39 
40    Upon successful completion, innstr(), mvinnstr(), mvwinnstr()
41    and winnstr() return the number of characters actually read into
42    the string; instr(), mvinstr(), mvwinstr() and winstr() return
43    OK. Otherwise, all these functions return ERR.
44 
45 ### Portability
46                              X/Open    BSD    SYS V
47     instr                       Y       -      4.0
48     winstr                      Y       -      4.0
49     mvinstr                     Y       -      4.0
50     mvwinstr                    Y       -      4.0
51     innstr                      Y       -      4.0
52     winnstr                     Y       -      4.0
53     mvinnstr                    Y       -      4.0
54     mvwinnstr                   Y       -      4.0
55     inwstr                      Y
56     winwstr                     Y
57     mvinwstr                    Y
58     mvwinwstr                   Y
59     innwstr                     Y
60     winnwstr                    Y
61     mvinnwstr                   Y
62     mvwinnwstr                  Y
63 
64 **man-end****************************************************************/
65 
winnstr(WINDOW * win,char * str,int n)66 int winnstr(WINDOW *win, char *str, int n)
67 {
68 #ifdef PDC_WIDE
69     wchar_t wstr[513];
70 
71     if (n < 0 || n > 512)
72         n = 512;
73 
74     if (winnwstr(win, wstr, n) == ERR)
75         return ERR;
76 
77     return PDC_wcstombs(str, wstr, n);
78 #else
79     chtype *src;
80     int i;
81 
82     PDC_LOG(("winnstr() - called: n %d \n", n));
83 
84     if (!win || !str)
85         return ERR;
86 
87     if (n < 0 || (win->_curx + n) > win->_maxx)
88         n = win->_maxx - win->_curx;
89 
90     src = win->_y[win->_cury] + win->_curx;
91 
92     for (i = 0; i < n; i++)
93         str[i] = src[i] & A_CHARTEXT;
94 
95     str[i] = '\0';
96 
97     return i;
98 #endif
99 }
100 
instr(char * str)101 int instr(char *str)
102 {
103     PDC_LOG(("instr() - called: string=\"%s\"\n", str));
104 
105     return (ERR == winnstr(stdscr, str, stdscr->_maxx)) ? ERR : OK;
106 }
107 
winstr(WINDOW * win,char * str)108 int winstr(WINDOW *win, char *str)
109 {
110     PDC_LOG(("winstr() - called: \n"));
111 
112     return (ERR == winnstr(win, str, win->_maxx)) ? ERR : OK;
113 }
114 
mvinstr(int y,int x,char * str)115 int mvinstr(int y, int x, char *str)
116 {
117     PDC_LOG(("mvinstr() - called: y %d x %d \n", y, x));
118 
119     if (move(y, x) == ERR)
120         return ERR;
121 
122     return (ERR == winnstr(stdscr, str, stdscr->_maxx)) ? ERR : OK;
123 }
124 
mvwinstr(WINDOW * win,int y,int x,char * str)125 int mvwinstr(WINDOW *win, int y, int x, char *str)
126 {
127     PDC_LOG(("mvwinstr() - called: y %d x %d \n", y, x));
128 
129     if (wmove(win, y, x) == ERR)
130         return ERR;
131 
132     return (ERR == winnstr(win, str, win->_maxx)) ? ERR : OK;
133 }
134 
innstr(char * str,int n)135 int innstr(char *str, int n)
136 {
137     PDC_LOG(("innstr() - called: n %d \n", n));
138 
139     return winnstr(stdscr, str, n);
140 }
141 
mvinnstr(int y,int x,char * str,int n)142 int mvinnstr(int y, int x, char *str, int n)
143 {
144     PDC_LOG(("mvinnstr() - called: y %d x %d n %d \n", y, x, n));
145 
146     if (move(y, x) == ERR)
147         return ERR;
148 
149     return winnstr(stdscr, str, n);
150 }
151 
mvwinnstr(WINDOW * win,int y,int x,char * str,int n)152 int mvwinnstr(WINDOW *win, int y, int x, char *str, int n)
153 {
154     PDC_LOG(("mvwinnstr() - called: y %d x %d n %d \n", y, x, n));
155 
156     if (wmove(win, y, x) == ERR)
157         return ERR;
158 
159     return winnstr(win, str, n);
160 }
161 
162 #ifdef PDC_WIDE
winnwstr(WINDOW * win,wchar_t * wstr,int n)163 int winnwstr(WINDOW *win, wchar_t *wstr, int n)
164 {
165     chtype *src;
166     int i;
167 
168     PDC_LOG(("winnstr() - called: n %d \n", n));
169 
170     if (!win || !wstr)
171         return ERR;
172 
173     if (n < 0 || (win->_curx + n) > win->_maxx)
174         n = win->_maxx - win->_curx;
175 
176     src = win->_y[win->_cury] + win->_curx;
177 
178     for (i = 0; i < n; i++)
179         wstr[i] = src[i] & A_CHARTEXT;
180 
181     wstr[i] = L'\0';
182 
183     return i;
184 }
185 
inwstr(wchar_t * wstr)186 int inwstr(wchar_t *wstr)
187 {
188     PDC_LOG(("inwstr() - called\n"));
189 
190     return (ERR == winnwstr(stdscr, wstr, stdscr->_maxx)) ? ERR : OK;
191 }
192 
winwstr(WINDOW * win,wchar_t * wstr)193 int winwstr(WINDOW *win, wchar_t *wstr)
194 {
195     PDC_LOG(("winwstr() - called\n"));
196 
197     return (ERR == winnwstr(win, wstr, win->_maxx)) ? ERR : OK;
198 }
199 
mvinwstr(int y,int x,wchar_t * wstr)200 int mvinwstr(int y, int x, wchar_t *wstr)
201 {
202     PDC_LOG(("mvinwstr() - called\n"));
203 
204     if (move(y, x) == ERR)
205         return ERR;
206 
207     return (ERR == winnwstr(stdscr, wstr, stdscr->_maxx)) ? ERR : OK;
208 }
209 
mvwinwstr(WINDOW * win,int y,int x,wchar_t * wstr)210 int mvwinwstr(WINDOW *win, int y, int x, wchar_t *wstr)
211 {
212     PDC_LOG(("mvwinstr() - called\n"));
213 
214     if (wmove(win, y, x) == ERR)
215         return ERR;
216 
217     return (ERR == winnwstr(win, wstr, win->_maxx)) ? ERR : OK;
218 }
219 
innwstr(wchar_t * wstr,int n)220 int innwstr(wchar_t *wstr, int n)
221 {
222     PDC_LOG(("innwstr() - called\n"));
223 
224     return winnwstr(stdscr, wstr, n);
225 }
226 
mvinnwstr(int y,int x,wchar_t * wstr,int n)227 int mvinnwstr(int y, int x, wchar_t *wstr, int n)
228 {
229     PDC_LOG(("mvinnstr() - called\n"));
230 
231     if (move(y, x) == ERR)
232         return ERR;
233 
234     return winnwstr(stdscr, wstr, n);
235 }
236 
mvwinnwstr(WINDOW * win,int y,int x,wchar_t * wstr,int n)237 int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *wstr, int n)
238 {
239     PDC_LOG(("mvwinnwstr() - called\n"));
240 
241     if (wmove(win, y, x) == ERR)
242         return ERR;
243 
244     return winnwstr(win, wstr, n);
245 }
246 #endif
247