rewind => trewind (for ANSI C)
[unix-history] / usr / src / sbin / dump / unctime.c
CommitLineData
76797561
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
bbbe213d 7#ifndef lint
76797561
DF
8static char sccsid[] = "@(#)unctime.c 5.1 (Berkeley) %G%";
9#endif not lint
bbbe213d 10
6e1fe29b 11#include <sys/types.h>
56140c8b 12#include <sys/time.h>
50953c5b 13#include <stdio.h>
6e1fe29b
BJ
14/*
15 * Convert a ctime(3) format string into a system format date.
16 * Return the date thus calculated.
17 *
18 * Return -1 if the string is not in ctime format.
19 */
20
21/*
22 * Offsets into the ctime string to various parts.
23 */
24
25#define E_MONTH 4
26#define E_DAY 8
27#define E_HOUR 11
28#define E_MINUTE 14
29#define E_SECOND 17
30#define E_YEAR 20
31
32time_t unctime(str)
33 char *str;
34{
35 struct tm then;
36 char dbuf[30];
37 time_t emitl();
38
39 if (strlen(str) != 25)
40 str[25] = 0;
41 strcpy(dbuf, str);
42 dbuf[E_MONTH+3] = 0;
50953c5b 43 if ( (then.tm_mon = lookup(&dbuf[E_MONTH])) < 0) {
6e1fe29b 44 return(-1);;
50953c5b 45 }
6e1fe29b
BJ
46 then.tm_mday = atoi(&dbuf[E_DAY]);
47 then.tm_hour = atoi(&dbuf[E_HOUR]);
48 then.tm_min = atoi(&dbuf[E_MINUTE]);
49 then.tm_sec = atoi(&dbuf[E_SECOND]);
50 then.tm_year = atoi(&dbuf[E_YEAR]) - 1900;
51 return(emitl(&then));
52}
53
54static char months[] =
55 "JanFebMarAprMayJunJulAugSepOctNovDec";
56
57static
58lookup(str)
59 char *str;
60{
61 register char *cp, *cp2;
62
63 for (cp = months, cp2 = str; *cp != 0; cp += 3)
64 if (strncmp(cp, cp2, 3) == 0)
65 return((cp-months) / 3);
66 return(-1);
67}
68/*
69 * Routine to convert a localtime(3) format date back into
70 * a system format date.
71 *
72 * Use a binary search.
73 */
74
75struct tm *localtime();
76
77time_t emitl(dp)
78 struct tm *dp;
79{
80 time_t conv;
81 register int i, bit;
82 struct tm dcopy;
83
84 dcopy = *dp;
85 dp = &dcopy;
86 conv = 0;
50953c5b 87 for (i = 30; i >= 0; i--) {
6e1fe29b
BJ
88 bit = 1 << i;
89 conv |= bit;
90 if (dcmp(localtime(&conv), dp) > 0)
91 conv &= ~bit;
92 }
93 return(conv);
94}
95
96/*
97 * Compare two localtime dates, return result.
98 */
99
100#define DECIDE(a) \
101 if (dp->a > dp2->a) \
102 return(1); \
103 if (dp->a < dp2->a) \
104 return(-1)
105
106static
107dcmp(dp, dp2)
108 register struct tm *dp, *dp2;
109{
110
111 DECIDE(tm_year);
112 DECIDE(tm_mon);
113 DECIDE(tm_mday);
114 DECIDE(tm_hour);
115 DECIDE(tm_min);
116 DECIDE(tm_sec);
117 return(0);
118}