/* S&W.c - von Christof Brühann
 * Aufruf mit DICE: dcc S&W.c -o S&W */
#include <time.h>
#include <dos/dos.h>
#define WINTERTIME 0
#define SUMMERTIME 1
#define DATAFILE "s:Sommer&Winter.dat"
BOOL SummerTime(struct tm *tm) {
 /* feststellen, ob die Zeit "tm" Sommerzeit ist */
 int mon,mday,hour,wday;
 mon =tm->tm_mon+1; /* tm-Struktur auslesen: Monat */
 mday=tm->tm_mday;  /* Monatstag */
 wday=tm->tm_wday;  /* Wochentag */
 hour=tm->tm_hour;  /* Stunde */
 if (mon==3 && mday-25>=wday) {
   /* wenn März: schon Sommerzeit? */
   /* Zeit prüfen wenn letzer Märzsonntag*/
   if (wday==0 && hour<2) return(FALSE);
   return(TRUE);
 }
 if (mon==9 && mday-24>=wday) {
   /* wenn September: schon Winterzeit? */
   if (wday==0 && hour<2) return (TRUE);
   return(FALSE);
 }
 /* restlichen Monate prüfen */
 if (mon>3 && mon<=9) return(TRUE);
 return(FALSE);
}
int main()
{
 struct FileHandle *DataFile;
 struct tm *tm;
 time_t secs;
 UBYTE time_now,time_before,string[255];

 if (DataFile=(struct FileHandle *)
            Open(DATAFILE,MODE_READWRITE)) {
  /* Datendatei öffnen */
  time(&secs);              /* aktuelle Zeit */
  tm=localtime(&secs);      /* besorgen */
  time_now=WINTERTIME;
  if (SummerTime(tm))
    time_now=SUMMERTIME; /* Sommerzeit */
  if (Read(DataFile,&time_before,1)) {
    /* Datenfile lesen */
    if (time_now==SUMMERTIME &&
        time_before==WINTERTIME && tm->tm_mon!=8) {
      /* Wechsel von Winter- nach Sommerzeit? */
      secs+=3600; /* Zeit um eine Stunde erhöhen */
      tm=localtime(&secs);
      sprintf(string,"date %d:%d:%d",
                tm->tm_hour,tm->tm_min,tm->tm_sec);
      if (Execute(string,0,0) &&
          Execute("setclock save",0,0)) {
        /* neue Zeit setzen */
        puts("Beginn der Sommerzeit. Die Uhr wurde "
             "um eine Stunde vorgestellt.");
        if(Seek(DataFile,0,OFFSET_BEGINNING))
           Write(DataFile,&time_now,1);
      }
    }
    if(time_now==WINTERTIME &&
       time_before==SUMMERTIME) {
      /* Wechsel von Sommer- nach Winterzeit? */
      secs-=3600; /* aktuelle Zeit zurückstellen */
      tm=localtime(&secs);
      sprintf(string,"date %d:%d:%d",tm->tm_hour,
                            tm->tm_min,tm->tm_sec);
      if (Execute(string,0,0) &&
          Execute("setclock save",0,0)) {
        puts("Beginn der Winterzeit. Die Uhr wurde "
             "um eine Stunde zurückgestellt.");
        if (Seek(DataFile,0,OFFSET_BEGINNING))
        Write(DataFile,&time_now,1);
      }
    }
  }
  else
    /* Datei existierte noch nicht */
    Write(DataFile,&time_now,1);
  Close(DataFile);
 }
 return(0);
}
