Fruit's git repositories f00f / arglozer tm.c
arglozer

Tree @arglozer (Download .tar.gz)

tm.c @arglozerraw · history · blame

#include <time.h>

#include "f00f.h"

struct tm maaktm(int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) {
	struct tm tm;
	
	tm.tm_sec = sec;
	tm.tm_min = min;
	tm.tm_hour = hour;
	tm.tm_mday = mday;
	tm.tm_mon = mon;
	tm.tm_year = year;
	tm.tm_wday = wday;
	tm.tm_yday = yday;
	tm.tm_isdst = isdst;
	
	return tm;
}

struct tm samentm(struct tm a, struct tm b) {
	struct tm tm;

	tm = a;
	
	if(b.tm_sec != -1)
		tm.tm_sec = b.tm_sec;
	if(b.tm_min != -1)
		tm.tm_min = b.tm_min;
	if(b.tm_hour != -1)
		tm.tm_hour = b.tm_hour;
	if(b.tm_mday != -1)
		tm.tm_mday = b.tm_mday;
	if(b.tm_mon != -1)
		tm.tm_mon = b.tm_mon;
	if(b.tm_year != -1)
		tm.tm_year = b.tm_year;
	if(b.tm_wday != -1)
		tm.tm_wday = b.tm_wday;
	if(b.tm_yday != -1)
		tm.tm_yday = b.tm_yday;
	if(b.tm_isdst != -1)
		tm.tm_isdst = b.tm_isdst;
	
	return tm;
}

time_t fixtm(struct tm tm, time_t nu) {
	struct tm nutm, tmp;
	time_t t;

	localtime_r(&nu, &nutm);
	tmp = samentm(nutm, tm);
	t = mktime(&tmp);
	localtime_r(&t, &tmp);

	if(tm.tm_wday != -1) {
		if(tm.tm_mday != -1) {
			if(tmp.tm_wday != tm.tm_wday)
				return -1;
		} else {
			tmp.tm_mday += tm.tm_wday - tmp.tm_wday + (tm.tm_wday <= tmp.tm_wday ? 7 : 0);
		}
	} else {
		if(tm.tm_mday != -1 && tmp.tm_mday != tm.tm_mday)
			return -1;
	}
		
	
	return mktime(&tmp);
}