Source file: /~heha/hs/Termini.zip/src/Termini.c

/* 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