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 |