1    | /*
2    |  * $Log: jm.c,v $
3    |  * Revision 1.4  2003/12/23 05:58:28  nzmb
4    |  * Small cosmetic improvement to the timeleft function.
5    |  *
6    |  * Revision 1.3  2003/02/17 15:39:21  millis
7    |  * bug 10, prevent overlapping absences
8    |  * Also improve text output for absences.
9    |  *
10   |  * Revision 1.2  2002/05/04 02:06:18  nzmb
11   |  * Added code to display the time left until the deadline and grace at the
12   |  * bottom of their reply whenever a player signs on.
13   |  *
14   |  * Revision 1.1  1998/02/28 17:49:42  david
15   |  * Initial revision
16   |  *
17   |  * Revision 1.1  1996/10/20 12:29:45  rpaar
18   |  * Morrolan v9.0
19   |  */
20   | 
21   | /*  jm.c
22   |  *  Copyright 1987, Lowe.
23   |  *
24   |  *  Redistribution and use in source and binary forms are permitted
25   |  *  provided that it is for non-profit purposes, that this and the 
26   |  *  above notices are preserved and that due credit is given to Mr.
27   |  *  Lowe.
28   |  */
29   | 
30   | #include <stdio.h>
31   | #include <stdlib.h>
32   | #include <string.h>
33   | #include <time.h>
34   | 
35   | #include "functions.h"
36   | 
37   | static long offset = -1L;
38   | 
39   | int jm(char *p, long *t)
40   | {
41   | 
42   | 	/* TODO: use strptime */
43   | 
44   | 	/*  Compute the number of seconds since Jan 1st 1970 GMT
45   | 	 *  p = ascii date in standard format: Wed Dec 30 12:30:40 1994
46   | 	 *  
47   | 	 *  Return value is zero if everything was okay.
48   | 	 */
49   | 
50   | #define magic(m,d,y)  (d-32075L+1461L*(y+4800L+(m-14L)/12L)/4L       \
51   |                        +367L*(m-2L-(m-14L)/12L*12L)/12L-3L*((y+4900L \
52   |                        +(m-14L)/12L)/100L)/4L)
53   | #define jd(m,d,y)     (magic((long)m,(long)d,(long)y)-magic(1L,1L,1970L))
54   | 
55   | 	long temp;
56   | 
57   | 	int mon, day, year, hour, min, sec;
58   | 	static char *months[] =
59   | 	{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
60   | 	 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
61   | 
62   | 	if (offset == -1L) {
63   | 		offset = 0L;
64   | 		time(&temp);
65   | 		if (jm(ctime(&temp), &offset)) {
66   | 			printf("Internal error in date format!\n");
67   | 			bailout(1);
68   | 		}
69   | 		offset = temp - offset;
70   | 	}
71   | 	for (mon = 1; mon <= 12; mon++)
72   | 		if (!strncmp(&p[4], months[mon - 1], 3))
73   | 			break;
74   | 
75   | 	if (mon > 12)
76   | 		return 1;
77   | 
78   | 	if (sscanf(&p[8], "%d %d:%d:%d %d", &day, &hour, &min, &sec, &year) != 5)
79   | 		return 1;
80   | 
81   | 	temp = 60L * (60L * (24L * (long) jd(mon, day, year) +
82   | 			(long) hour) + (long) min) + (long) sec + offset;
83   | 
84   | 	if (offset)
85   | 		switch (atoi(ctime(&temp) + 11) - hour) {	/* Adjust for Daylight Savings */
86   | 		case 0:
87   | 			break;
88   | 		case 1:
89   | 		case -23:
90   | 			temp -= 3600L;
91   | 			break;
92   | 		case -1:
93   | 		case 23:
94   | 			temp += 3600L;
95   | 			break;
96   | 		default:
97   | 			return 2;
98   | 		}
99   | 	*t = temp;
100  | 	return 0;
101  | }
102  | 
103  | /*
104  |  * TODO reformat this time to order the args intelligently, i.e.
105  |  * in some sort of ISO time format
106  |  */
107  | char *ptime(time_t * time)
108  | {
109  | 	/*
110  | 	 *  Return a time in format understandable as a deadline.
111  | 	 */
112  | 	static char text[32];
113  | 	struct tm *lt;
114  | 
115  | 	lt = localtime(time);
116  | 	strftime(text, sizeof(text), "%a %b %d %Y %H:%M:%S %z", lt);
117  | 	return text;
118  | }
119  | 
120  | char *abs_time(time_t * time)
121  | {
122  |         /*
123  |          *  Return a time in format understandable as a deadline.
124  |          */
125  |         static char text[32];
126  |         struct tm *lt;
127  | 
128  |         lt = localtime(time);
129  |         strftime(text, sizeof(text), "%b %d %Y %H:%M:%S", lt);
130  |         return text;
131  | }
132  | char *timeleft(time_t *deadline)
133  | {
134  | 	time_t now, diff;
135  | 	int days;
136  | 	int hours;
137  | 	int minutes;
138  | 	int seconds;
139  | 	static char text[100];
140  | 
141  | 	now = time(NULL);
142  | 	diff = *deadline - now;
143  | 	days = diff/(60*60*24);
144  | 	diff = diff - (days*60*60*24);
145  | 	hours = diff/(60*60);
146  | 	diff = diff - (hours*60*60);
147  | 	minutes = diff/60;
148  | 	diff = diff - (minutes*60);
149  | 	seconds = diff; /* yes this is unnecessary, but it makes to code readable :-) */
150  | 
151  | 	sprintf(text,"%d day%s, %d hour%s, %d minute%s, and %d second%s",
152  | 		days, days == 1 ? "" : "s", hours, hours == 1 ? "" : "s",
153  | 		minutes, minutes == 1 ? "" : "s", seconds, seconds == 1 ? "" : "s");
154  | 	return text;
155  | }
156  |