|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 6787 (0x1a83) Types: TextFile Names: »time.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/month/time.c«
/* * Modification History * * Origional Author: Tom Stoehn@Tektronics[zeus!tims] Modifications by: Marc * Ries@TRW[trwrb!ries] * */ #ifdef BSD # include <sys/time.h> #else #include <sys/types.h> # include <time.h> #endif #include <ctype.h> #ifdef BSD # undef tolower # undef toupper #endif #include "month.h" #ifdef BSD char *timezone(); #else extern char *tzname[]; #endif short month, year, day; short this_month, this_day, this_year; short start_day; long time(); extern short dhour, dminute, dsecond, days; get_current_date() { struct tm *tmp, /* Time structure, see CTIME(3C) */ *localtime(); long junk; /* time in seconds.... */ #ifdef BSD struct timeval tp; struct timezone tzp; #endif #ifdef BSD (void) gettimeofday(&tp, &tzp); junk = tp.tv_sec; #else junk = (long) time(0); /* this must be here for it to work! */ #endif tmp = localtime(&junk); year = this_year = 1900 + tmp->tm_year; month = this_month = tmp->tm_mon + 1; day = this_day = tmp->tm_mday; dhour = tmp->tm_hour; dminute = tmp->tm_min; dsecond = tmp->tm_sec; start_day = get_start_day(this_month, this_year); } jan1(year) register year; { register day; day = 4 + year + (year + 3) / 4; if (year > 1800) { day -= (year - 1701) / 100; day += (year - 1601) / 400; } if (year > 1752) day += 3; return (day % 7); } is_leap_year(year) int year; { int day; day = jan1(year); return ((((jan1(year + 1) + 7 - day) % 7) == 2) ? 1 : 0); } get_start_day(month, year) register month, year; { short day, i; day = jan1(year); for (i = 1; i < month; i++) { day = (day + days_in(i, year)) % 7; } return (day); } days_in(month, year) register month, year; { int days; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: days = 28 + is_leap_year(year); break; } return (days); } is_passed_event(event) struct event_rec *event; { if (event->monthly || event->yearly || event->every || (event->event_year > this_year)) { return (0); } if (event->event_year < this_year) { return (1); } /* now we know it's this year */ if (event->event_month > this_month) { return (0); } if (event->event_month < this_month) { return (1); } /* now we know it's this month */ if (event->event_day < this_day) { return (1); } return (0); } is_before(m, d, y, month, day, year) register m, d, y, month, day, year; { if (y < year) { return (1); } if (y > year) { return (0); } if (m < month) { return (1); } if (m > month) { return (0); } if (d < day) { return (1); } return (0); } has_smtwtfs(smtwtfs) register char *smtwtfs; { register i; for (i = 0; i < 7; i++) { if (smtwtfs[i]) { return (1); } } return (0); } event_matches_date(event) register struct event_rec *event; { short last; int n; /* check if current date is before start date of event */ if (is_before(month, day, year, event->event_month, event->event_day, event->event_year)) { return (0); } /* one time events */ if ((event->event_year == year) && (event->event_month == month) && (event->event_day == day) && !event->every && !event->nth_is_on && !event->last) { return (1); } /* once monthly or once yearly events */ if (!event->every && !event->nth_is_on && !event->last) { if (event->monthly) { if (event->event_day == day) { return (1); } } else if (event->yearly) { if ((event->event_month == month) && (event->event_day == day)) { return (1); } } } if ((event->monthly || event->yearly) && !event->every && !event->nth_is_on && !event->last) { if (event->monthly && (event->event_day == day)) { return (1); } if (event->yearly && (event->event_month == month) && (event->event_day == day)) { return (1); } } if (!event->smtwtfs[(day - 1 + start_day) % 7]) { return (0); } /* everys */ if (event->every) { /* every smtwtf */ if (!event->nth_is_on && !event->last) { EVDAY: if (event->smtwtfs[((day - 1 + start_day) % 7)]) { return (1); } return (0); } /* every monthly/yearly */ if (event->monthly || event->yearly) { /* every monthly not-1st2nd3rdlast */ if (!event->nth_is_on && !event->last) { goto EVDAY; } /* every monthly/yearly with one of 1st2nd3rdlast */ if (event->nth_is_on) { if (event->monthly && (nth_smtwtfs_of_month(&last) == (event->nth - 1))) { return (1); } if (event->yearly && (nth_smtwtfs_of_year(&last) == (event->nth - 1))) { return (1); } } if (event->last) { if (event->monthly) { (void) nth_smtwtfs_of_month(&last); if (last) { return (1); } } if (event->yearly) { (void) nth_smtwtfs_of_year(&last); if (last) { return (1); } } } } else { /* every not-monthly and not-yearly */ if (!event->nth_is_on && !event->last) { goto EVDAY; } /* every nth/dayofweek */ if (event->nth == 1) { return (1); } n = how_many_since(event->event_month, event->event_day, event->event_year); if ((n % (event->nth)) == 1) { return (1); } } } return (0); } nth_smtwtfs_of_month(last) short *last; { *last = ((day + 7) > days) ? 1 : 0; return ((day - 1) / 7); } nth_smtwtfs_of_year(last) short *last; { short days, i; for (i = 1, days = day; i < month; i++) { days += days_in(i, year); } *last = ((days + 7) > (365 + is_leap_year(year))) ? 1 : 0; return ((days - 1) / 7); } how_many_since(m, d, y) int m, d, y; { register total_days_passed; int i; if (y < year) { total_days_passed = 0; for (i = m; i <= 12; i++) { total_days_passed += days_in(i, y); } total_days_passed -= (d - 1); for (i = (y + 1); i < year; i++) { total_days_passed += (365 + is_leap_year(i)); } for (i = 1; i < month; i++) { total_days_passed += days_in(i, year); } total_days_passed += day; } else if (m == month) { total_days_passed = day - d + 1; } else { total_days_passed = 1 - d; for (i = m; i < month; i++) { total_days_passed += days_in(i, year); } total_days_passed += day; } return ((((total_days_passed - 1) / 7) + 1)); } days_since_jan1(month, day, year) { int days = 0, i; for (i = 1; i < month; i++) { days += days_in(i, year); } days += day; return (days); }