1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-10 06:47:55 -08:00

From FreeBSD.

This commit is contained in:
downsj 1996-08-21 07:58:07 +00:00
parent 3a28d38070
commit 4acc410cbf
3 changed files with 235 additions and 0 deletions

9
games/grdc/Makefile Normal file
View File

@ -0,0 +1,9 @@
# $OpenBSD: Makefile,v 1.1 1996/08/21 07:58:07 downsj Exp $
# $FreeBSD: Makefile,v 1.1.1.1 1994/12/04 21:51:19 ache Exp $
PROG= grdc
MAN= grdc.6
DPADD= ${LIBCURSES} ${LIBTERMLIB}
LDADD= -lcurses -ltermlib
.include <bsd.prog.mk>

23
games/grdc/grdc.6 Normal file
View File

@ -0,0 +1,23 @@
.\" $OpenBSD: grdc.6,v 1.1 1996/08/21 07:58:08 downsj Exp $
.TH GRDC 6
.SH NAME
grdc \- grand digital clock (curses)
.SH SYNOPSIS
.B grdc
[-s] [
.I n
]
.SH DESCRIPTION
.I Grdc
runs a digital clock made of reverse-video blanks on a curses
compatible VDU screen. With an optional numeric argument
.I n
it stops after
.I n
seconds (default never).
The optional
.B -s
flag makes digits scroll as they change. In this curses mode implementation,
the scrolling option has trouble keeping up.
.SH AUTHOR
Amos Shapir, modified for curses by John Lupien.

203
games/grdc/grdc.c Normal file
View File

@ -0,0 +1,203 @@
/* $OpenBSD: grdc.c,v 1.1 1996/08/21 07:58:08 downsj Exp $ */
/*
* Grand digital clock for curses compatible terminals
* Usage: grdc [-s] [n] -- run for n seconds (default infinity)
* Flags: -s: scroll
*
* modified 10-18-89 for curses (jrl)
* 10-18-89 added signal handling
*/
#include <time.h>
#include <signal.h>
#include <curses.h>
#include <stdlib.h>
#ifndef NONPOSIX
#include <unistd.h>
#endif
#define YBASE 10
#define XBASE 10
#define XLENGTH 58
#define YDEPTH 7
/* it won't be */
long now; /* yeah! */
struct tm *tm;
short disp[11] = {
075557, 011111, 071747, 071717, 055711,
074717, 074757, 071111, 075757, 075717, 002020
};
long old[6], next[6], new[6], mask;
char scrol;
int sigtermed=0;
int hascolor = 0;
void set(int, int);
void standt(int);
void movto(int, int);
void sighndl(signo)
int signo;
{
sigtermed=signo;
}
int
main(argc, argv)
int argc;
char **argv;
{
long t, a;
int i, j, s, k;
int n = 0;
initscr();
signal(SIGINT,sighndl);
signal(SIGTERM,sighndl);
signal(SIGHUP,sighndl);
cbreak();
noecho();
hascolor = has_colors();
if(hascolor) {
start_color();
init_pair(1, COLOR_BLACK, COLOR_RED);
init_pair(2, COLOR_RED, COLOR_BLACK);
init_pair(3, COLOR_WHITE, COLOR_BLACK);
attrset(COLOR_PAIR(2));
}
clear();
refresh();
while(--argc > 0) {
if(**++argv == '-')
scrol = 1;
else
n = atoi(*argv);
}
if(hascolor) {
attrset(COLOR_PAIR(3));
mvaddch(YBASE - 2, XBASE - 3, ACS_ULCORNER);
hline(ACS_HLINE, XLENGTH);
mvaddch(YBASE - 2, XBASE - 2 + XLENGTH, ACS_URCORNER);
mvaddch(YBASE + YDEPTH - 1, XBASE - 3, ACS_LLCORNER);
hline(ACS_HLINE, XLENGTH);
mvaddch(YBASE + YDEPTH - 1, XBASE - 2 + XLENGTH, ACS_LRCORNER);
move(YBASE - 1, XBASE - 3);
vline(ACS_VLINE, YDEPTH);
move(YBASE - 1, XBASE - 2 + XLENGTH);
vline(ACS_VLINE, YDEPTH);
attrset(COLOR_PAIR(2));
}
do {
mask = 0;
time(&now);
tm = localtime(&now);
set(tm->tm_sec%10, 0);
set(tm->tm_sec/10, 4);
set(tm->tm_min%10, 10);
set(tm->tm_min/10, 14);
set(tm->tm_hour%10, 20);
set(tm->tm_hour/10, 24);
set(10, 7);
set(10, 17);
for(k=0; k<6; k++) {
if(scrol) {
for(i=0; i<5; i++)
new[i] = (new[i]&~mask) | (new[i+1]&mask);
new[5] = (new[5]&~mask) | (next[k]&mask);
} else
new[k] = (new[k]&~mask) | (next[k]&mask);
next[k] = 0;
for(s=1; s>=0; s--) {
standt(s);
for(i=0; i<6; i++) {
if((a = (new[i]^old[i])&(s ? new : old)[i]) != 0) {
for(j=0,t=1<<26; t; t>>=1,j++) {
if(a&t) {
if(!(a&(t<<1))) {
movto(YBASE + i, XBASE + 2*j);
}
addstr(" ");
}
}
}
if(!s) {
old[i] = new[i];
}
}
if(!s) {
refresh();
}
}
}
movto(6, 0);
refresh();
sleep(1);
if (sigtermed) {
standend();
clear();
refresh();
endwin();
fprintf(stderr, "grdc terminated by signal %d\n", sigtermed);
exit(1);
}
} while(--n);
standend();
clear();
refresh();
endwin();
return(0);
}
void
set(int t, int n)
{
int i, m;
m = 7<<n;
for(i=0; i<5; i++) {
next[i] |= ((disp[t]>>(4-i)*3)&07)<<n;
mask |= (next[i]^old[i])&m;
}
if(mask&m)
mask |= m;
}
void
standt(int on)
{
if (on) {
if(hascolor) {
attron(COLOR_PAIR(1));
} else {
attron(A_STANDOUT);
}
} else {
if(hascolor) {
attron(COLOR_PAIR(2));
} else {
attroff(A_STANDOUT);
}
}
}
void
movto(int line, int col)
{
move(line, col);
}