--- /dev/null
+/* --------------------------------------------------------------------
+ Biorhythmus (c) by Frank Kaefer 1987-2000 V5.0
+ History:
+ V1.0 ZX-80 Basic (ZX-80 with 16 kB RAM)
+ V2.0 TRS-80 Basic (Video Genie)
+ V2.1 C-64 Basic
+ V2.2 OS-9 Basic (OS-9/68000 on Atari ST)
+ V3.0 GW-Basic
+ V3.0a VMS-Basic (brennan@cchs.su.edu.au 02-Feb-1994)
+ V4.0 C-language conversion (brennan@cchs.su.edu.au 04-Feb-1994)
+ V5.0 Y2K and leapyear problem fixed (fkk)
+*/
+
+/*
+ Compilation:
+ SunOS 5.X and
+ SunOS 4.X % cc br br.c -lm
+ or % gcc br br.c -lm
+
+ VMS 5.5-2 $ cc/Standard=PORTABLE/Object=br.obj br.c
+ or $ gcc/Warning/Standard=PORTABLE/Object=br.obj br.c
+
+ (ld) $ LINK br,Sys$Input:/OPTION
+ Sys$Share:VaxCrtl.exe/Share
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+
+#ifdef VMS
+#include <ssdef.h>
+#define SUCCESS SS$_NORMAL
+#define ERROR SS$_BADPARAM
+#else
+#define SUCCESS 0
+#define ERROR 1
+#endif
+
+#define YES (1 == 1)
+#define NO (1 == 0)
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+#define PRINTFILE "biorythm.txt"
+#define MAXBUF 20
+#define MAXSTRING 1000
+#define MAXGRAPH 51
+
+time_t now;
+static struct tm *presenttime;
+int t_dd,t_mm,t_yy;
+
+FILE *fd;
+
+int DRUCKER; /* PRINTER */
+
+char dtmp[MAXBUF];
+char ausgabe[MAXBUF];
+char ausgabeart[MAXBUF]; /* which type of display */
+char Cktage[MAXBUF];
+
+int t,m,j;
+int th,mh,jh;
+int tg,mg,jg;
+int ta,tah,tag,gtag,tage;
+int phys,emot,geist;
+int p,e,g;
+
+int ktage;
+int pl,cl,z;
+
+char graph[MAXGRAPH];
+
+/* define the 'clone' routines of the BASIC functions/gosubs from original */
+void INPUT();
+char *LEFT();
+char *MID();
+char *RIGHT();
+void Vergangene_Tage();
+void Kopf();
+
+/* --------------------------------------------------------------------
+ Daten aus den Datazeilen lesen [read data from data lines (aka BASIC)]
+ -------------------------------------------------------------------- */
+static char *WOCHENTAG[] =
+{
+ "Sunday","Monday","Tuesday","Wednesday","Thursday",
+ "Friday","Saturday"
+ };
+
+/* static */ int MONATSTAG[12] =
+{
+ 31,28,31,30,31,30,31,31,30,31,30,31
+ };
+
+
+
+int main()
+{
+
+ /* Start
+ -------------------------------------------------------------------- */
+ (void) printf("\nBiorhythm (c) 1987-2000 V5.0\n");
+
+ /* --------------------------------------------------------------------
+ Eingabe des heutigen Datums [enter todays date]
+ -------------------------------------------------------------------- */
+ (void) printf("\nDate [<RETURN> for Systemdate] (DD.MM.YYYY) : ");
+
+ INPUT(dtmp);
+
+ if (strlen(dtmp) != 10)
+ { /* get TODAY's date */
+ now = time((time_t *) NULL);
+ presenttime = localtime(&now);
+ t_dd = presenttime->tm_mday;
+ t_mm = presenttime->tm_mon + 1;
+ t_yy = presenttime->tm_year;
+ /* if (90 < t_yy && t_yy < 100) */
+ /* t_yy += 1900; */ /* correct for century */
+ /* if (t_yy < 90) */
+ /* t_yy += 2000; */
+ t_yy += 1900; /* localtime years = years since 1900 */
+ (void) sprintf(dtmp,"%02d.%02d.%04d",t_dd,t_mm,t_yy);
+ }
+
+ t = atoi(LEFT(dtmp,2));
+ m = atoi(MID(dtmp,4,2));
+ j = atoi(RIGHT(dtmp,7));
+ th = t;
+ mh = m;
+ jh = j;
+
+ /* leapyear ? */
+ if (t_yy % 4 == 0)
+ MONATSTAG[1]=29;
+
+ /* --------------------------------------------------------------------
+ Eingabe des Geburtstages [enter the birthdate]
+ -------------------------------------------------------------------- */
+ (void) printf("Birthday [<RETURN> for 04.12.1965] (DD.MM.YYYY) : ");
+
+ INPUT(dtmp);
+
+ if (strlen(dtmp) != 10)
+ (void) strcpy(dtmp,"04.12.1965");
+
+ t = atoi(LEFT(dtmp,2));
+ m = atoi(MID(dtmp,4,2));
+ j = atoi(RIGHT(dtmp,7));
+ tg = t;
+ mg = m;
+ jg = j;
+
+ Vergangene_Tage(); /* GOSUB 1170 */
+
+ ta -= ((double) (ta / 7)) * 7;
+ gtag = ta;
+
+ /* --------------------------------------------------------------------
+ Abfrage, ob und wo Kurve oder Tageswerte ausgegeben werden sollen
+ [ask if they want the curve or the day values and where to display it]
+ -------------------------------------------------------------------- */
+ (void) printf("\nOutput to screen or printer [<RETURN> for Screen] (s/p) ");
+
+ INPUT(ausgabe);
+
+ if (ausgabe[0] == 'p' || ausgabe[0] == 'P')
+ DRUCKER = YES;
+ else
+ DRUCKER = NO;
+
+ if (DRUCKER)
+ {
+ fd = fopen(PRINTFILE,"w");
+ if (!fd)
+ {
+ perror(PRINTFILE);
+ (void) exit(ERROR);
+ }
+ }
+
+ (void) printf("Values for today or Graph [<RETURN> for Graph] (v/g) ");
+
+ INPUT(ausgabeart);
+
+ if (ausgabeart[0] == 'v' || ausgabeart[0] == 'V')
+ {
+ /* --------------------------------------------------------------------
+ Berechnung der vergangenen Tage [calc the past days]
+ -------------------------------------------------------------------- */
+ j = jg;
+ m = mg;
+ t = tg;
+
+ Vergangene_Tage(); /* GOSUB 1170 */
+
+ tag = ta;
+ j = jh;
+ m = mh;
+ t = th;
+
+ Vergangene_Tage(); /* GOSUB 1170 */
+
+ tah = ta;
+ tage = tah - tag;
+
+ Kopf(); /* GOSUB 2110 */
+ if (!DRUCKER)
+ {
+ (void) printf("\nThe birthday %02d.%02d.%04d is a %s\n",tg,mg,jg,WOCHENTAG[gtag]);
+ (void) printf("Age in days: %d\n",tage);
+ }
+ else
+ {
+ (void) fprintf(fd,"\nThe birthday %02d.%02d.%04d is a %s\n",tg,mg,jg,WOCHENTAG[gtag]);
+ (void) fprintf(fd,"Age in days: %d\n",tage);
+ }
+
+ /* --------------------------------------------------------------------
+ Berechnung der drei Werte fuer das angegebene Datum
+ [calculate the 3 values for the given date]
+ -------------------------------------------------------------------- */
+ phys = 50 * (1 + sin((double) (((double) tage / 23) - (tage / 23)) * 360 * PI / 180));
+ emot = 50 * (1 + sin((double) (((double) tage / 28) - (tage / 28)) * 360 * PI / 180));
+ geist = 50 * (1 + sin((double) (((double) tage / 33) - (tage / 33)) * 360 * PI / 180));
+
+ /* --------------------------------------------------------------------
+ Ausgabe der Werte [display the values]
+ -------------------------------------------------------------------- */
+ if (!DRUCKER)
+ {
+ (void) printf("Biorhythm %02d.%02d.%04d\n",th,mh,jh);
+ (void) printf("Physical: %d%%\n",phys);
+ (void) printf("Emotional: %d%%\n",emot);
+ (void) printf("Mental: %d%%\n\n",geist);
+ }
+ else
+ {
+ (void) fprintf(fd,"Biorhythm %02d.%02d.%04d\n",th,mh,jh);
+ (void) fprintf(fd,"Physical: %d%%\n",phys);
+ (void) fprintf(fd,"Emotional: %d%%\n",emot);
+ (void) fprintf(fd,"Mental: %d%%\n\n",geist);
+ }
+ }
+ else
+ {
+ /* --------------------------------------------------------------------
+ Ausgabe einer Kurve [display the curves]
+ -------------------------------------------------------------------- */
+ (void) printf("\nGraph for how many days : ");
+
+ INPUT(Cktage);
+ ktage = atoi(Cktage);
+ ktage -= 1;
+
+ /* --------------------------------------------------------------------
+ Berechnung der vergangenen Tage [calc the past days]
+ -------------------------------------------------------------------- */
+ j = jg;
+ m = mg;
+ t = tg;
+ Vergangene_Tage(); /* GOSUB 1170 */
+
+ tag = ta;
+ j = jh;
+ m = mh;
+ t = th;
+ Vergangene_Tage(); /* GOSUB 1170 */
+
+ tah = ta;
+ tage = tah - tag;
+ Kopf(); /* heading *//* GOSUB 2110 */
+
+
+ if (!DRUCKER)
+ {
+ (void) printf("\nThe birthday %02d.%02d.%04d is a %s\n",tg,mg,jg,WOCHENTAG[gtag]);
+ (void) printf("Age in days: %d\n",tage);
+ (void) printf("\n P=Physical, E=Emotional, M=Mental\n");
+ (void) printf("\n bad condition");
+
+ (void) printf(" good condition\n");
+ }
+ else
+ {
+ (void) fprintf(fd,"\nThe birthday %02d.%02d.%04d is a %s\n",tg,mg,jg,WOCHENTAG[gtag]);
+ (void) fprintf(fd,"Age in days: %d\n",tage);
+ (void) fprintf(fd,"\n P=Physical, E=Emotional, M=Mental\n");
+ (void) fprintf(fd,"\n bad condition");
+ (void) fprintf(fd," good condition\n");
+ }
+
+ /* --------------------------------------------------------------------
+ Schleife fuer die Ausgabe der Kurve
+ [loop for the display of the curves]
+ -------------------------------------------------------------------- */
+
+ for (z = tage; z <= (tage + ktage); z++)
+ {
+ phys = 50 * (1 + sin((double) (((double) z / 23) - (z / 23)) * 360 * PI / 180));
+ emot = 50 * (1 + sin((double) (((double) z / 28) - (z / 28)) * 360 * PI / 180));
+ geist = 50 * (1 + sin((double) (((double) z / 33) - (z / 33)) * 360 * PI / 180));
+
+ /* --------------------------------------------------------------------
+ Ausgabe der Werte als Kurve [display the values as a curve]
+ ------------------------------------------------------------------ */
+ if (!DRUCKER)
+ {
+ (void) printf("%02d %02d %04d",th,mh,jh);
+ (void) printf(" ");
+ }
+ else
+ {
+ (void) fprintf(fd,"%02d %02d %04d",th,mh,jh);
+ (void) fprintf(fd," ");
+ }
+ phys = ((double) ((double) phys / 2) + .5);
+ emot = ((double) ((double) emot / 2) + .5);
+ geist = ((double) ((double) geist / 2) + .5);
+ p = phys + 1;
+ e = emot + 1;
+ g = geist + 1;
+
+ /* ------------------------------------------------------------------ */
+
+ for (cl = 0; cl <= MAXGRAPH; cl++)
+ {
+ graph[cl] = '.';
+ }
+
+ graph[p] = 'P';
+ graph[e] = 'E';
+ graph[g] = 'M';
+ graph[MAXGRAPH / 2] = '|';
+
+ for (pl = 0; pl <= MAXGRAPH; pl++)
+ {
+ if (!DRUCKER)
+ (void) printf("%c",graph[pl]);
+ else
+ (void) fprintf(fd,"%c",graph[pl]);
+ }
+
+ if (!DRUCKER)
+ (void) printf("\n");
+ else
+ (void) fprintf(fd,"\n");
+
+ /* ------------------------------------------------------------------ */
+ th += 1;
+ if (th > MONATSTAG[mh - 1])
+ {
+ mh += 1;
+ th = 1;
+ }
+ if (mh > 12)
+ {
+ jh += 1;
+ mh = 1;
+ /* leapyear ? */
+ if (jh % 4 == 0)
+ MONATSTAG[1]=29;
+ else
+ MONATSTAG[1]=28;
+ }
+ } /* next Z */
+ }
+ if (!DRUCKER)
+ (void) printf("\n");
+ else
+ (void) fclose(fd);
+
+ return (SUCCESS); /* END */
+}
+
+
+
+void Kopf() /* heading */
+{
+ /* 2110 subroutine */
+ /* --------------------------------------------------------------------
+ Kopf BIORHYTHMUS
+ ------------------------------------------------------------------ */
+ if (DRUCKER)
+ {
+ (void) fprintf(fd,"\n");
+ (void) fprintf(fd," BIORHYTHM\n");
+ (void) fprintf(fd," =========\n");
+ (void) fprintf(fd,"\n (c) 1987-2000 by Frank Kaefer\n");
+ }
+ else
+ {
+ (void) printf("\n");
+ (void) printf(" BIORHYTHM\n");
+ (void) printf(" =========\n");
+ (void) printf("\n (c) 1987-2000 by Frank Kaefer\n");
+ }
+
+ return;
+
+}
+
+
+void Vergangene_Tage()
+{
+ /* 1170 subroutine */
+ /* --------------------------------------------------------------------
+ Unterprogramm zur Berechnung der vergangenen Tage
+ [subroutine to calculate the past days]
+ -------------------------------------------------------------------- */
+ ta = 0;
+ if (m <= 2)
+ {
+ ta = (double) (m - 1) * 31;
+ }
+ else
+ {
+ if ((j % 4 == 0 && j % 100 != 0) || j % 400 == 0)
+ ta = 1;
+ else
+ ta = 0;
+ ta += ((double) (306 * m - 324) / 10);
+ }
+ ta += (double) (j - 1) * 365 + ((j - 1) / 4);
+ ta -= (double) ((j - 1) / 100) - (double) ((j - 1) / 400);
+ ta += t;
+
+ return;
+}
+
+/* clone the BASIC functions LEFT$, MID$, RIGHT$ */
+
+char *LEFT(source,numchars)
+ char source[];
+ int numchars;
+{
+ char result[MAXSTRING];
+ int i;
+
+ if (numchars > strlen(source))
+ return (source);
+
+ for (i = 0; i < numchars; i++)
+ result[i] = source[i];
+
+ result[i] = '\0';
+ return (result);
+}
+
+char *MID(source,startpos,numchars)
+ char source[];
+ int startpos,numchars;
+{
+ char result[MAXSTRING];
+ int i,j;
+
+ if ((startpos + numchars) > strlen(source))
+ return (source);
+
+ for (i = startpos - 1,j = 0; i < (startpos + numchars) - 1; i++,j++)
+ result[j] = source[i];
+
+ result[j] = '\0';
+ return (result);
+}
+
+char *RIGHT(source,startpos)
+ char source[];
+ int startpos;
+{
+ char result[MAXSTRING];
+ int i,j;
+
+ if (startpos > strlen(source))
+ return (source);
+
+ for (i = startpos - 1,j = 0; i < strlen(source); i++,j++)
+ result[j] = source[i];
+
+ result[j] = '\0';
+ return (result);
+}
+
+void INPUT(var)
+ char var[];
+{
+ int c;
+ int i;
+
+ for (i = 0; (c = getchar()) != EOF && c != '\n'; i++)
+ var[i] = c;
+
+ var[i + 1] = '\0';
+ return;
+}