-
Notifications
You must be signed in to change notification settings - Fork 0
/
emitc
145 lines (137 loc) · 5.1 KB
/
emitc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
Subject: v15i032: Routine to process ctime(3) output
Newsgroups: comp.sources.unix
Sender: sources
Approved: rsalz@uunet.UU.NET
Submitted-by: Mike Marshall <hubcap@hubcap.clemson.edu>
Posting-number: Volume 15, Issue 32
Archive-name: emitc
[ This is one of those "oh yeah, how could this not be there" routines.
The name is clever, and works on two levels. --r$ ]
There may be other programs in the archives that do this, but when I was
looking around all I could find was the enormously complicated "getdate"
that is included with the news source, and the proprietary "unctime" which
comes with the BSD source. This program (emitc) is a simple minded hack
comparatively, but it works, is small, and is no slower than "unctime".
I would guess it is more or less portable. Don't forget to change the
value of TIMEZONE if necessary (see the comments in the code).
-Mike Marshall hubcap@hubcap.clemson.edu ...!hubcap!hubcap
#! /bin/sh
#
# This is a shell archive. Save this into a file, edit it
# and delete all lines above this comment. Then give this
# file to sh by executing the command "sh file". The files
# will be extracted into the current directory owned by
# you with default permissions.
#
# The files contained herein are:
#
echo 'x - emitc.man'
if test -f emitc.man; then echo 'shar: not overwriting emitc.man'; else
sed 's/^X//' << '________This_Is_The_END________' > emitc.man
X.TH emitc 3
X.SH NAME
Xemitc \- convert ctime formatted ascii date string to long integer
X.SH SYNTAX
X.PP
X.nf
X
Xlong emitc(string)
Xchar *string;
X.SH DESCRIPTION
X.PP
XThe
X.PN emitc
Xcall converts a 25 character string (in the following form: Fri Apr 22 09:45:15
X1988\\n),
Xpointed to by
X.PN string,
Xinto a long integer representing the time in seconds since
X00:00:00 GMT, January 1, 1970,
Xand returns that value.
X.SH AUTHOR
X.PP
XMike Marshall hubcap@hubcap.clemson.edu 04/20/88
________This_Is_The_END________
if test `wc -l < emitc.man` -ne 23; then
echo 'shar: emitc.man was damaged during transit (should have been 23 bytes)'
fi
fi ; : end of overwriting check
echo 'x - emitc.c'
if test -f emitc.c; then echo 'shar: not overwriting emitc.c'; else
sed 's/^X//' << '________This_Is_The_END________' > emitc.c
X/* emitc - as the name implies, emitc is the opposite of ctime(3).
X . ctime(3) eats a long integer which represents the number of seconds
X . since Jan 01 00:00:00 1970 and spits out the corresponding day, date
X . and time in ascii. emitc ingests an ascii string (formatted as per
X . ctime's output) and gives back the appropriate number of seconds.
X .
X . Anyone is free to use emitc anyway they please, but if you do deem
X . it worthwhile, leave the following credit line somewhere in the code:
X .
X . AUTHOR - Mike Marshall hubcap@hubcap.clemson.edu 4/20/88
X .
X . SYSTEM CALLS USED - none
X .
X . LIBRARY FUNCTIONS USED - localtime(3)
X */
X#include <time.h>
X#define MONTH_OFFSET 4
X#define DAY_OFFSET 8
X#define HOUR_OFFSET 11
X#define MINUTE_OFFSET 14
X#define SECOND_OFFSET 17
X#define YEAR_OFFSET 20
X#define MONTH_LENGTH 3
X#define MONTHS "JanFebMarAprMayJunJulAugSepOctNovDec"
X#define SECONDS_PER_YEAR 31536000
X#define SECONDS_PER_DAY 86400
X#define SECONDS_PER_HOUR 3600
X#define SECONDS_PER_MINUTE 60
X#define FEB 1
X#define TIMEZONE 5 /* You gotta change this, depending on where you
X . are located geographically. I equated TIMEZONE
X . to 5 since I am in the Eastern Standard Time Zone,
X . which is five hours west of Greenwich.
X */
X
Xlong emitc(string)
Xchar *string;
X{
X struct tm *time;
X long fudge_days;
X long month_num;
X long clock;
X static char *months = MONTHS;
X static long days_so_far[11] = {31,59,90,120,151,181,212,243,273,304,334};
X /* determine month number */
X for (month_num=0;
X strncmp(string+MONTH_OFFSET,months+month_num*MONTH_LENGTH,MONTH_LENGTH);
X month_num++);
X /* determine the number of seconds since the beginning of the universe */
X clock = (atoi(string+YEAR_OFFSET)-1970) * SECONDS_PER_YEAR;
X if (month_num > 0)
X clock = clock + days_so_far[month_num-1] * SECONDS_PER_DAY;
X clock = clock + (atoi(string+DAY_OFFSET)-1) * SECONDS_PER_DAY;
X clock = clock + atoi(string+HOUR_OFFSET) * SECONDS_PER_HOUR;
X clock = clock + atoi(string+MINUTE_OFFSET) * SECONDS_PER_MINUTE;
X clock = clock + atoi(string+SECOND_OFFSET);
X /* calculate in the leap year fudge factors */
X if (atoi(string+YEAR_OFFSET) > 1971) {
X fudge_days=0;
X fudge_days = (atoi(string+YEAR_OFFSET)-1971)/4;
X if (!(atoi(string+YEAR_OFFSET)%4) && (month_num > FEB)) fudge_days++;
X clock = clock + fudge_days*SECONDS_PER_DAY;
X }
X /* calculate in the time shift westward from Greenwich */
X clock = clock + TIMEZONE*SECONDS_PER_HOUR;
X /* worry about daylight savings time */
X time = localtime(&clock);
X if (time->tm_isdst) clock = clock - SECONDS_PER_HOUR;
X return(clock);
X}
________This_Is_The_END________
if test `wc -l < emitc.c` -ne 70; then
echo 'shar: emitc.c was damaged during transit (should have been 70 bytes)'
fi
fi ; : end of overwriting check
exit 0