diff options
Diffstat (limited to '')
| -rw-r--r-- | mongoclock.1 | 52 | ||||
| -rw-r--r-- | mongoclock.c | 290 | 
2 files changed, 0 insertions, 342 deletions
| diff --git a/mongoclock.1 b/mongoclock.1 deleted file mode 100644 index 46131ff..0000000 --- a/mongoclock.1 +++ /dev/null @@ -1,52 +0,0 @@ -.TH MONGOCLOCK 1 MONGOCLOCK -.SH NAME -mongoclock - Just a humongous clock for the terminal -.SH SYNOPSIS -.BR mongoclock -.SH DESCRIPTION -Type -.BR mongoclock -in the terminal and it will either, depending on -the terminal size, show the time \fIHH:MM\fP or -\fIHH:MM:SS\fP with humongous digits. -.PP -If the terminal is too small, it will not run. -.PP -.BR mongoclock -is designed to be fit on most screens and be -readable from all practical distances, so that -it can be used in place of a standard wall- or -alarm-clock. If the font is not big enough for -your (or if it is too large,) just change the -font size on your terminal. If it is not the -right colour for you, simply change the font -colour on your terminal -.SH OPTIONS -The -.B cp -utility shall conform to the Base Definitions -volume of POSIX.1-2008, -.IR "Section 12.2, Utility Syntax Guidelines" . -.PP -The following options shall be supported: -.TP -.B -s -Display the posix time (seconds since 1970-01-01 -00:00:00 UTC, ignoring inserted and removed leap -seconds). -.SH RATIONALE -It is really nice to have a large clock on your -computer, instead of a small clock somewhere in -your room, when your are sleeping. It is also -nice to have a glansable clock available on your -netbook for when you need to keep track of the -time but are not working on a computer. -Pocket-watches are just too much work to getting -up, opening, closing, and putting down, and you -would not like to forget it when you leave if -you are in a public place. -.SH "SEE ALSO" -.BR watch (1) -.SH AUTHORS -Mattias Andrée -.RI < maandree@kth.se > diff --git a/mongoclock.c b/mongoclock.c deleted file mode 100644 index b98cc67..0000000 --- a/mongoclock.c +++ /dev/null @@ -1,290 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include <sys/ioctl.h> -#include <sys/timerfd.h> -#include <errno.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#ifdef USE_ADJTIMEX -# include <sys/timex.h> -#endif - -#include "arg.h" - -#define DX 16 -#define DY 12 -#define DC 16 - -#include "mongo_0.h" -#include "mongo_1.h" -#include "mongo_2.h" -#include "mongo_3.h" -#include "mongo_4.h" -#include "mongo_5.h" -#include "mongo_6.h" -#include "mongo_7.h" -#include "mongo_8.h" -#include "mongo_9.h" -#include "mongo_c.h" - -static const char **mongo_ds[] = { -	mongo_0, mongo_1, mongo_2, mongo_3, mongo_4, -	mongo_5, mongo_6, mongo_7, mongo_8, mongo_9 -}; - -static volatile sig_atomic_t caught_sigterm = 0; -static volatile sig_atomic_t caught_sigwinch = 1; - -char *argv0; - -static void -usage(void) -{ -	fprintf(stderr, "usage: %s\n", argv0); -	exit(1); -} - -static void -sigterm(int signo) -{ -	caught_sigterm = 1; -	(void) signo; -} - -static void -sigwinch(int signo) -{ -	caught_sigwinch = 1; -	(void) signo; -} - -static void -print_time(const char ***str, size_t y, size_t x) -{ -	size_t r, c; - -	fprintf(stdout, "\033[%zu;1H\033[1J", y + 1); - -	for (r = 0; r < DY; r++) { -		fprintf(stdout, "\033[%zu;%zuH\033[1K", y + r + 1, x + 1); -		for (c = 0; str[c]; c++) -			fprintf(stdout, "%s", str[c][r]); -		fprintf(stdout, "\033[0K"); -	} - -	fprintf(stdout, "\033[0J"); -	fflush(stdout); -} - -static int -display_time(int timerfd) -{ -	const char **digits[9]; -	int small = 0; -	uint64_t _overrun; -	struct winsize winsize; -	size_t x = 0, y = 0; -	struct tm *now; -#ifdef USE_ADJTIMEX -	struct timex timex; -	int r; -#else -	time_t now_; -#endif - -#ifdef USE_ADJTIMEX -	memset(&timex, 0, sizeof(timex)); -#endif - -	digits[8] = NULL; - -	while (!caught_sigterm) { -		if (caught_sigwinch) { -			if (ioctl(STDOUT_FILENO, (unsigned long)TIOCGWINSZ, &winsize) < 0) { -				if (errno == EINTR) -					continue; -				goto fail; -			} -			caught_sigwinch = 0; -			y = winsize.ws_row; -			x = winsize.ws_col; -			if      (y < DY)              small = 2; -			else if (x < 4 * DX + DC)     small = 2; -			else if (x < 6 * DX + 2 * DC) small = 1; -			else                          small = 0; -			y -= DY; -			x -= 4 * DX + DC; -			if (!small) -				x -= 2 * DX + DC; -			y /= 2; -			x /= 2; -		} - -		if (small == 2) { -			fprintf(stdout, "\033[H\033[2J%s\n", "Screen is too small"); -			fflush(stdout); -			pause(); -			continue; -		} - -#ifdef USE_ADJTIMEX -		r = adjtimex(&timex); -		if (r == -1) -			goto fail; -		now = localtime(&timex.time.tv_sec); -		if (now == NULL) -			goto fail; -		if (r == TIME_OOP) -			now->tm_sec += 1; -#else -		now_ = time(NULL); -		if (now_ == -1) -			goto fail; -		now = localtime(&now_); -		if (now == NULL) -			goto fail; -#endif - -		digits[0] = mongo_ds[now->tm_hour / 10]; -		digits[1] = mongo_ds[now->tm_hour % 10]; -		digits[2] = mongo_c; -		digits[3] = mongo_ds[now->tm_min / 10]; -		digits[4] = mongo_ds[now->tm_min % 10]; -		digits[5] = small ? NULL : mongo_c; -		digits[6] = mongo_ds[now->tm_sec / 10]; -		digits[7] = mongo_ds[now->tm_sec % 10]; - -		print_time(digits, y, x); - -		if (read(timerfd, &_overrun, sizeof(_overrun)) < 0) -			if (errno != EINTR) -				goto fail; -	} - -	return 0; - -fail: -	return -1; -} - -static int -display_posixtime(int timerfd) -{ -	const char **digits[21]; -	uint64_t _overrun; -	struct winsize winsize; -	size_t w = 0, h = 0, x, y; -	time_t now; -	size_t first_digit, ndigits; - -	digits[20] = NULL; - -	while (!caught_sigterm) { -		if (caught_sigwinch) { -			if (ioctl(STDOUT_FILENO, (unsigned long)TIOCGWINSZ, &winsize) < 0) { -				if (errno == EINTR) -					continue; -				goto fail; -			} -			caught_sigwinch = 0; -			h = winsize.ws_row; -			w = winsize.ws_col; -		} - -		now = time(NULL); -		if (now < 0) -			goto fail; - -		first_digit = 20; -		do { -			if (!first_digit) -				abort(); -			digits[--first_digit] = mongo_ds[now % 10]; -		} while (now /= 10); -		ndigits = 20 - first_digit; - -		if (h < DY || w < ndigits * DX) { -			fprintf(stdout, "\033[H\033[2J%s\n", "Screen is too small"); -			fflush(stdout); -			pause(); -			continue; -		} - -		y = (h - DY) / 2; -		x = (w - ndigits * DX) / 2; -		print_time(&digits[first_digit], y, x); - -		if (read(timerfd, &_overrun, sizeof(_overrun)) < 0) -			if (errno != EINTR) -				goto fail; -	} - -	return 0; - -fail: -	return -1; -} - -int -main(int argc, char *argv[]) -{ -	int timerfd = -1; -	int posixtime = 0; -	struct itimerspec itimerspec; -	struct sigaction sigact; - -	ARGBEGIN { -	case 's': -		posixtime = 1; -		break; -	default: -		usage(); -	} ARGEND; - -	if (argc) -		usage(); - -	fprintf(stdout, "\033[?1049h\033[?25l"); - -	if (clock_gettime(CLOCK_REALTIME, &itimerspec.it_value)) -		goto fail; -	itimerspec.it_interval.tv_sec = 1; -	itimerspec.it_interval.tv_nsec = 0; -	itimerspec.it_value.tv_sec += 1; -	itimerspec.it_value.tv_nsec = 0; -	timerfd = timerfd_create(CLOCK_REALTIME, 0); -	if (timerfd < 0) -		goto fail; -	if (timerfd_settime(timerfd, TFD_TIMER_ABSTIME, &itimerspec, NULL)) -		goto fail; - -	memset(&sigact, 0, sizeof(sigact)); - -	sigact.sa_handler = sigterm; -	sigaction(SIGTERM, &sigact, NULL); -	sigaction(SIGQUIT, &sigact, NULL); -	sigaction(SIGINT, &sigact, NULL); - -	sigact.sa_handler = sigwinch; -	sigaction(SIGWINCH, &sigact, NULL); - -	if (posixtime ? display_posixtime(timerfd) : display_time(timerfd)) -		goto fail; - -	fprintf(stdout, "\033[?25h\n\033[?1049l"); -	fflush(stdout); -	close(timerfd); -	return 0; - -fail: -	perror(argv0 ? argv0 : "mongoclock"); -	fprintf(stdout, "\033[?25h\n\033[?1049l"); -	fflush(stdout); -	if (timerfd >= 0) -		close(timerfd); -	return 1; -} | 
