/* Klitzekleines Geburtstags- und Termin-Erinnerungsprogramm
* Alle Eintragungen von Hand in Termini.ini vornehmen!
* Kodierung: UTF-8 (geändert gegenüber 16-Bit-Version)
*/
#include <windows.h>
#include <shlwapi.h>
#define T(x) TEXT(x)
#define elemof(x) ARRAYSIZE(x)
#ifndef _cplusplus
typedef enum {false,true} bool;
#endif
static TCHAR fn[MAX_PATH]; /* Puffer für INI-Dateiname */
static SYSTEMTIME date; /* Puffer fürs Datum */
static TCHAR key[16]; /* Schlüsselname */
/* <date> in Zugriffsschlüssel <key> wandeln */
PTSTR GenKey(bool mitJahr) {
wsprintf(key,mitJahr ? T("%02u.%02u.%04u") : T("%02u.%02u."),
date.wDay,date.wMonth,date.wYear);
return key;
}
void _cdecl MsgBox(PCTSTR t,...) {
TCHAR s[512];
va_list va;
va_start(va,t);
wvsprintf(s,t,va);
#ifdef UNICODE
MessageBox(0,s,L"Termini",MB_OK);
#else
{WCHAR s2[512];
MultiByteToWideChar(CP_UTF8,0,s,-1,s2,elemof(s2));
MessageBoxW(0,s2,L"Termini",MB_OK);
}
#endif
}
void Zeig_Geburtstage(PCTSTR Tag) {
TCHAR n[MAX_PATH];
/* Möglichen Geburtstag abfragen */
if (GetPrivateProfileString(T("Geburtstage"),GenKey(false),T(""),n,elemof(n),fn)) {
MsgBox(T("%s hat %s Geburtstag!"),Tag,n);
}
date.wDayOfWeek=date.wYear; /* Missbrauch: Jetziges Jahr */
for (date.wYear=1900; date.wYear<date.wDayOfWeek; date.wYear++) {
/* Mögliche Geburtstage abfragen */
if (GetPrivateProfileString(T("Geburtstage"),GenKey(true),T(""),n,elemof(n),fn)) {
MsgBox(T("%s hat %s den %u. Geburtstag!"),Tag,n,date.wDayOfWeek-date.wYear);
} /* Den 0. Geburtstag gibt es hier nicht. */
}
}
void Termin(PCTSTR Tag) {
TCHAR n[MAX_PATH];
if (GetPrivateProfileString(T("sonstige Termini"),key,T(""),n,elemof(n),fn)) {
MsgBox(T("%s ist folgender Termin:\n\n%s."),Tag,n);
}
}
void Zeig_Termine(PCTSTR Tag) {
/* Termin ohne Jahr abfragen */
GenKey(false);
Termin(Tag);
/* Termin mit Jahr abfragen */
GenKey(true);
Termin(Tag);
}
void Inc_Datum(void) {
union{
FILETIME t;
__int64 l;
}ft;
SystemTimeToFileTime(&date,&ft.t);
ft.l+=(__int64)24*60*60*10000000;
FileTimeToSystemTime(&ft.t,&date);
}
bool Heute_gerufen(void) {
TCHAR n[16];
GenKey(true);
GetPrivateProfileString(T("Einstellungen"),T("Letzter Aufruf"),T(""),n,elemof(n),fn);
if (lstrcmpi(key,n)) {
WritePrivateProfileString(T("Einstellungen"),T("Letzter Aufruf"),key,fn);
return false;
}
return true;
}
void WINAPI WinMainCRTStartup() {
/* Irgendein Kommandozeilenschalter aktiviert Permanent-Modus */
int waitseconds=StrToInt(PathGetArgs(GetCommandLine()));
/* INI-Dateiname mit Pfad beschaffen */
lstrcpy(fn+GetModuleFileName(0,fn,elemof(fn))-3,T("ini"));
do{
/* Datum beschaffen */
GetLocalTime(&date);
if (!Heute_gerufen()) {
/* Etwas warten (wegen Bootvorgang) */
Sleep(5000);
/* Messageboxen zeigen */
Zeig_Geburtstage(T("Heute"));
Inc_Datum();
Zeig_Geburtstage(T("Morgen"));
Inc_Datum();
#ifdef UNICODE
Zeig_Geburtstage(L"Übermorgen");
#else
Zeig_Geburtstage("\xC3\x9C""bermorgen");
#endif
GetLocalTime(&date);
Zeig_Termine(T("Heute"));
Inc_Datum();
Zeig_Termine(T("Morgen"));
}
Sleep(1000*waitseconds);
}while(waitseconds);
ExitProcess(0);
}
Detected encoding: ASCII (7 bit) | 8
|