// Übung für Strukturen: Datumsfunktionen, Wochentag ausrechnen
//
// Aufruf: wochentag tag monat jahr
//
// Klaus Kusche, 2011

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const char *wochentag[] = {
  "Sonntag", "Montag", "Dienstag", "Mittwoch",
  "Donnerstag", "Freitag", "Samstag"};

int main(int argc, const char *argv[])
{
  if (argc != 4) {
    fprintf(stderr, "Aufruf: %s tag monat jahr\n", argv[0]);
    exit(EXIT_FAILURE);    
  }

  struct tm input = {
    0, 0, 12,
    atoi(argv[1]), atoi(argv[2]) - 1, atoi(argv[3]) - 1900,
    0, 0, -1 };

// ersetzt durch die Initialisierung
//  input.tm_sec = 0;
//  input.tm_min = 0;
//  input.tm_hour = 12;
//  input.tm_mday = atoi(argv[1]);
//  input.tm_mon = atoi(argv[2]) - 1;
//  input.tm_year = atoi(argv[3]) - 1900;
//  input.tm_isdst = -1;
// Rest der Struktur bleibt undefiniert

  // verwandle die komponentenweise Zeit in der Struktur input
  // in einen time_t-Wert (ganze Zahl: Sekunden seit 1.1.1970)
  time_t secs = mktime(&input);

  if (secs == -1) {
    fprintf(stderr, "%s: Umrechnung in Sekunden seit 1.1.1970 misslungen\n",
            argv[0]);
    exit(EXIT_FAILURE);    
  }

  // verwandle den Sekunden-Wert in secs
  // wieder in eine komponentenweise Zeit
  // localtime befüllt eine funktions-interne, statische struct tm
  // und liefert als Returnwert einen Pointer auf seine befüllte struct tm
  struct tm *output = localtime(&secs);

  printf("Der %d. %d. %d (%d. Tag des Jahres) ist ein %s\n",
         output->tm_mday, output->tm_mon + 1, output->tm_year + 1900,
         output->tm_yday + 1, wochentag[output->tm_wday]);

  exit(EXIT_SUCCESS);
}
