Style(9) cleanup.
[dragonfly.git] / games / grdc / grdc.c
CommitLineData
984263bc
MD
1/*
2 * Grand digital clock for curses compatible terminals
3 * Usage: grdc [-s] [n] -- run for n seconds (default infinity)
4 * Flags: -s: scroll
5 *
6 * modified 10-18-89 for curses (jrl)
7 * 10-18-89 added signal handling
8 *
9 * $FreeBSD: src/games/grdc/grdc.c,v 1.8.2.1 2001/10/02 11:51:49 ru Exp $
9aeb24d3 10 * $DragonFly: src/games/grdc/grdc.c,v 1.3 2004/03/23 18:34:41 cpressey Exp $
984263bc
MD
11 */
12
13#include <err.h>
14#include <time.h>
15#include <signal.h>
16#include <ncurses.h>
17#include <stdlib.h>
18#ifndef NONPOSIX
19#include <unistd.h>
20#endif
21
22#define YBASE 10
23#define XBASE 10
24#define XLENGTH 58
25#define YDEPTH 7
26
9aeb24d3 27time_t now;
984263bc
MD
28struct tm *tm;
29
30short disp[11] = {
31 075557, 011111, 071747, 071717, 055711,
32 074717, 074757, 071111, 075757, 075717, 002020
33};
34long old[6], next[6], new[6], mask;
35
36volatile sig_atomic_t sigtermed;
37
38int hascolor = 0;
39
9aeb24d3
CP
40static void set(int, int);
41static void standt(int);
42static void sighndl(int);
43static void usage(void);
44static void draw_row(int, int);
984263bc 45
9aeb24d3 46void sighndl(int signo)
984263bc 47{
9aeb24d3 48 sigtermed = signo;
984263bc
MD
49}
50
51int
9aeb24d3 52main(int argc, char **argv)
984263bc 53{
9aeb24d3
CP
54 int i, s, k;
55 int n;
56 int ch;
57 int scrol;
984263bc
MD
58
59 scrol = 0;
60
61 while ((ch = getopt(argc, argv, "s")) != -1)
9aeb24d3
CP
62 switch (ch) {
63 case 's':
64 scrol = 1;
65 break;
66 case '?':
67 default:
68 usage();
69 /* NOTREACHED */
70 }
984263bc
MD
71 argc -= optind;
72 argv += optind;
73
74 if (argc > 1) {
75 usage();
76 /* NOTREACHED */
77 }
78
79 if (argc > 0)
80 n = atoi(*argv);
81 else
82 n = 0;
83
84 initscr();
85
9aeb24d3
CP
86 signal(SIGINT, sighndl);
87 signal(SIGTERM, sighndl);
88 signal(SIGHUP, sighndl);
984263bc
MD
89
90 cbreak();
91 noecho();
92 curs_set(0);
93
94 hascolor = has_colors();
95
9aeb24d3 96 if (hascolor) {
984263bc
MD
97 start_color();
98 init_pair(1, COLOR_BLACK, COLOR_RED);
99 init_pair(2, COLOR_RED, COLOR_BLACK);
100 init_pair(3, COLOR_WHITE, COLOR_BLACK);
101 attrset(COLOR_PAIR(2));
102 }
103
104 clear();
105 refresh();
106
9aeb24d3 107 if (hascolor) {
984263bc
MD
108 attrset(COLOR_PAIR(3));
109
9aeb24d3 110 mvaddch(YBASE - 2, XBASE - 3, ACS_ULCORNER);
984263bc 111 hline(ACS_HLINE, XLENGTH);
9aeb24d3 112 mvaddch(YBASE - 2, XBASE - 2 + XLENGTH, ACS_URCORNER);
984263bc 113
9aeb24d3 114 mvaddch(YBASE + YDEPTH - 1, XBASE - 3, ACS_LLCORNER);
984263bc 115 hline(ACS_HLINE, XLENGTH);
9aeb24d3 116 mvaddch(YBASE + YDEPTH - 1, XBASE - 2 + XLENGTH, ACS_LRCORNER);
984263bc 117
9aeb24d3 118 move(YBASE - 1, XBASE - 3);
984263bc
MD
119 vline(ACS_VLINE, YDEPTH);
120
9aeb24d3 121 move(YBASE - 1, XBASE - 2 + XLENGTH);
984263bc
MD
122 vline(ACS_VLINE, YDEPTH);
123
124 attrset(COLOR_PAIR(2));
125 }
126 do {
127 mask = 0;
128 time(&now);
129 tm = localtime(&now);
9aeb24d3
CP
130 set(tm->tm_sec % 10, 0);
131 set(tm->tm_sec / 10, 4);
132 set(tm->tm_min % 10, 10);
133 set(tm->tm_min / 10, 14);
134 set(tm->tm_hour % 10, 20);
135 set(tm->tm_hour / 10, 24);
984263bc
MD
136 set(10, 7);
137 set(10, 17);
9aeb24d3
CP
138 for(k = 0; k < 6; k++) {
139 if (scrol) {
140 for(i = 0; i < 5; i++)
141 new[i] = (new[i] & ~mask) |
142 (new[i+1] & mask);
143 new[5] = (new[5] & ~mask) | (next[k] & mask);
984263bc 144 } else
9aeb24d3 145 new[k] = (new[k] & ~mask) | (next[k] & mask);
984263bc 146 next[k] = 0;
9aeb24d3 147 for (s = 1; s >= 0; s--) {
984263bc 148 standt(s);
9aeb24d3
CP
149 for (i = 0; i < 6; i++) {
150 draw_row(i, s);
984263bc 151 }
9aeb24d3 152 if (!s) {
984263bc
MD
153 refresh();
154 }
155 }
156 }
9aeb24d3 157 move(6, 0);
984263bc
MD
158 refresh();
159 sleep(1);
160 if (sigtermed) {
161 standend();
162 clear();
163 refresh();
164 endwin();
165 errx(1, "terminated by signal %d", (int)sigtermed);
166 }
167 } while(--n);
168 standend();
169 clear();
170 refresh();
171 endwin();
172 return(0);
173}
174
9aeb24d3
CP
175void
176draw_row(int i, int s)
177{
178 long a, t;
179 int j;
180
181 if ((a = (new[i] ^ old[i]) & (s ? new : old)[i]) != 0) {
182 for (j = 0, t = 1 << 26; t; t >>= 1, j++) {
183 if (a & t) {
184 if (!(a & (t << 1))) {
185 move(YBASE + i, XBASE + 2 * j);
186 }
187 addstr(" ");
188 }
189 }
190 }
191 if (!s) {
192 old[i] = new[i];
193 }
194}
195
984263bc
MD
196void
197set(int t, int n)
198{
9aeb24d3 199 int i, m;
984263bc 200
9aeb24d3
CP
201 m = 7 << n;
202 for (i = 0; i < 5; i++) {
203 next[i] |= ((disp[t] >> (4 - i) * 3) & 07) << n;
204 mask |= (next[i] ^ old[i]) & m;
984263bc 205 }
9aeb24d3 206 if (mask & m)
984263bc
MD
207 mask |= m;
208}
209
210void
211standt(int on)
212{
213 if (on) {
9aeb24d3 214 if (hascolor) {
984263bc
MD
215 attron(COLOR_PAIR(1));
216 } else {
217 attron(A_STANDOUT);
218 }
219 } else {
9aeb24d3 220 if (hascolor) {
984263bc
MD
221 attron(COLOR_PAIR(2));
222 } else {
223 attroff(A_STANDOUT);
224 }
225 }
226}
227
984263bc
MD
228void
229usage(void)
230{
9aeb24d3 231 fprintf(stderr, "usage: grdc [-s] [n]\n");
984263bc
MD
232 exit(1);
233}