• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************/
2 /* asciixmas                                                                  */
3 /* December 1989             Larry Bartz           Indianapolis, IN           */
4 /*                                                                            */
5 /*                                                                            */
6 /* I'm dreaming of an ascii character-based monochrome Christmas,             */
7 /* Just like the one's I used to know!                                        */
8 /* Via a full duplex communications channel,                                  */
9 /* At 9600 bits per second,                                                   */
10 /* Even though it's kinda slow.                                               */
11 /*                                                                            */
12 /* I'm dreaming of an ascii character-based monochrome Christmas,             */
13 /* With ev'ry C program I write!                                              */
14 /* May your screen be merry and bright!                                       */
15 /* And may all your Christmases be amber or green,                            */
16 /* (for reduced eyestrain and improved visibility)!                           */
17 /*                                                                            */
18 /*                                                                            */
19 /*                                                                            */
20 /*                                                                            */
21 /*                                                                            */
22 /* IMPLEMENTATION                                                             */
23 /*                                                                            */
24 /* Feel free to modify the defined string FROMWHO to reflect you, your        */
25 /* organization, your site, whatever.                                         */
26 /*                                                                            */
27 /* This really looks a lot better if you can turn off your cursor before      */
28 /* execution. I wanted to do that here but very few termcap entries or        */
29 /* terminfo definitions have the appropriate string defined. If you know      */
30 /* the string(s) for the terminal(s) you use or which your site supports,     */
31 /* you could call asciixmas from within a shell in which you issue the        */
32 /* string to the terminal. The cursor is distracting but it doesn't really    */
33 /* ruin the show.                                                             */
34 /*                                                                            */
35 /* At our site, we invoke this for our users just after login and the         */
36 /* determination of terminal type.                                            */
37 /*                                                                            */
38 /*                                                                            */
39 /* PORTABILITY                                                                */
40 /*                                                                            */
41 /* I wrote this using only the very simplest curses functions so that it      */
42 /* might be the most portable. I was personally able to test on five          */
43 /* different cpu/UNIX combinations.                                           */
44 /*                                                                            */
45 /*                                                                            */
46 /* COMPILE                                                                    */
47 /*                                                                            */
48 /* usually this:                                                              */
49 /*                                                                            */
50 /* cc -O asciixmas.c -lcurses -o asciixmas -s                                 */
51 /*                                                                            */
52 /*                                                                            */
53 /* Zilog S8000 models 11, 21, 31, etc with ZEUS variant of SYSTEM III         */
54 /* maybe other SYSTEM III also:                                               */
55 /*                                                                            */
56 /* cc asciixmas.c -lcurses -ltermlib -o asciixmas -s                          */
57 /*                                                                            */
58 /* as above with optional "peephole optimizer" installed:                     */
59 /*                                                                            */
60 /* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s                       */
61 /*                                                                            */
62 /*                                                                            */
63 /* Zilog S8000 models 32, 130 with WE32100 chip and SYS V, REL2               */
64 /* maybe 3B2 also?                                                            */
65 /*                                                                            */
66 /* cc -f -O -K sd asciixmas.c -lcurses -o asciixmas -s                        */
67 /*                                                                            */
68 /*                                                                            */
69 /* Pyramid, Sequent, any other "dual universe" types compile and execute      */
70 /* under either universe. The compile line for the ucb universe (as you       */
71 /* might expect) is the same as for SYS III UNIX:                             */
72 /*                                                                            */
73 /* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s                       */
74 /*                                                                            */
75 /* The above compile will also hold true for other BSD systems. (I hope)      */
76 /*                                                                            */
77 /*                                                                            */
78 /*                                                                            */
79 /*                                                                            */
80 /* For the Scrooges out there among you who don't want this thing to loop     */
81 /* forever (or until the user hits a key), insert this into your compile      */
82 /* line just after "cc" :                                                     */
83 /*                                                                            */
84 /* -DNOLOOP                                                                   */
85 /*                                                                            */
86 /* like so:                                                                   */
87 /*                                                                            */
88 /* cc -DNOLOOP -O asciixmas.c -lcurses -o asciixmas -s                        */
89 /*                                                                            */
90 /*                                                                            */
91 /*                                                                            */
92 /******************************************************************************/
93 
94 /*
95  * $Id: xmas.c,v 1.39 2022/12/04 00:40:11 tom Exp $
96  */
97 #include <test.priv.h>
98 
99 #define FROMWHO "Mark Hessling - (M.Hessling@gu.edu.au)"
100 
101 static int my_bg = COLOR_BLACK;
102 static int y_pos, x_pos;
103 
104 static WINDOW *treescrn;
105 static WINDOW *treescrn2;
106 static WINDOW *treescrn3;
107 static WINDOW *treescrn4;
108 static WINDOW *treescrn5;
109 static WINDOW *treescrn6;
110 static WINDOW *treescrn7;
111 static WINDOW *treescrn8;
112 static WINDOW *dotdeer0;
113 static WINDOW *stardeer0;
114 static WINDOW *lildeer0;
115 static WINDOW *lildeer1;
116 static WINDOW *lildeer2;
117 static WINDOW *lildeer3;
118 static WINDOW *middeer0;
119 static WINDOW *middeer1;
120 static WINDOW *middeer2;
121 static WINDOW *middeer3;
122 static WINDOW *bigdeer0;
123 static WINDOW *bigdeer1;
124 static WINDOW *bigdeer2;
125 static WINDOW *bigdeer3;
126 static WINDOW *bigdeer4;
127 static WINDOW *lookdeer0;
128 static WINDOW *lookdeer1;
129 static WINDOW *lookdeer2;
130 static WINDOW *lookdeer3;
131 static WINDOW *lookdeer4;
132 static WINDOW *w_holiday;
133 static WINDOW *w_del_msg;
134 static bool *my_pairs;
135 
136 static GCC_NORETURN void done(int sig);
137 
138 static void
set_color(WINDOW * win,chtype color)139 set_color(WINDOW *win, chtype color)
140 {
141     if (has_colors()) {
142 	int n = (int) (color + 1);
143 	if (my_pairs == 0)
144 	    my_pairs = typeCalloc(bool, (size_t) (COLORS + 1));
145 	if (!my_pairs[n]) {
146 	    init_pair((short) n, (short) color, (short) my_bg);
147 	    my_pairs[n] = TRUE;
148 	}
149 	wattroff(win, A_COLOR);
150 	wattron(win, COLOR_PAIR(n));
151     }
152 }
153 
154 static void
unset_color(WINDOW * win)155 unset_color(WINDOW *win)
156 {
157     if (has_colors())
158 	(void) wattrset(win, COLOR_PAIR(0));
159 }
160 
161 static void
look_out(int msecs)162 look_out(int msecs)
163 {
164     napms(msecs);
165     if (getch() != ERR) {
166 	beep();
167 	done(0);
168     }
169 }
170 
171 static int
boxit(void)172 boxit(void)
173 {
174     int x = 0;
175 
176     while (x < 20) {
177 	MvAddCh(x, 7, '|');
178 	++x;
179     }
180 
181     x = 8;
182 
183     while (x < 80) {
184 	MvAddCh(19, x, '_');
185 	++x;
186     }
187 
188     x = 0;
189 
190     while (x < 80) {
191 	MvAddCh(22, x, '_');
192 	++x;
193     }
194 
195     return (0);
196 }
197 
198 static int
seas(void)199 seas(void)
200 {
201     MvAddCh(4, 1, 'S');
202     MvAddCh(6, 1, 'E');
203     MvAddCh(8, 1, 'A');
204     MvAddCh(10, 1, 'S');
205     MvAddCh(12, 1, 'O');
206     MvAddCh(14, 1, 'N');
207     MvAddCh(16, 1, '`');
208     MvAddCh(18, 1, 'S');
209 
210     return (0);
211 }
212 
213 static int
greet(void)214 greet(void)
215 {
216     MvAddCh(3, 5, 'G');
217     MvAddCh(5, 5, 'R');
218     MvAddCh(7, 5, 'E');
219     MvAddCh(9, 5, 'E');
220     MvAddCh(11, 5, 'T');
221     MvAddCh(13, 5, 'I');
222     MvAddCh(15, 5, 'N');
223     MvAddCh(17, 5, 'G');
224     MvAddCh(19, 5, 'S');
225 
226     return (0);
227 }
228 
229 static int
fromwho(void)230 fromwho(void)
231 {
232     MvAddStr(21, 13, FROMWHO);
233     return (0);
234 }
235 
236 static int
tree(void)237 tree(void)
238 {
239     set_color(treescrn, COLOR_GREEN);
240     MvWAddCh(treescrn, 1, 11, (chtype) '/');
241     MvWAddCh(treescrn, 2, 11, (chtype) '/');
242     MvWAddCh(treescrn, 3, 10, (chtype) '/');
243     MvWAddCh(treescrn, 4, 9, (chtype) '/');
244     MvWAddCh(treescrn, 5, 9, (chtype) '/');
245     MvWAddCh(treescrn, 6, 8, (chtype) '/');
246     MvWAddCh(treescrn, 7, 7, (chtype) '/');
247     MvWAddCh(treescrn, 8, 6, (chtype) '/');
248     MvWAddCh(treescrn, 9, 6, (chtype) '/');
249     MvWAddCh(treescrn, 10, 5, (chtype) '/');
250     MvWAddCh(treescrn, 11, 3, (chtype) '/');
251     MvWAddCh(treescrn, 12, 2, (chtype) '/');
252 
253     MvWAddCh(treescrn, 1, 13, (chtype) '\\');
254     MvWAddCh(treescrn, 2, 13, (chtype) '\\');
255     MvWAddCh(treescrn, 3, 14, (chtype) '\\');
256     MvWAddCh(treescrn, 4, 15, (chtype) '\\');
257     MvWAddCh(treescrn, 5, 15, (chtype) '\\');
258     MvWAddCh(treescrn, 6, 16, (chtype) '\\');
259     MvWAddCh(treescrn, 7, 17, (chtype) '\\');
260     MvWAddCh(treescrn, 8, 18, (chtype) '\\');
261     MvWAddCh(treescrn, 9, 18, (chtype) '\\');
262     MvWAddCh(treescrn, 10, 19, (chtype) '\\');
263     MvWAddCh(treescrn, 11, 21, (chtype) '\\');
264     MvWAddCh(treescrn, 12, 22, (chtype) '\\');
265 
266     MvWAddCh(treescrn, 4, 10, (chtype) '_');
267     MvWAddCh(treescrn, 4, 14, (chtype) '_');
268     MvWAddCh(treescrn, 8, 7, (chtype) '_');
269     MvWAddCh(treescrn, 8, 17, (chtype) '_');
270 
271     MvWAddStr(treescrn, 13, 0, "//////////// \\\\\\\\\\\\\\\\\\\\\\\\");
272 
273     MvWAddStr(treescrn, 14, 11, "| |");
274     MvWAddStr(treescrn, 15, 11, "|_|");
275 
276     unset_color(treescrn);
277     wrefresh(treescrn);
278     wrefresh(w_del_msg);
279 
280     return (0);
281 }
282 
283 static int
balls(void)284 balls(void)
285 {
286     overlay(treescrn, treescrn2);
287 
288     set_color(treescrn2, COLOR_BLUE);
289     MvWAddCh(treescrn2, 3, 9, (chtype) '@');
290     MvWAddCh(treescrn2, 3, 15, (chtype) '@');
291     MvWAddCh(treescrn2, 4, 8, (chtype) '@');
292     MvWAddCh(treescrn2, 4, 16, (chtype) '@');
293     MvWAddCh(treescrn2, 5, 7, (chtype) '@');
294     MvWAddCh(treescrn2, 5, 17, (chtype) '@');
295     MvWAddCh(treescrn2, 7, 6, (chtype) '@');
296     MvWAddCh(treescrn2, 7, 18, (chtype) '@');
297     MvWAddCh(treescrn2, 8, 5, (chtype) '@');
298     MvWAddCh(treescrn2, 8, 19, (chtype) '@');
299     MvWAddCh(treescrn2, 10, 4, (chtype) '@');
300     MvWAddCh(treescrn2, 10, 20, (chtype) '@');
301     MvWAddCh(treescrn2, 11, 2, (chtype) '@');
302     MvWAddCh(treescrn2, 11, 22, (chtype) '@');
303     MvWAddCh(treescrn2, 12, 1, (chtype) '@');
304     MvWAddCh(treescrn2, 12, 23, (chtype) '@');
305 
306     unset_color(treescrn2);
307     wrefresh(treescrn2);
308     wrefresh(w_del_msg);
309     return (0);
310 }
311 
312 static int
star(void)313 star(void)
314 {
315     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
316     set_color(treescrn2, COLOR_YELLOW);
317 
318     MvWAddCh(treescrn2, 0, 12, (chtype) '*');
319     (void) wstandend(treescrn2);
320 
321     unset_color(treescrn2);
322     wrefresh(treescrn2);
323     wrefresh(w_del_msg);
324     return (0);
325 }
326 
327 static int
strng1(void)328 strng1(void)
329 {
330     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
331     set_color(treescrn2, COLOR_WHITE);
332 
333     MvWAddCh(treescrn2, 3, 13, (chtype) '\'');
334     MvWAddCh(treescrn2, 3, 12, (chtype) ':');
335     MvWAddCh(treescrn2, 3, 11, (chtype) '.');
336 
337     wattroff(treescrn2, A_BOLD | A_BLINK);
338     unset_color(treescrn2);
339 
340     wrefresh(treescrn2);
341     wrefresh(w_del_msg);
342     return (0);
343 }
344 
345 static int
strng2(void)346 strng2(void)
347 {
348     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
349     set_color(treescrn2, COLOR_WHITE);
350 
351     MvWAddCh(treescrn2, 5, 14, (chtype) '\'');
352     MvWAddCh(treescrn2, 5, 13, (chtype) ':');
353     MvWAddCh(treescrn2, 5, 12, (chtype) '.');
354     MvWAddCh(treescrn2, 5, 11, (chtype) ',');
355     MvWAddCh(treescrn2, 6, 10, (chtype) '\'');
356     MvWAddCh(treescrn2, 6, 9, (chtype) ':');
357 
358     wattroff(treescrn2, A_BOLD | A_BLINK);
359     unset_color(treescrn2);
360 
361     wrefresh(treescrn2);
362     wrefresh(w_del_msg);
363     return (0);
364 }
365 
366 static int
strng3(void)367 strng3(void)
368 {
369     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
370     set_color(treescrn2, COLOR_WHITE);
371 
372     MvWAddCh(treescrn2, 7, 16, (chtype) '\'');
373     MvWAddCh(treescrn2, 7, 15, (chtype) ':');
374     MvWAddCh(treescrn2, 7, 14, (chtype) '.');
375     MvWAddCh(treescrn2, 7, 13, (chtype) ',');
376     MvWAddCh(treescrn2, 8, 12, (chtype) '\'');
377     MvWAddCh(treescrn2, 8, 11, (chtype) ':');
378     MvWAddCh(treescrn2, 8, 10, (chtype) '.');
379     MvWAddCh(treescrn2, 8, 9, (chtype) ',');
380 
381     wattroff(treescrn2, A_BOLD | A_BLINK);
382     unset_color(treescrn2);
383 
384     wrefresh(treescrn2);
385     wrefresh(w_del_msg);
386     return (0);
387 }
388 
389 static int
strng4(void)390 strng4(void)
391 {
392     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
393     set_color(treescrn2, COLOR_WHITE);
394 
395     MvWAddCh(treescrn2, 9, 17, (chtype) '\'');
396     MvWAddCh(treescrn2, 9, 16, (chtype) ':');
397     MvWAddCh(treescrn2, 9, 15, (chtype) '.');
398     MvWAddCh(treescrn2, 9, 14, (chtype) ',');
399     MvWAddCh(treescrn2, 10, 13, (chtype) '\'');
400     MvWAddCh(treescrn2, 10, 12, (chtype) ':');
401     MvWAddCh(treescrn2, 10, 11, (chtype) '.');
402     MvWAddCh(treescrn2, 10, 10, (chtype) ',');
403     MvWAddCh(treescrn2, 11, 9, (chtype) '\'');
404     MvWAddCh(treescrn2, 11, 8, (chtype) ':');
405     MvWAddCh(treescrn2, 11, 7, (chtype) '.');
406     MvWAddCh(treescrn2, 11, 6, (chtype) ',');
407     MvWAddCh(treescrn2, 12, 5, (chtype) '\'');
408 
409     wattroff(treescrn2, A_BOLD | A_BLINK);
410     unset_color(treescrn2);
411 
412     wrefresh(treescrn2);
413     wrefresh(w_del_msg);
414     return (0);
415 }
416 
417 static int
strng5(void)418 strng5(void)
419 {
420     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
421     set_color(treescrn2, COLOR_WHITE);
422 
423     MvWAddCh(treescrn2, 11, 19, (chtype) '\'');
424     MvWAddCh(treescrn2, 11, 18, (chtype) ':');
425     MvWAddCh(treescrn2, 11, 17, (chtype) '.');
426     MvWAddCh(treescrn2, 11, 16, (chtype) ',');
427     MvWAddCh(treescrn2, 12, 15, (chtype) '\'');
428     MvWAddCh(treescrn2, 12, 14, (chtype) ':');
429     MvWAddCh(treescrn2, 12, 13, (chtype) '.');
430     MvWAddCh(treescrn2, 12, 12, (chtype) ',');
431 
432     wattroff(treescrn2, A_BOLD | A_BLINK);
433     unset_color(treescrn2);
434 
435     /* save a fully lit tree */
436     overlay(treescrn2, treescrn);
437 
438     wrefresh(treescrn2);
439     wrefresh(w_del_msg);
440     return (0);
441 }
442 
443 static int
blinkit(void)444 blinkit(void)
445 {
446     static int cycle;
447 
448     if (cycle > 4) {
449 	cycle = 0;
450     }
451 
452     touchwin(treescrn8);
453 
454     switch (cycle) {
455     case 0:
456 	overlay(treescrn3, treescrn8);
457 	break;
458     case 1:
459 	overlay(treescrn4, treescrn8);
460 	break;
461     case 2:
462 	overlay(treescrn5, treescrn8);
463 	break;
464     case 3:
465 	overlay(treescrn6, treescrn8);
466 	break;
467     case 4:
468 	overlay(treescrn7, treescrn8);
469 	break;
470     }
471     touchwin(treescrn8);
472     wrefresh(treescrn8);
473     wrefresh(w_del_msg);
474     look_out(50);
475 
476     /*ALL ON************************************************** */
477 
478     overlay(treescrn, treescrn8);
479     wrefresh(treescrn8);
480     wrefresh(w_del_msg);
481     look_out(50);
482 
483     ++cycle;
484     return (0);
485 }
486 
487 static void
deer_step(WINDOW * win,int y,int x)488 deer_step(WINDOW *win, int y, int x)
489 {
490     mvwin(win, y, x);
491     wrefresh(win);
492     wrefresh(w_del_msg);
493     look_out(5);
494 }
495 
496 static int
reindeer(void)497 reindeer(void)
498 {
499     int looper;
500     y_pos = 0;
501 
502     for (x_pos = 70; x_pos > 62; x_pos--) {
503 	for (looper = 0; looper < 4; looper++) {
504 	    MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '.');
505 	    wrefresh(dotdeer0);
506 	    wrefresh(w_del_msg);
507 	    werase(dotdeer0);
508 	    wrefresh(dotdeer0);
509 	    wrefresh(w_del_msg);
510 	    look_out(50);
511 	}
512     }
513 
514     y_pos = 2;
515 
516     for (; x_pos > 50; x_pos--) {
517 	for (looper = 0; looper < 4; looper++) {
518 
519 	    if (x_pos < 56) {
520 		y_pos = 3;
521 
522 		MvWAddCh(stardeer0, y_pos, x_pos, (chtype) '*');
523 		wrefresh(stardeer0);
524 		wrefresh(w_del_msg);
525 		werase(stardeer0);
526 		wrefresh(stardeer0);
527 		wrefresh(w_del_msg);
528 	    } else {
529 		MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '*');
530 		wrefresh(dotdeer0);
531 		wrefresh(w_del_msg);
532 		werase(dotdeer0);
533 		wrefresh(dotdeer0);
534 		wrefresh(w_del_msg);
535 	    }
536 	}
537     }
538 
539     x_pos = 58;
540 
541     for (y_pos = 2; y_pos < 5; y_pos++) {
542 
543 	touchwin(lildeer0);
544 	wrefresh(lildeer0);
545 	wrefresh(w_del_msg);
546 
547 	for (looper = 0; looper < 4; looper++) {
548 	    deer_step(lildeer3, y_pos, x_pos);
549 	    deer_step(lildeer2, y_pos, x_pos);
550 	    deer_step(lildeer1, y_pos, x_pos);
551 	    deer_step(lildeer2, y_pos, x_pos);
552 	    deer_step(lildeer3, y_pos, x_pos);
553 
554 	    touchwin(lildeer0);
555 	    wrefresh(lildeer0);
556 	    wrefresh(w_del_msg);
557 
558 	    x_pos -= 2;
559 	}
560     }
561 
562     x_pos = 35;
563 
564     for (y_pos = 5; y_pos < 10; y_pos++) {
565 
566 	touchwin(middeer0);
567 	wrefresh(middeer0);
568 	wrefresh(w_del_msg);
569 
570 	for (looper = 0; looper < 2; looper++) {
571 	    deer_step(middeer3, y_pos, x_pos);
572 	    deer_step(middeer2, y_pos, x_pos);
573 	    deer_step(middeer1, y_pos, x_pos);
574 	    deer_step(middeer2, y_pos, x_pos);
575 	    deer_step(middeer3, y_pos, x_pos);
576 
577 	    touchwin(middeer0);
578 	    wrefresh(middeer0);
579 	    wrefresh(w_del_msg);
580 
581 	    x_pos -= 3;
582 	}
583     }
584 
585     look_out(300);
586 
587     y_pos = 1;
588 
589     for (x_pos = 8; x_pos < 16; x_pos++) {
590 	deer_step(bigdeer4, y_pos, x_pos);
591 	deer_step(bigdeer3, y_pos, x_pos);
592 	deer_step(bigdeer2, y_pos, x_pos);
593 	deer_step(bigdeer1, y_pos, x_pos);
594 	deer_step(bigdeer2, y_pos, x_pos);
595 	deer_step(bigdeer3, y_pos, x_pos);
596 	deer_step(bigdeer4, y_pos, x_pos);
597 	deer_step(bigdeer0, y_pos, x_pos);
598     }
599 
600     --x_pos;
601 
602     for (looper = 0; looper < 6; looper++) {
603 	deer_step(lookdeer4, y_pos, x_pos);
604 	deer_step(lookdeer3, y_pos, x_pos);
605 	deer_step(lookdeer2, y_pos, x_pos);
606 	deer_step(lookdeer1, y_pos, x_pos);
607 	deer_step(lookdeer2, y_pos, x_pos);
608 	deer_step(lookdeer3, y_pos, x_pos);
609 	deer_step(lookdeer4, y_pos, x_pos);
610     }
611 
612     deer_step(lookdeer0, y_pos, x_pos);
613 
614     for (; y_pos < 10; y_pos++) {
615 	for (looper = 0; looper < 2; looper++) {
616 	    deer_step(bigdeer4, y_pos, x_pos);
617 	    deer_step(bigdeer3, y_pos, x_pos);
618 	    deer_step(bigdeer2, y_pos, x_pos);
619 	    deer_step(bigdeer1, y_pos, x_pos);
620 	    deer_step(bigdeer2, y_pos, x_pos);
621 	    deer_step(bigdeer3, y_pos, x_pos);
622 	    deer_step(bigdeer4, y_pos, x_pos);
623 	}
624 	deer_step(bigdeer0, y_pos, x_pos);
625     }
626 
627     --y_pos;
628 
629     deer_step(lookdeer3, y_pos, x_pos);
630     return (0);
631 }
632 
633 static void
done(int sig GCC_UNUSED)634 done(int sig GCC_UNUSED)
635 {
636     move(LINES - 1, 0);
637     refresh();
638     stop_curses();
639 
640 #if NO_LEAKS
641     if (my_pairs != 0)
642 	free(my_pairs);
643 #endif
644 
645     ExitProgram(EXIT_SUCCESS);
646 }
647 
648 static void
usage(int ok)649 usage(int ok)
650 {
651     static const char *msg[] =
652     {
653 	"Usage: xmas [options]"
654 	,""
655 	,USAGE_COMMON
656 	,"Options:"
657 #if HAVE_USE_DEFAULT_COLORS
658 	," -d       invoke use_default_colors"
659 #endif
660 	," -q       execute once, then quit"
661     };
662     size_t n;
663 
664     for (n = 0; n < SIZEOF(msg); n++)
665 	fprintf(stderr, "%s\n", msg[n]);
666 
667     ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
668 }
669 /* *INDENT-OFF* */
VERSION_COMMON()670 VERSION_COMMON()
671 /* *INDENT-ON* */
672 
673 int
674 main(int argc, char *argv[])
675 {
676     int ch;
677     int loopy;
678 #if HAVE_USE_DEFAULT_COLORS
679     bool opt_d = FALSE;
680 #endif
681     bool opt_q = FALSE;
682 
683     while ((ch = getopt(argc, argv, OPTS_COMMON "dq")) != -1) {
684 	switch (ch) {
685 #if HAVE_USE_DEFAULT_COLORS
686 	case 'd':
687 	    opt_d = TRUE;
688 	    break;
689 #endif
690 	case 'q':
691 	    opt_q = TRUE;
692 	    break;
693 	case OPTS_VERSION:
694 	    show_version(argv);
695 	    ExitProgram(EXIT_SUCCESS);
696 	default:
697 	    usage(ch == OPTS_USAGE);
698 	    /* NOTREACHED */
699 	}
700     }
701 
702     setlocale(LC_ALL, "");
703 
704     InitAndCatch(initscr(), done);
705     noecho();
706     nonl();
707     refresh();
708 
709     if (has_colors()) {
710 	start_color();
711 #if HAVE_USE_DEFAULT_COLORS
712 	if (opt_d && (use_default_colors() == OK))
713 	    my_bg = -1;
714 #endif
715     }
716     curs_set(0);
717 
718     if ((treescrn = newwin(16, 27, 3, 53)) == 0 ||
719 	(treescrn2 = newwin(16, 27, 3, 53)) == 0 ||
720 	(treescrn3 = newwin(16, 27, 3, 53)) == 0 ||
721 	(treescrn4 = newwin(16, 27, 3, 53)) == 0 ||
722 	(treescrn5 = newwin(16, 27, 3, 53)) == 0 ||
723 	(treescrn6 = newwin(16, 27, 3, 53)) == 0 ||
724 	(treescrn7 = newwin(16, 27, 3, 53)) == 0 ||
725 	(treescrn8 = newwin(16, 27, 3, 53)) == 0 ||
726 
727 	(dotdeer0 = newwin(3, 71, 0, 8)) == 0 ||
728 
729 	(stardeer0 = newwin(4, 56, 0, 8)) == 0 ||
730 
731 	(lildeer0 = newwin(7, 53, 0, 8)) == 0 ||
732 	(lildeer1 = newwin(2, 4, 0, 0)) == 0 ||
733 	(lildeer2 = newwin(2, 4, 0, 0)) == 0 ||
734 	(lildeer3 = newwin(2, 4, 0, 0)) == 0 ||
735 
736 	(middeer0 = newwin(15, 42, 0, 8)) == 0 ||
737 	(middeer1 = newwin(3, 7, 0, 0)) == 0 ||
738 	(middeer2 = newwin(3, 7, 0, 0)) == 0 ||
739 	(middeer3 = newwin(3, 7, 0, 0)) == 0 ||
740 
741 	(bigdeer0 = newwin(10, 23, 0, 0)) == 0 ||
742 	(bigdeer1 = newwin(10, 23, 0, 0)) == 0 ||
743 	(bigdeer2 = newwin(10, 23, 0, 0)) == 0 ||
744 	(bigdeer3 = newwin(10, 23, 0, 0)) == 0 ||
745 	(bigdeer4 = newwin(10, 23, 0, 0)) == 0 ||
746 
747 	(lookdeer0 = newwin(10, 25, 0, 0)) == 0 ||
748 	(lookdeer1 = newwin(10, 25, 0, 0)) == 0 ||
749 	(lookdeer2 = newwin(10, 25, 0, 0)) == 0 ||
750 	(lookdeer3 = newwin(10, 25, 0, 0)) == 0 ||
751 	(lookdeer4 = newwin(10, 25, 0, 0)) == 0 ||
752 
753 	(w_holiday = newwin(1, 26, 3, 27)) == 0 ||
754 
755 	(w_del_msg = newwin(1, 19, 23, 60)) == 0) {
756 	stop_curses();
757 	fprintf(stderr, "Cannot create windows - screen too small\n");
758 	ExitProgram(EXIT_FAILURE);
759     }
760 
761     MvWAddStr(w_del_msg, 0, 0, "Hit any key to quit");
762 
763     MvWAddStr(w_holiday, 0, 0, "H A P P Y  H O L I D A Y S");
764 
765     /* set up the windows for our various reindeer */
766 
767     /* lildeer1 */
768     MvWAddCh(lildeer1, 0, 0, (chtype) 'V');
769     MvWAddCh(lildeer1, 1, 0, (chtype) '@');
770     MvWAddCh(lildeer1, 1, 1, (chtype) '<');
771     MvWAddCh(lildeer1, 1, 2, (chtype) '>');
772     MvWAddCh(lildeer1, 1, 3, (chtype) '~');
773 
774     /* lildeer2 */
775     MvWAddCh(lildeer2, 0, 0, (chtype) 'V');
776     MvWAddCh(lildeer2, 1, 0, (chtype) '@');
777     MvWAddCh(lildeer2, 1, 1, (chtype) '|');
778     MvWAddCh(lildeer2, 1, 2, (chtype) '|');
779     MvWAddCh(lildeer2, 1, 3, (chtype) '~');
780 
781     /* lildeer3 */
782     MvWAddCh(lildeer3, 0, 0, (chtype) 'V');
783     MvWAddCh(lildeer3, 1, 0, (chtype) '@');
784     MvWAddCh(lildeer3, 1, 1, (chtype) '>');
785     MvWAddCh(lildeer3, 1, 2, (chtype) '<');
786     MvWAddCh(lildeer2, 1, 3, (chtype) '~');
787 
788     /* middeer1 */
789     MvWAddCh(middeer1, 0, 2, (chtype) 'y');
790     MvWAddCh(middeer1, 0, 3, (chtype) 'y');
791     MvWAddCh(middeer1, 1, 2, (chtype) '0');
792     MvWAddCh(middeer1, 1, 3, (chtype) '(');
793     MvWAddCh(middeer1, 1, 4, (chtype) '=');
794     MvWAddCh(middeer1, 1, 5, (chtype) ')');
795     MvWAddCh(middeer1, 1, 6, (chtype) '~');
796     MvWAddCh(middeer1, 2, 3, (chtype) '\\');
797     MvWAddCh(middeer1, 2, 4, (chtype) '/');
798 
799     /* middeer2 */
800     MvWAddCh(middeer2, 0, 2, (chtype) 'y');
801     MvWAddCh(middeer2, 0, 3, (chtype) 'y');
802     MvWAddCh(middeer2, 1, 2, (chtype) '0');
803     MvWAddCh(middeer2, 1, 3, (chtype) '(');
804     MvWAddCh(middeer2, 1, 4, (chtype) '=');
805     MvWAddCh(middeer2, 1, 5, (chtype) ')');
806     MvWAddCh(middeer2, 1, 6, (chtype) '~');
807     MvWAddCh(middeer2, 2, 3, (chtype) '|');
808     MvWAddCh(middeer2, 2, 5, (chtype) '|');
809 
810     /* middeer3 */
811     MvWAddCh(middeer3, 0, 2, (chtype) 'y');
812     MvWAddCh(middeer3, 0, 3, (chtype) 'y');
813     MvWAddCh(middeer3, 1, 2, (chtype) '0');
814     MvWAddCh(middeer3, 1, 3, (chtype) '(');
815     MvWAddCh(middeer3, 1, 4, (chtype) '=');
816     MvWAddCh(middeer3, 1, 5, (chtype) ')');
817     MvWAddCh(middeer3, 1, 6, (chtype) '~');
818     MvWAddCh(middeer3, 2, 2, (chtype) '/');
819     MvWAddCh(middeer3, 2, 6, (chtype) '\\');
820 
821     /* bigdeer1 */
822     MvWAddCh(bigdeer1, 0, 17, (chtype) '\\');
823     MvWAddCh(bigdeer1, 0, 18, (chtype) '/');
824     MvWAddCh(bigdeer1, 0, 20, (chtype) '\\');
825     MvWAddCh(bigdeer1, 0, 21, (chtype) '/');
826     MvWAddCh(bigdeer1, 1, 18, (chtype) '\\');
827     MvWAddCh(bigdeer1, 1, 20, (chtype) '/');
828     MvWAddCh(bigdeer1, 2, 19, (chtype) '|');
829     MvWAddCh(bigdeer1, 2, 20, (chtype) '_');
830     MvWAddCh(bigdeer1, 3, 18, (chtype) '/');
831     MvWAddCh(bigdeer1, 3, 19, (chtype) '^');
832     MvWAddCh(bigdeer1, 3, 20, (chtype) '0');
833     MvWAddCh(bigdeer1, 3, 21, (chtype) '\\');
834     MvWAddCh(bigdeer1, 4, 17, (chtype) '/');
835     MvWAddCh(bigdeer1, 4, 18, (chtype) '/');
836     MvWAddCh(bigdeer1, 4, 19, (chtype) '\\');
837     MvWAddCh(bigdeer1, 4, 22, (chtype) '\\');
838     MvWAddStr(bigdeer1, 5, 7, "^~~~~~~~~//  ~~U");
839     MvWAddStr(bigdeer1, 6, 7, "( \\_____( /");
840     MvWAddStr(bigdeer1, 7, 8, "( )    /");
841     MvWAddStr(bigdeer1, 8, 9, "\\\\   /");
842     MvWAddStr(bigdeer1, 9, 11, "\\>/>");
843 
844     /* bigdeer2 */
845     MvWAddCh(bigdeer2, 0, 17, (chtype) '\\');
846     MvWAddCh(bigdeer2, 0, 18, (chtype) '/');
847     MvWAddCh(bigdeer2, 0, 20, (chtype) '\\');
848     MvWAddCh(bigdeer2, 0, 21, (chtype) '/');
849     MvWAddCh(bigdeer2, 1, 18, (chtype) '\\');
850     MvWAddCh(bigdeer2, 1, 20, (chtype) '/');
851     MvWAddCh(bigdeer2, 2, 19, (chtype) '|');
852     MvWAddCh(bigdeer2, 2, 20, (chtype) '_');
853     MvWAddCh(bigdeer2, 3, 18, (chtype) '/');
854     MvWAddCh(bigdeer2, 3, 19, (chtype) '^');
855     MvWAddCh(bigdeer2, 3, 20, (chtype) '0');
856     MvWAddCh(bigdeer2, 3, 21, (chtype) '\\');
857     MvWAddCh(bigdeer2, 4, 17, (chtype) '/');
858     MvWAddCh(bigdeer2, 4, 18, (chtype) '/');
859     MvWAddCh(bigdeer2, 4, 19, (chtype) '\\');
860     MvWAddCh(bigdeer2, 4, 22, (chtype) '\\');
861     MvWAddStr(bigdeer2, 5, 7, "^~~~~~~~~//  ~~U");
862     MvWAddStr(bigdeer2, 6, 7, "(( )____( /");
863     MvWAddStr(bigdeer2, 7, 7, "( /      |");
864     MvWAddStr(bigdeer2, 8, 8, "\\/      |");
865     MvWAddStr(bigdeer2, 9, 9, "|>     |>");
866 
867     /* bigdeer3 */
868     MvWAddCh(bigdeer3, 0, 17, (chtype) '\\');
869     MvWAddCh(bigdeer3, 0, 18, (chtype) '/');
870     MvWAddCh(bigdeer3, 0, 20, (chtype) '\\');
871     MvWAddCh(bigdeer3, 0, 21, (chtype) '/');
872     MvWAddCh(bigdeer3, 1, 18, (chtype) '\\');
873     MvWAddCh(bigdeer3, 1, 20, (chtype) '/');
874     MvWAddCh(bigdeer3, 2, 19, (chtype) '|');
875     MvWAddCh(bigdeer3, 2, 20, (chtype) '_');
876     MvWAddCh(bigdeer3, 3, 18, (chtype) '/');
877     MvWAddCh(bigdeer3, 3, 19, (chtype) '^');
878     MvWAddCh(bigdeer3, 3, 20, (chtype) '0');
879     MvWAddCh(bigdeer3, 3, 21, (chtype) '\\');
880     MvWAddCh(bigdeer3, 4, 17, (chtype) '/');
881     MvWAddCh(bigdeer3, 4, 18, (chtype) '/');
882     MvWAddCh(bigdeer3, 4, 19, (chtype) '\\');
883     MvWAddCh(bigdeer3, 4, 22, (chtype) '\\');
884     MvWAddStr(bigdeer3, 5, 7, "^~~~~~~~~//  ~~U");
885     MvWAddStr(bigdeer3, 6, 6, "( ()_____( /");
886     MvWAddStr(bigdeer3, 7, 6, "/ /       /");
887     MvWAddStr(bigdeer3, 8, 5, "|/          \\");
888     MvWAddStr(bigdeer3, 9, 5, "/>           \\>");
889 
890     /* bigdeer4 */
891     MvWAddCh(bigdeer4, 0, 17, (chtype) '\\');
892     MvWAddCh(bigdeer4, 0, 18, (chtype) '/');
893     MvWAddCh(bigdeer4, 0, 20, (chtype) '\\');
894     MvWAddCh(bigdeer4, 0, 21, (chtype) '/');
895     MvWAddCh(bigdeer4, 1, 18, (chtype) '\\');
896     MvWAddCh(bigdeer4, 1, 20, (chtype) '/');
897     MvWAddCh(bigdeer4, 2, 19, (chtype) '|');
898     MvWAddCh(bigdeer4, 2, 20, (chtype) '_');
899     MvWAddCh(bigdeer4, 3, 18, (chtype) '/');
900     MvWAddCh(bigdeer4, 3, 19, (chtype) '^');
901     MvWAddCh(bigdeer4, 3, 20, (chtype) '0');
902     MvWAddCh(bigdeer4, 3, 21, (chtype) '\\');
903     MvWAddCh(bigdeer4, 4, 17, (chtype) '/');
904     MvWAddCh(bigdeer4, 4, 18, (chtype) '/');
905     MvWAddCh(bigdeer4, 4, 19, (chtype) '\\');
906     MvWAddCh(bigdeer4, 4, 22, (chtype) '\\');
907     MvWAddStr(bigdeer4, 5, 7, "^~~~~~~~~//  ~~U");
908     MvWAddStr(bigdeer4, 6, 6, "( )______( /");
909     MvWAddStr(bigdeer4, 7, 5, "(/          \\");
910     MvWAddStr(bigdeer4, 8, 0, "v___=             ----^");
911 
912     /* lookdeer1 */
913     MvWAddStr(lookdeer1, 0, 16, "\\/     \\/");
914     MvWAddStr(lookdeer1, 1, 17, "\\Y/ \\Y/");
915     MvWAddStr(lookdeer1, 2, 19, "\\=/");
916     MvWAddStr(lookdeer1, 3, 17, "^\\o o/^");
917     MvWAddStr(lookdeer1, 4, 17, "//( )");
918     MvWAddStr(lookdeer1, 5, 7, "^~~~~~~~~// \\O/");
919     MvWAddStr(lookdeer1, 6, 7, "( \\_____( /");
920     MvWAddStr(lookdeer1, 7, 8, "( )    /");
921     MvWAddStr(lookdeer1, 8, 9, "\\\\   /");
922     MvWAddStr(lookdeer1, 9, 11, "\\>/>");
923 
924     /* lookdeer2 */
925     MvWAddStr(lookdeer2, 0, 16, "\\/     \\/");
926     MvWAddStr(lookdeer2, 1, 17, "\\Y/ \\Y/");
927     MvWAddStr(lookdeer2, 2, 19, "\\=/");
928     MvWAddStr(lookdeer2, 3, 17, "^\\o o/^");
929     MvWAddStr(lookdeer2, 4, 17, "//( )");
930     MvWAddStr(lookdeer2, 5, 7, "^~~~~~~~~// \\O/");
931     MvWAddStr(lookdeer2, 6, 7, "(( )____( /");
932     MvWAddStr(lookdeer2, 7, 7, "( /      |");
933     MvWAddStr(lookdeer2, 8, 8, "\\/      |");
934     MvWAddStr(lookdeer2, 9, 9, "|>     |>");
935 
936     /* lookdeer3 */
937     MvWAddStr(lookdeer3, 0, 16, "\\/     \\/");
938     MvWAddStr(lookdeer3, 1, 17, "\\Y/ \\Y/");
939     MvWAddStr(lookdeer3, 2, 19, "\\=/");
940     MvWAddStr(lookdeer3, 3, 17, "^\\o o/^");
941     MvWAddStr(lookdeer3, 4, 17, "//( )");
942     MvWAddStr(lookdeer3, 5, 7, "^~~~~~~~~// \\O/");
943     MvWAddStr(lookdeer3, 6, 6, "( ()_____( /");
944     MvWAddStr(lookdeer3, 7, 6, "/ /       /");
945     MvWAddStr(lookdeer3, 8, 5, "|/          \\");
946     MvWAddStr(lookdeer3, 9, 5, "/>           \\>");
947 
948     /* lookdeer4 */
949     MvWAddStr(lookdeer4, 0, 16, "\\/     \\/");
950     MvWAddStr(lookdeer4, 1, 17, "\\Y/ \\Y/");
951     MvWAddStr(lookdeer4, 2, 19, "\\=/");
952     MvWAddStr(lookdeer4, 3, 17, "^\\o o/^");
953     MvWAddStr(lookdeer4, 4, 17, "//( )");
954     MvWAddStr(lookdeer4, 5, 7, "^~~~~~~~~// \\O/");
955     MvWAddStr(lookdeer4, 6, 6, "( )______( /");
956     MvWAddStr(lookdeer4, 7, 5, "(/          \\");
957     MvWAddStr(lookdeer4, 8, 0, "v___=             ----^");
958 
959 	/***********************************************/
960     cbreak();
961     nodelay(stdscr, TRUE);
962     do {
963 	clear();
964 	werase(treescrn);
965 	touchwin(w_del_msg);
966 	touchwin(treescrn);
967 	werase(treescrn2);
968 	touchwin(treescrn2);
969 	werase(treescrn8);
970 	touchwin(treescrn8);
971 	refresh();
972 	look_out(150);
973 	boxit();
974 	refresh();
975 	look_out(150);
976 	seas();
977 	refresh();
978 	look_out(150);
979 	greet();
980 	refresh();
981 	look_out(150);
982 	fromwho();
983 	refresh();
984 	look_out(150);
985 	tree();
986 	look_out(150);
987 	balls();
988 	look_out(150);
989 	star();
990 	look_out(150);
991 	strng1();
992 	strng2();
993 	strng3();
994 	strng4();
995 	strng5();
996 
997 	/* set up the windows for our blinking trees */
998 	/* **************************************** */
999 	/* treescrn3 */
1000 
1001 	overlay(treescrn, treescrn3);
1002 
1003 	/*balls */
1004 	MvWAddCh(treescrn3, 4, 18, ' ');
1005 	MvWAddCh(treescrn3, 7, 6, ' ');
1006 	MvWAddCh(treescrn3, 8, 19, ' ');
1007 	MvWAddCh(treescrn3, 11, 22, ' ');
1008 
1009 	/*star */
1010 	MvWAddCh(treescrn3, 0, 12, '*');
1011 
1012 	/*strng1 */
1013 	MvWAddCh(treescrn3, 3, 11, ' ');
1014 
1015 	/*strng2 */
1016 	MvWAddCh(treescrn3, 5, 13, ' ');
1017 	MvWAddCh(treescrn3, 6, 10, ' ');
1018 
1019 	/*strng3 */
1020 	MvWAddCh(treescrn3, 7, 16, ' ');
1021 	MvWAddCh(treescrn3, 7, 14, ' ');
1022 
1023 	/*strng4 */
1024 	MvWAddCh(treescrn3, 10, 13, ' ');
1025 	MvWAddCh(treescrn3, 10, 10, ' ');
1026 	MvWAddCh(treescrn3, 11, 8, ' ');
1027 
1028 	/*strng5 */
1029 	MvWAddCh(treescrn3, 11, 18, ' ');
1030 	MvWAddCh(treescrn3, 12, 13, ' ');
1031 
1032 	/* treescrn4 */
1033 
1034 	overlay(treescrn, treescrn4);
1035 
1036 	/*balls */
1037 	MvWAddCh(treescrn4, 3, 9, ' ');
1038 	MvWAddCh(treescrn4, 4, 16, ' ');
1039 	MvWAddCh(treescrn4, 7, 6, ' ');
1040 	MvWAddCh(treescrn4, 8, 19, ' ');
1041 	MvWAddCh(treescrn4, 11, 2, ' ');
1042 	MvWAddCh(treescrn4, 12, 23, ' ');
1043 
1044 	/*star */
1045 	(void) wstandout(treescrn4);
1046 	MvWAddCh(treescrn4, 0, 12, '*');
1047 	(void) wstandend(treescrn4);
1048 
1049 	/*strng1 */
1050 	MvWAddCh(treescrn4, 3, 13, ' ');
1051 
1052 	/*strng2 */
1053 
1054 	/*strng3 */
1055 	MvWAddCh(treescrn4, 7, 15, ' ');
1056 	MvWAddCh(treescrn4, 8, 11, ' ');
1057 
1058 	/*strng4 */
1059 	MvWAddCh(treescrn4, 9, 16, ' ');
1060 	MvWAddCh(treescrn4, 10, 12, ' ');
1061 	MvWAddCh(treescrn4, 11, 8, ' ');
1062 
1063 	/*strng5 */
1064 	MvWAddCh(treescrn4, 11, 18, ' ');
1065 	MvWAddCh(treescrn4, 12, 14, ' ');
1066 
1067 	/* treescrn5 */
1068 
1069 	overlay(treescrn, treescrn5);
1070 
1071 	/*balls */
1072 	MvWAddCh(treescrn5, 3, 15, ' ');
1073 	MvWAddCh(treescrn5, 10, 20, ' ');
1074 	MvWAddCh(treescrn5, 12, 1, ' ');
1075 
1076 	/*star */
1077 	MvWAddCh(treescrn5, 0, 12, '*');
1078 
1079 	/*strng1 */
1080 	MvWAddCh(treescrn5, 3, 11, ' ');
1081 
1082 	/*strng2 */
1083 	MvWAddCh(treescrn5, 5, 12, ' ');
1084 
1085 	/*strng3 */
1086 	MvWAddCh(treescrn5, 7, 14, ' ');
1087 	MvWAddCh(treescrn5, 8, 10, ' ');
1088 
1089 	/*strng4 */
1090 	MvWAddCh(treescrn5, 9, 15, ' ');
1091 	MvWAddCh(treescrn5, 10, 11, ' ');
1092 	MvWAddCh(treescrn5, 11, 7, ' ');
1093 
1094 	/*strng5 */
1095 	MvWAddCh(treescrn5, 11, 17, ' ');
1096 	MvWAddCh(treescrn5, 12, 13, ' ');
1097 
1098 	/* treescrn6 */
1099 
1100 	overlay(treescrn, treescrn6);
1101 
1102 	/*balls */
1103 	MvWAddCh(treescrn6, 6, 7, ' ');
1104 	MvWAddCh(treescrn6, 7, 18, ' ');
1105 	MvWAddCh(treescrn6, 10, 4, ' ');
1106 	MvWAddCh(treescrn6, 11, 23, ' ');
1107 
1108 	/*star */
1109 	(void) wstandout(treescrn6);
1110 	MvWAddCh(treescrn6, 0, 12, '*');
1111 	(void) wstandend(treescrn6);
1112 
1113 	/*strng1 */
1114 
1115 	/*strng2 */
1116 	MvWAddCh(treescrn6, 5, 11, ' ');
1117 
1118 	/*strng3 */
1119 	MvWAddCh(treescrn6, 7, 13, ' ');
1120 	MvWAddCh(treescrn6, 8, 9, ' ');
1121 
1122 	/*strng4 */
1123 	MvWAddCh(treescrn6, 9, 14, ' ');
1124 	MvWAddCh(treescrn6, 10, 10, ' ');
1125 	MvWAddCh(treescrn6, 11, 6, ' ');
1126 
1127 	/*strng5 */
1128 	MvWAddCh(treescrn6, 11, 16, ' ');
1129 	MvWAddCh(treescrn6, 12, 12, ' ');
1130 
1131 	/* treescrn7 */
1132 
1133 	overlay(treescrn, treescrn7);
1134 
1135 	/*balls */
1136 	MvWAddCh(treescrn7, 3, 15, ' ');
1137 	MvWAddCh(treescrn7, 6, 7, ' ');
1138 	MvWAddCh(treescrn7, 7, 18, ' ');
1139 	MvWAddCh(treescrn7, 10, 4, ' ');
1140 	MvWAddCh(treescrn7, 11, 22, ' ');
1141 
1142 	/*star */
1143 	MvWAddCh(treescrn7, 0, 12, '*');
1144 
1145 	/*strng1 */
1146 	MvWAddCh(treescrn7, 3, 12, ' ');
1147 
1148 	/*strng2 */
1149 	MvWAddCh(treescrn7, 5, 13, ' ');
1150 	MvWAddCh(treescrn7, 6, 9, ' ');
1151 
1152 	/*strng3 */
1153 	MvWAddCh(treescrn7, 7, 15, ' ');
1154 	MvWAddCh(treescrn7, 8, 11, ' ');
1155 
1156 	/*strng4 */
1157 	MvWAddCh(treescrn7, 9, 16, ' ');
1158 	MvWAddCh(treescrn7, 10, 12, ' ');
1159 	MvWAddCh(treescrn7, 11, 8, ' ');
1160 
1161 	/*strng5 */
1162 	MvWAddCh(treescrn7, 11, 18, ' ');
1163 	MvWAddCh(treescrn7, 12, 14, ' ');
1164 
1165 	look_out(150);
1166 	reindeer();
1167 
1168 	touchwin(w_holiday);
1169 	wrefresh(w_holiday);
1170 	wrefresh(w_del_msg);
1171 
1172 	look_out(500);
1173 	for (loopy = 0; loopy < 100; loopy++) {
1174 	    blinkit();
1175 	}
1176     } while (!opt_q);
1177     done(0);
1178 }
1179