blob: 9ba3a26c02e0e1bd0b9bbf6e458b7c8437a6ec19 [file] [log] [blame]
Steve Kondikae271bc2015-11-15 02:50:53 +01001/******************************************************************************/
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/*
micky3879b9f5e72025-07-08 18:04:53 -040095 * $Id: xmas.c,v 1.39 2022/12/04 00:40:11 tom Exp $
Steve Kondikae271bc2015-11-15 02:50:53 +010096 */
97#include <test.priv.h>
98
99#define FROMWHO "Mark Hessling - (M.Hessling@gu.edu.au)"
100
101static int my_bg = COLOR_BLACK;
102static int y_pos, x_pos;
103
104static WINDOW *treescrn;
105static WINDOW *treescrn2;
106static WINDOW *treescrn3;
107static WINDOW *treescrn4;
108static WINDOW *treescrn5;
109static WINDOW *treescrn6;
110static WINDOW *treescrn7;
111static WINDOW *treescrn8;
112static WINDOW *dotdeer0;
113static WINDOW *stardeer0;
114static WINDOW *lildeer0;
115static WINDOW *lildeer1;
116static WINDOW *lildeer2;
117static WINDOW *lildeer3;
118static WINDOW *middeer0;
119static WINDOW *middeer1;
120static WINDOW *middeer2;
121static WINDOW *middeer3;
122static WINDOW *bigdeer0;
123static WINDOW *bigdeer1;
124static WINDOW *bigdeer2;
125static WINDOW *bigdeer3;
126static WINDOW *bigdeer4;
127static WINDOW *lookdeer0;
128static WINDOW *lookdeer1;
129static WINDOW *lookdeer2;
130static WINDOW *lookdeer3;
131static WINDOW *lookdeer4;
132static WINDOW *w_holiday;
133static WINDOW *w_del_msg;
134static bool *my_pairs;
135
micky3879b9f5e72025-07-08 18:04:53 -0400136static GCC_NORETURN void done(int sig);
Steve Kondikae271bc2015-11-15 02:50:53 +0100137
138static void
139set_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
154static void
155unset_color(WINDOW *win)
156{
157 if (has_colors())
158 (void) wattrset(win, COLOR_PAIR(0));
159}
160
161static void
162look_out(int msecs)
163{
164 napms(msecs);
165 if (getch() != ERR) {
166 beep();
167 done(0);
168 }
169}
170
Steve Kondikae271bc2015-11-15 02:50:53 +0100171static int
172boxit(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
198static int
199seas(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
213static int
214greet(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
229static int
230fromwho(void)
231{
232 MvAddStr(21, 13, FROMWHO);
233 return (0);
234}
235
236static int
237tree(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
283static int
284balls(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
312static int
313star(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
327static int
328strng1(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
345static int
346strng2(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
366static int
367strng3(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
389static int
390strng4(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
417static int
418strng5(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
443static int
444blinkit(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);
Steve Kondikae271bc2015-11-15 02:50:53 +0100457 break;
458 case 1:
459 overlay(treescrn4, treescrn8);
Steve Kondikae271bc2015-11-15 02:50:53 +0100460 break;
461 case 2:
462 overlay(treescrn5, treescrn8);
Steve Kondikae271bc2015-11-15 02:50:53 +0100463 break;
464 case 3:
465 overlay(treescrn6, treescrn8);
Steve Kondikae271bc2015-11-15 02:50:53 +0100466 break;
467 case 4:
468 overlay(treescrn7, treescrn8);
Steve Kondikae271bc2015-11-15 02:50:53 +0100469 break;
470 }
471 touchwin(treescrn8);
micky3879b9f5e72025-07-08 18:04:53 -0400472 wrefresh(treescrn8);
473 wrefresh(w_del_msg);
474 look_out(50);
Steve Kondikae271bc2015-11-15 02:50:53 +0100475
476 /*ALL ON************************************************** */
477
478 overlay(treescrn, treescrn8);
479 wrefresh(treescrn8);
480 wrefresh(w_del_msg);
micky3879b9f5e72025-07-08 18:04:53 -0400481 look_out(50);
Steve Kondikae271bc2015-11-15 02:50:53 +0100482
483 ++cycle;
484 return (0);
485}
486
487static void
488deer_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
496static int
497reindeer(void)
498{
499 int looper;
500 y_pos = 0;
501
502 for (x_pos = 70; x_pos > 62; x_pos--) {
Steve Kondikae271bc2015-11-15 02:50:53 +0100503 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
633static void
634done(int sig GCC_UNUSED)
635{
Steve Kondikae271bc2015-11-15 02:50:53 +0100636 move(LINES - 1, 0);
637 refresh();
micky3879b9f5e72025-07-08 18:04:53 -0400638 stop_curses();
Steve Kondikae271bc2015-11-15 02:50:53 +0100639
640#if NO_LEAKS
641 if (my_pairs != 0)
642 free(my_pairs);
643#endif
644
645 ExitProgram(EXIT_SUCCESS);
646}
micky3879b9f5e72025-07-08 18:04:53 -0400647
648static void
649usage(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* */
670VERSION_COMMON()
671/* *INDENT-ON* */
672
673int
674main(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}