Import aclock-unix-termcap.c
authorAlexander Barton <alex@barton.de>
Sat, 1 Nov 2014 16:54:12 +0000 (17:54 +0100)
committerAlexander Barton <alex@barton.de>
Sat, 1 Nov 2014 16:54:12 +0000 (17:54 +0100)
aclock-unix-termcap.c [new file with mode: 0644]

diff --git a/aclock-unix-termcap.c b/aclock-unix-termcap.c
new file mode 100644 (file)
index 0000000..8a66341
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * aclock - ascii clock for UNIX Console - termcap port
+ *
+ * Copyright (c) 1994-2013 Antoni Sawicki <as@tenoware.com>
+ * Version 2.3 (unix-termcap); Mountain View, July 2013
+ *
+ * Compilation: cc aclock-unix-termcap.c -o aclock -ltermcap -lm
+ * Built on: BeOS, Zeta, SkyOS, Haiku, Amiga-GG, UnixWare, Risc/OS
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <termcap.h>
+#include <math.h>
+#include <time.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define FontWH_Ratio 2  
+
+char *cm, *cl;
+
+void my_putchar(int c) {
+    putchar(c);
+}
+
+void cls(void) {
+    tputs(tgoto(cl, 0, 0), 1, (void*)my_putchar);
+}
+
+void draw_point(int x, int y, char c) {
+    tputs(tgoto(cm, x, y), 1, (void*)my_putchar);
+    putchar(c);
+}
+
+void draw_text(int x, int y, char *string) {
+    tputs(tgoto(cm, x, y), 1, (void*)my_putchar);
+    puts(string);
+}
+
+
+void draw_circle(int hand_max, int sYcen, int sXcen){
+    int x,y,r;
+    char c;
+
+    for(r=0;r<60;r++){
+        x=cos(r*M_PI/180*6)*hand_max*FontWH_Ratio+sXcen;
+        y=sin(r*M_PI/180*6)*hand_max+sYcen;
+        switch (r) {
+            case 0:
+            case 5:
+            case 10:
+            case 15:
+            case 20:
+            case 25:
+            case 30:
+            case 35:
+            case 40:
+            case 45:
+            case 50:
+            case 55:
+                c='o';
+                break;
+            default:
+                c='.';
+                break;
+        }
+        draw_point(x,y,c);
+    }
+}
+
+void draw_hand(int minute, int hlenght, char c, int sXcen, int sYcen){
+    int x,y,n;
+    float r=(minute-15)*(M_PI/180)*6;
+
+    for(n=1; n<hlenght; n++){
+        x=cos(r)*n*FontWH_Ratio+sXcen;
+        y=sin(r)*n+sYcen;
+        draw_point(x,y,c);
+    }
+}
+
+
+int main(int argc, char **argv){
+    char INFO[]="Copyright (c) 1994-2013 Antoni Sawicki <as@tenoware.com>\n"
+                "Version 2.3 (unix-termcap); Mountain View, July 2013\n";
+    char digital_time[32];
+    int sXmax, sYmax, sXmaxo, sYmaxo, smax, hand_max, sXcen, sYcen;
+    time_t t;
+    struct tm *ltime;
+    char *term_env;
+    char term_buffer[2048];
+    struct winsize ws;
+    struct termios tios;
+
+
+
+    term_env=getenv("TERM");
+
+    if(!term_env) {
+        fprintf(stderr, "no terminal type defined\n");
+        exit(1);
+    }
+
+    if(!tgetent(NULL, term_env)) {
+        fprintf(stderr, "unknown terminal type\n");
+        exit(1);
+    }
+
+    cm=(char*)tgetstr("cm", NULL);
+    cl=(char*)tgetstr("cl", NULL);
+
+    sXmaxo=sYmaxo=sXmax=sYmax=0;
+
+    while(1){
+        sXmaxo=sXmax;
+        sYmaxo=sYmax;
+
+        ioctl(1, TIOCGWINSZ, &ws);
+
+        sXmax = ws.ws_col;
+        sYmax = ws.ws_row;
+
+        if((sXmax!=sXmaxo) || (sYmax!=sYmaxo)) {
+            if(sXmax/2<=sYmax)
+                    smax=sXmax/2;
+            else
+                smax=sYmax;
+
+            hand_max = (smax/2)-1;
+
+            sXcen = sXmax/2;
+            sYcen = sYmax/2;
+
+            cls();
+            draw_circle(hand_max, sYcen, sXcen);
+        }
+
+        time(&t);
+        ltime=localtime(&t);
+
+        draw_hand((ltime->tm_hour*5)+(ltime->tm_min/10), 2*hand_max/3, 'h', sXcen, sYcen);
+        draw_hand(ltime->tm_min, hand_max-2, 'm', sXcen, sYcen);
+        draw_hand(ltime->tm_sec, hand_max-1, '.', sXcen, sYcen);
+
+        draw_text(sXcen-5, sYcen-(3*hand_max/5), ".:ACLOCK:.");
+        sprintf(digital_time, "[%02d:%02d:%02d]", ltime->tm_hour, ltime->tm_min, ltime->tm_sec);
+        draw_text(sXcen-5, sYcen+(3*hand_max/5), digital_time);
+        
+        fflush(stdout);
+        sleep(1);
+
+        draw_hand((ltime->tm_hour*5)+(ltime->tm_min/10), 2*hand_max/3, ' ', sXcen, sYcen);
+        draw_hand(ltime->tm_min, hand_max-2, ' ', sXcen, sYcen);
+        draw_hand(ltime->tm_sec, hand_max-1, ' ', sXcen, sYcen);
+    }
+    return 0;
+}