/*
	A Simple Birthday Reminder
	9.5.2006 by Matthias Ableitner, http://abma.de/
	19.5.2006 fixed a typo

*/


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

#define REMINDER_FILE "REMINDER_FILE"
#define BUFSIZE 1024
// Days to check before current date for birthdays
#define CHECK_BEFORE 1
// Days to check after current date
#define CHECK_AFTER 14


int calc(unsigned int tag,unsigned int monat){
        time_t rawtime; 
        struct tm ttime;
	struct tm tbday;
	
	time(&rawtime);
        localtime_r(&rawtime,&ttime);
	localtime_r(&rawtime,&tbday);
	tbday.tm_mday=tag; /*1-31*/
	tbday.tm_mon=monat-1; /*0-11*/

	tbday.tm_sec=0; /*verschiebung vermeiden*/
	tbday.tm_min=0;
	tbday.tm_hour=0;
	tbday.tm_wday=0;
	tbday.tm_yday=0;
	tbday.tm_isdst=0;

	
	mktime(&tbday); /*tm_yday neu berechnen*/
	mktime(&ttime);

	if ((tbday.tm_yday+CHECK_BEFORE>=ttime.tm_yday) &&
		(tbday.tm_yday<ttime.tm_yday+CHECK_AFTER)) /*only the next 10 days*/
		return 0;
	else
		return -1;

}

int parse(char*line){
	char name[BUFSIZE];
	unsigned int tag,monat,jahr;
	int ret;
	ret=sscanf(line,"%d.%d.%d %[^\n]",&tag,&monat,&jahr,&name); /*daten auslesen*/
	if ((ret!=4) || (tag<1) || (tag>31) || (monat<1) || (monat>12) || (jahr<1900)||(jahr>3000)){
		printf("Warning: Line not understood: %s %d",line,ret);
		return -1;
	}else
		if (calc(tag,monat)==0)
			printf("%s",line);
	return 0;		
}

int main(int argc, char ** args){
	char * file;
	FILE* fhandle;
	file=getenv(REMINDER_FILE);
	if (file==NULL){
		if (argc==2){
			file=args[1];
		}else{
			printf("Usage: %s path/to/filename\n",args[0]);
			printf("or set as env %s\n",REMINDER_FILE);
			return -1;
		}
			
	}
	fhandle=fopen(file,"r");
	if (fhandle!=NULL){
		int count=0;
		while(!feof(fhandle)){
			char line[BUFSIZE];
			char c;
			char*pos;
			pos=fgets(line,BUFSIZE,fhandle);
			count++;
			c=line[0];
			if (pos!=NULL)
			switch(c){
				case 0:case '#':case ';':case ' ':case '\r':case '\n': case -17: /*-17 is utf8 encoding*/
					//printf("Kommentar\n");	
					break;
				case '0':case '1':case'2':case'3': /*daten beginnen mit 0,1,2,3*/
					parse((char*)&line);
					break;
				default:
					printf("Line %d: Unknown Character %c %d\n",count,c,c);
	
			}
		}
	        fclose(fhandle);

	}else{
		printf("Couldn't open %s\n",file);
		return -1;
	}
	return 0;
}


