/* Programm zur automatischen Zeitstellung Funktion: erzeugt alle 5 min eine Datei auf D: ( jede Harddisk hat D: , oder? ); beim Booten wird das Datum/die Uhrzeit dieser Datei eingestellt, wenn die Systemzeit nicht jnger ist! Gelingt das zum Žndern des Filedatums n”tige ™ffnen 2mal in Folge nicht, so wird die Zeitkontrolle abgestellt. Das Programm beginnt wieder zu arbeiten, wenn es im Desktop angeklickt wird! Bisher wurden folgende Unvertr„glichkeiten festgestellt: 5.1.90: Anfangsschwierigkeiten beruhten auf der Nichtverdopplung des \ in der Angabe von d:\\Autozeit.zei Die Gr”že von ber 10kB rhrt von dem sprintf her, um den Fehler- code eines evtl. fehlgeschlagenen Fopen auszugeben. sprintf durch einfache Umwandlungsroutinen ersetzt: intochar. */ #include #include #include /* #include */ #include /* Erzeugungstext ( noch unten in form_alert eintragen )*/ static BYTE *Orig="Autozeit.c V2R2 06.01.90 MSt” ATARI ST/LASER-C"; long _stksize=1000L; /* MDEBUG: Autozeit als normales Programm ausfhrbar; autozeit.zei auf B: ! */ /*#define MDEBUG/**/ /* ACCDEBUG: Meldungen w„hrend Installierung und Lauf! */ /*#define ACCDEBUG/**/ #ifdef MDEBUG # define WARTEZEIT 5000 # define ANTDEF # define DATEI "B:\\AUTOZEI.ZEI" #else # define DATEI "D:\\AUTOZEI.ZEI" /* alle 5 min Zeit eintragen */ # define WARTEZEIT 300000L #endif extern void appl_exit(), _exit(); extern char ant(); /* Aus libv */ extern _app; /* 0: Accessory */ static void mach_fz(roh,datzeit) int roh[2]; datetime *datzeit; { datzeit->realtime=(((LONG)roh[1]<<16)&0xffff0000L) | ((LONG)roh[0]&0x0000ffffL); } static void mach_roh(roh,syszeit) int roh[2]; datetime *syszeit; { roh[1]=syszeit->realtime>>16 &0xffff; roh[0]=syszeit->realtime &0xffff; } /* Umwandeln einer ( kleinen ) Zahl in eine Zeichenfolge; ( Bem.: da Zahl eine int ist, k”nnen max. 5 Ziffern auftreten, entsprechend ist nur wenig Stack n”tig ) Aufruf: intochar(puffer,zahl): puffer: In puffer wird die Zeichenkette erzeugt. zahl: die umzuwandelnde Zahl, vorzeichenbehaftet. itc_convert(): Unterpogramm, das Dezimalenweise rekursiv die Umwandlung erledigt. */ static BYTE itc_zeichen[10]={'0','1','2','3','4','5','6','7','8','9'}; static BYTE *itc_convert(string,zahl) BYTE *string; WORD zahl; { if ( zahl>9 ) { WORD temp=zahl/10; string=itc_convert(string,temp); zahl -= temp*10; } *(string++) = itc_zeichen[zahl]; return string; } static void *intochar(string,zahl) BYTE *string; WORD zahl; { if ( zahl < 0 ) { *(string++)='-'; zahl= - zahl; } if ( zahl==0) *(string++)='0'; else /* Jetzt geht's los */ string=itc_convert(string,zahl); *string='\0'; } static void passiviere() { #ifdef ACCDEBUG puts("Anfang passiviere()!"); ant(); #endif #ifdef MDEBUG _exit(); #else FOREVER evnt_timer(0,3600); #endif } #ifndef MDEBUG void exit() {} #endif main() { int app_id,fd,iercnt=0,ereignis,msgpuff[8],eintrag, ereignis_maske=MU_MESAG|MU_TIMER; register WORD i,j; LONG diskmap,dummy; datetime syszeit,filezeit; int fz_roh[2]; diskmap=Drvmap(); syszeit.realtime=Gettime(); /* Hole Systemzeit */ app_id=appl_init(); if ( ! _app) eintrag=menu_register(app_id," Autozeit "); /* if ( diskmap & 4L ) */ { if ( (fd=Fopen(DATEI,1))<0 ) { if ((fd=Fcreate(DATEI,0))<=0 ) passiviere(); /* File kann nicht ge”ffnet werden! */ } /* Zeitdatei existiert */ Fdatime(fz_roh,fd,0); mach_fz(fz_roh,&filezeit); /* Systemzeit ist, wenn nicht gesetzt: 128 ( + '80 ) !! */ /* Jahreszahlen in Register berfhren */ i=syszeit.part.year; j=filezeit.part.year; if ( ( i< j-1) || ( i > j )) { /* Setze Systemzeit nach filezeit */ Settime(filezeit.realtime); syszeit.realtime=filezeit.realtime; } mach_roh(fz_roh,&syszeit); #ifdef ACCDEBUG puts("vor Dateizeit angleichen"); ant(); #endif Fclose(fd); /* ----------------------------------------------------------------- Die ewige Schleife */ #ifdef MDEBUG { int i; for ( i=0; i<5; i++ ) #else FOREVER #endif { #ifdef ACCDEBUG puts("vor evnt_multi"); ant(); #endif /* Message: eintrag angeklickt; Zeit */ ereignis=evnt_multi(ereignis_maske, 1,1,1,1,1,1,1,1,1,1,1,1,1, msgpuff,(WORD)(WARTEZEIT&0xffff),(WORD)(WARTEZEIT>>16), &dummy,&dummy,&dummy,&dummy,&dummy,&dummy); if ( ereignis&MU_TIMER ) { if ((fd=Fopen(DATEI,1))>0) { syszeit.realtime=Gettime(); mach_roh(fz_roh,&syszeit); Fdatime(fz_roh,fd,1); Fclose(fd); iercnt=0; } else if ( iercnt<1) { BYTE zahl[8]; intochar(zahl,fd); { BYTE tt[100]; strcpy(tt,"[3][**** Autozeit ****|Datei DATEI |ist nicht beschreibbar!|Erg. Fopen="); strcat(tt,zahl); strcat(tt,"][ Žndern! ]"); form_alert(1,tt); iercnt++; } } else /* 2 Fehler -> autozeit passivieren, bis per Men wieder angeklickt! */ { form_alert(1, "[3][**** Autozeit ****|Abgeschaltet!!!|aktiv.: im Desktop anklicken!][OK]"); ereignis_maske &= ~MU_TIMER; } } /* Eintrag angeklickt */ if ( (ereignis &MU_MESAG)&&(msgpuff[0]==40)&&(msgpuff[4]==eintrag) ) { form_alert(1, "[1][Autozeit V2R2 ( MSt” 6.1.89 )|Setzt Systemzeit entsprechend|Datum von D:\\Autozeit.zei][OK]"); ereignis_maske |= MU_TIMER; } } #ifdef MDEBUG } #endif } }