#define PROGVERSION  "0.14"
#define PROGDATE     "08.08.96"
#define PROGNAME     "BirthdayWarner"
/* #define DEBUG 1 */

/*
    BirthdayWarner © 1996 by CTS

    looks a bit weird because of this APF stuff...
    don't know yet, if its really worth the trouble, it give me lots of
    error messages, though the proggi works...

*/
/*+ "std includes" */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/*- */
const char Version[] = "$VER: " PROGNAME " " PROGVERSION " (" PROGDATE ")"
" © 1996 Christian T. Steigies";
/*+ "declarations" */
int main( int argc, char *argv[] );
#include "usage.h"
#include "error.h"
#include "kalender.h"
/*- */
/*+ "int main ( argc, *argv )" */
int main ( int argc, char *argv[] )

{   FILE *in;
    time_t kzeit;
    struct tm *zeit;
    char line[81];
    int  hour,min,sec,day,mon,year,wday,yday; /* jetzige Zeit, Datum, Wochentag und Tag im Jahr     */
    int  g_day,g_mon,g_year;                  /* GeburtsTag/Monat/Jahr */
    int  bday,bday_t,bday_p,bday_n;           /* Geburtstag und dieses/voriges/nächstes Jahr (Tag im Jahr) */
    int  display_all=0;                       /* debugging, alles anzeigen = 1 */
    int  future=30,past=30;                   /* Wieviele Tage in die Zukunft/Vergangenheit warnen? */
    char dummy[32];                           /* APF argv problem... */
/*+ "Copyright" */
    printf ("%s\n",Version+6);
/*    printf ("compiled by GCC %s on %s at %s\n",__VERSION__,__DATE__,__TIME__); */
    puts ("Freeware, NO commercial usage ;-)\n");
    puts ("This program comes without ANY WARRANTY, use at your own risk!\n");
/*- */
/*+ "in file öffnen, help?" */
    if  (argc == 2)
    {
#ifdef APF
        AP_Report(0);
#endif
#ifdef DEBUG
        strcpy(dummy,argv[1]);
#endif
#ifdef APF
        AP_Report(1);
#endif
#ifdef DEBUG
        if (!( strcmp(dummy,"-h") )
            || !( strcmp(dummy,"?") )
            )
#else
        if (!( strcmp(argv[1],"-h") )
            || !( strcmp(argv[1],"?") )
            )
#endif
        {
#ifdef APF
          AP_Report(0);
          AP_Close();
#endif
          atexit(&usage);
          atexit(&help);
          exit(EXIT_SUCCESS);
        }
    } /* if (arg == 2) */
    if  (argc== 3)
    {
#ifdef APF
        AP_Report(0);
#endif
#ifdef DEBUG
        strcpy(dummy,argv[2]);
#endif
#ifdef APF
        AP_Report(1);
#endif
#ifdef DEBUG
        if (!( strcmp(dummy,"a") )
            )
/* 3rd argument ONLY when debugging!
#else
        if (!( strcmp(argv[2],"a") )
            )
#endif
*/
        {
            display_all=1;
            puts("looong display...\n");
        }
#endif
    } /* argc==3 */
    if  ( ( argc > 3 )
         || ( argc <2 )
         )
    {
#ifdef APF
        AP_Report(0);
        AP_Close();
#endif
        atexit(&usage);
        exit(EXIT_SUCCESS);
    } /* argc >3 || argc <2 */

#ifdef APF
    AP_Report(0);
#endif
#ifdef DEBUG
    strcpy(dummy,argv[1]);
#endif
#ifdef APF
    AP_Report(1);
#endif
#ifdef DEBUG
    if  ( ( in = fopen(dummy,"r") ) == 0 )
#else
    if  ( ( in = fopen(argv[1],"r") ) == 0 )
#endif
    {
#ifdef APF
        AP_Report(0);
        AP_Close();
#endif
        atexit(&usage);
        atexit(&fin_error);
        exit(EXIT_SUCCESS);
    } /* Eingabefile zum lesen öffnen */
/*- */
/*+ "Zeit" */
    time(&kzeit);
    zeit = localtime(&kzeit);
    hour = zeit->tm_hour;
    min  = zeit->tm_min;
    sec  = zeit->tm_sec;
    day  = zeit->tm_mday;
    mon  = zeit->tm_mon+1;
    year = zeit->tm_year+1900;
    wday = zeit->tm_wday;
    yday = zeit->tm_yday+1;
    if ( display_all)
    {
        printf("Wir haben den %02d.%02d.%04d\n",day,mon,year);
        printf("Es war soeben %02d:%02d:%02d\n",hour,min,sec);
        printf("Es ist %d Tage nach Sonntag\n",wday);
        printf("Es ist der %d. Tag im Jahr\n\n",yday);
     }
/*- */
     while ( !feof(in) )
     {
        fscanf(in,"%s%2d.%2d.%4d",line,&g_day,&g_mon,&g_year);
        if ( feof(in) )
        {
            break;
        }
        if ( display_all )
/*+ "alle Namen und Geburtsdaten ausgeben" */
        {
            printf("Name %s\n",line);
            printf("Gebu %02d.%02d.%04d\n",g_day,g_mon,g_year);
            if ( mon == g_mon +1 )
            {
                puts("letzten Monat!");
            }
            if ( mon == g_mon )
            {
                puts("diesen Monat!");
            }
            if ( mon == g_mon -1 )
            {
                puts("nächsten Monat!");
            }
        } /* display_all */
/*- */
        bday   = day_of_the_year(g_day,g_mon,g_year);
        bday_t = day_of_the_year(g_day,g_mon,year);
        bday_p = day_of_the_year(g_day,g_mon,year-1);
        bday_n = day_of_the_year(g_day,g_mon,year+1);
        if ( bday < 0 )
/*+ "Fehler bei bday im Jahr g_year" */
        {
            if ( !display_all )
            {
                printf("Name %s\n",line);
                printf("Gebu %02d.%02d.%04d\n",g_day,g_mon,g_year);
            }
#ifdef german
            printf("Fehler im Geburtsdatum...");
#else
            printf("Error in Birthday...");
#endif
            day_error(bday);
        }
/*- */
        else /* bday >= 0, g_year */
        {
            if ( display_all )
/*+ "alle Geburtsdaten ausgeben" */
            {
                printf("%-20s: im Jahr %d am %d. Tag\n",line,g_year,bday);
                printf("%-20s: im Jahr %d am %d. Tag\n",line,year-1,bday_p);
                printf("%-20s: im Jahr %d am %d. Tag\n",line,year  ,bday_t);
                printf("%-20s: im Jahr %d am %d. Tag\n",line,year+1,bday_n);
            }
/*- */
            if ( bday_t < 0 )
/*+ "Fehler bei bday_t im Jahr year" */
            {
                if (   ( bday_t == -2 )
                    && ( g_day  == 29 )
                    && ( g_mon  ==  2 )
                    )
                {
#ifdef german
                    puts("Dieses Jahr gibt es den 29.02. nicht, so ein Pech!");
#else
                    puts("This yeatr, there is no 29-02, bad luck!");
#endif
                }
                else
                {
#ifdef german
                    puts("Dieser Fehler sollte nicht vorkommen!!!\n");
#else
                    puts("This error should NEVER appear!!!\n");
#endif
                }
            } /* bday_t < 0 */
/*- */
            else /* bday_t >=0, year */
            {
                if ( display_all )
/*+ "für jeden Eintrag Differenz zu Heute ausgeben" */
                {
                    if ( bday_t == yday )
                    {
#ifdef german
                        printf("Das ist HEUTE!\n");
#else
                        printf("This is TODAY!\n");
#endif
                    }
                    if ( bday_t < yday )
                    {
#ifdef german
                        printf("Das war vor %d Tagen\n",yday-bday_t);
#else
                        printf("This was %d days ago\n",yday-bday_t);
#endif
                    }
                    if ( bday_t > yday )
                    {
#ifdef german
                        printf("Das ist in %d Tagen\n",bday_t-yday);
#else
                        printf("This is in %d days\n",bday_t-yday);
#endif
                    }
                } /* display_all */
/*- */
                else /* !display_all */
/*+ "nur für 'nahe' Einträge Differenz zu Heute ausgeben" */
                {
                    if ( bday_t == yday )
                    {
#ifdef german
                        printf("%-20s: Das ist HEUTE!\n",line);
#else
                        printf("%-20s: This is TODAY!\n",line);
#endif
                    }
                    if (   ( bday_t - yday > 0 )
                        && ( bday_t - yday ) < future )
                    {
#ifdef german
                        printf("%-20s: Geburtstag in %d Tagen!\n",line, bday_t-yday);
#else
                        printf("%-20s: Birthday in %d days!\n",line, bday_t-yday);
#endif
                    }
                    if (   ( yday - bday_t > 0 )
                        && ( yday - bday_t ) < past
                        )
                    {
#ifdef german
                        printf("%-20s: Geburtstag vor %d Tagen!\n",line, yday-bday_t);
#else
                        printf("%-20s: Birthday %d days ago!\n",line, yday-bday_t);
#endif
                    }
                    if (   ( bday_t - yday > 0 )
                        && ( bday_t - yday > (366 - past ) )
                        )
                    {
                        bday_t=day_of_the_year(g_day,g_mon,year)-day_of_the_year(31,12,year-1);
#ifdef german
                        printf("%-20s: Geburtstag vor %d Tagen!\n",line,yday-bday_t);
#else
                        printf("%-20s: Birthday %d days ago!\n",line,yday-bday_t);
#endif
                    }
                    if (   ( yday - bday_t > 0 )
                        && ( yday - bday_t > ( 366 - future ) )
                        )
                    {
                        bday_t=day_of_the_year(g_day,g_mon,year+1)+day_of_the_year(31,12,year);
#ifdef german
                        printf("%-20s: Geburtstag in %d Tagen!\n",line, bday_t-yday);
#else
                        printf("%-20s: Birthday in %d days!\n",line, bday_t-yday);
#endif
                    }
                } /* else  (! display_all) */
/*- */
            } /* else ( b_day >= 0, year ) */
        } /* else ( bday_t >= 0, g_year ) */
    } /* while ( !feof(in) ) */
/*+ "files schliessen" */
    fclose(in);
    puts("\nReady.");
#ifdef APF
    AP_Report(0);
    AP_Close();
#endif
    exit(EXIT_SUCCESS);
/*- */
} /* main */
/*- */


