1 /****************************************************************************
2 * Copyright (c) 2009,2010 Free Software Foundation, Inc. *
4 * Permission is hereby granted, free of charge, to any person obtaining a *
5 * copy of this software and associated documentation files (the *
6 * "Software"), to deal in the Software without restriction, including *
7 * without limitation the rights to use, copy, modify, merge, publish, *
8 * distribute, distribute with modifications, sublicense, and/or sell *
9 * copies of the Software, and to permit persons to whom the Software is *
10 * furnished to do so, subject to the following conditions: *
12 * The above copyright notice and this permission notice shall be included *
13 * in all copies or substantial portions of the Software. *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
23 * Except as contained in this notice, the name(s) of the above copyright *
24 * holders shall not be used in advertising or otherwise to promote the *
25 * sale, use or other dealings in this Software without prior written *
27 ****************************************************************************/
29 * $Id: test_addstr.c,v 1.6 2010/12/12 00:17:37 tom Exp $
31 * Demonstrate the waddstr() and waddch functions.
32 * Thomas Dickey - 2009/9/12
35 #include <test.priv.h>
39 #define AddNStr addnstr
41 #define MvAddNStr (void) mvaddnstr
42 #define MvWAddNStr (void) mvwaddnstr
43 #define WAddNStr waddnstr
44 #define WAddStr waddstr
58 static bool m_opt
= FALSE
;
59 static bool w_opt
= FALSE
;
60 static int n_opt
= -1;
63 legend(WINDOW
*win
, int level
, Options state
, char *buffer
, int length
)
65 const char *showstate
;
73 showstate
= " (mvXXX)";
76 showstate
= " (winXXX)";
79 showstate
= " (mvwinXXX)";
85 "The Strings/Chars displays should match. Enter any characters, except:\n");
87 "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
89 wprintw(win
, "Level %d,%s added %d characters <%s>", level
,
90 showstate
, length
, buffer
);
94 ColOf(char *buffer
, int length
, int margin
)
99 for (n
= 0, result
= margin
+ 1; n
< length
; ++n
) {
100 int ch
= UChar(buffer
[n
]);
103 /* actually newline should clear the remainder of the line
104 * and move to the next line - but that seems a little awkward
115 result
+= (MY_TABSIZE
- (result
% MY_TABSIZE
));
130 #define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
134 static bool first
= TRUE
;
146 int margin
= (2 * MY_TABSIZE
) - 1;
147 Options option
= (Options
) ((unsigned) (m_opt
150 | (unsigned) ((w_opt
|| (level
> 0))
156 setlocale(LC_ALL
, "");
158 putenv(strcpy(cmd
, "TABSIZE=8"));
161 (void) cbreak(); /* take input chars one at a time, no wait for \n */
162 (void) noecho(); /* don't echo input */
163 keypad(stdscr
, TRUE
);
168 look
= newwin(limit
, COLS
- (2 * (level
- 1)), 0, level
- 1);
169 work
= newwin(limit
- 2, COLS
- (2 * level
), 1, level
);
170 show
= newwin(4, COLS
, limit
+ 1, 0);
176 show
= derwin(stdscr
, 4, COLS
, limit
+ 1, 0);
180 for (col
= margin
+ 1; col
< COLS
; col
+= MY_TABSIZE
)
181 MvWVLine(work
, row
, col
, '.', limit
- 2);
183 MvWVLine(work
, row
, margin
, ACS_VLINE
, limit
- 2);
184 MvWVLine(work
, row
, margin
+ 1, ACS_VLINE
, limit
- 2);
187 MvWAddStr(work
, 1, 2, "String");
188 MvWAddStr(work
, limit
+ 1, 2, "Chars");
191 buffer
[length
= 0] = '\0';
192 legend(show
, level
, option
, buffer
, length
);
198 * Show the characters added in color, to distinguish from those that
203 init_pair(1, COLOR_WHITE
, COLOR_BLUE
);
204 wbkgdset(work
, COLOR_PAIR(1) | ' ');
207 while ((ch
= read_linedata(work
)) != ERR
&& !isQUIT(ch
)) {
208 wmove(work
, row
, margin
+ 1);
211 test_adds(level
+ 1);
226 /* put the whole string in, all at once */
231 for (col
= 0; col
< length
; col
+= n_opt
) {
232 col2
= ColOf(buffer
, col
, margin
);
233 if (move(row
, col2
) != ERR
) {
234 AddNStr(buffer
+ col
, LEN(col
));
238 if (move(row
, col2
) != ERR
) {
245 for (col
= 0; col
< length
; col
+= n_opt
) {
246 col2
= ColOf(buffer
, col
, margin
);
247 MvAddNStr(row
, col2
, buffer
+ col
, LEN(col
));
250 MvAddStr(row
, col2
, buffer
);
255 for (col
= 0; col
< length
; col
+= n_opt
) {
256 col2
= ColOf(buffer
, col
, margin
);
257 if (wmove(work
, row
, col2
) != ERR
) {
258 WAddNStr(work
, buffer
+ col
, LEN(col
));
262 if (wmove(work
, row
, col2
) != ERR
) {
263 WAddStr(work
, buffer
);
269 for (col
= 0; col
< length
; col
+= n_opt
) {
270 col2
= ColOf(buffer
, col
, margin
);
271 MvWAddNStr(work
, row
, col2
, buffer
+ col
, LEN(col
));
274 MvWAddStr(work
, row
, col2
, buffer
);
279 /* do the corresponding single-character add */
281 for (col
= 0; col
< length
; ++col
) {
282 col2
= ColOf(buffer
, col
, margin
);
285 if (move(row2
, col2
) != ERR
) {
286 AddCh(UChar(buffer
[col
]));
290 MvAddCh(row2
, col2
, UChar(buffer
[col
]));
293 if (wmove(work
, row2
, col2
) != ERR
) {
294 WAddCh(work
, UChar(buffer
[col
]));
298 MvWAddCh(work
, row2
, col2
, UChar(buffer
[col
]));
307 if (ch
<= 0 || ch
> 255) {
311 buffer
[length
++] = (char) ch
;
312 buffer
[length
] = '\0';
314 /* put the string in, one character at a time */
315 col
= ColOf(buffer
, length
- 1, margin
);
318 if (move(row
, col
) != ERR
) {
319 AddStr(buffer
+ length
- 1);
323 MvAddStr(row
, col
, buffer
+ length
- 1);
326 if (wmove(work
, row
, col
) != ERR
) {
327 WAddStr(work
, buffer
+ length
- 1);
331 MvWAddStr(work
, row
, col
, buffer
+ length
- 1);
335 /* do the corresponding single-character add */
338 if (move(limit
+ row
, col
) != ERR
) {
343 MvAddCh(limit
+ row
, col
, UChar(ch
));
346 if (wmove(work
, limit
+ row
, col
) != ERR
) {
347 WAddCh(work
, UChar(ch
));
351 MvWAddCh(work
, limit
+ row
, col
, UChar(ch
));
357 legend(show
, level
, option
, buffer
, length
);
374 static const char *tbl
[] =
376 "Usage: test_addstr [options]"
379 ," -f FILE read data from given file"
380 ," -n NUM limit string-adds to NUM bytes on ^N replay"
381 ," -m perform wmove/move separately from add-functions"
382 ," -w use window-parameter even when stdscr would be implied"
385 for (n
= 0; n
< SIZEOF(tbl
); ++n
)
386 fprintf(stderr
, "%s\n", tbl
[n
]);
387 ExitProgram(EXIT_FAILURE
);
391 main(int argc GCC_UNUSED
, char *argv
[]GCC_UNUSED
)
395 setlocale(LC_ALL
, "");
397 while ((ch
= getopt(argc
, argv
, "f:mn:w")) != -1) {
400 init_linedata(optarg
);
406 n_opt
= atoi(optarg
);
423 ExitProgram(EXIT_SUCCESS
);