version 1.2, 2006/03/09 16:53:56 |
version 1.3, 2006/04/13 19:16:15 |
|
|
#include "log.h" |
#include "log.h" |
#include "rcs.h" |
#include "rcs.h" |
|
|
|
void |
struct tm * |
rcs_set_tz(char *tz, struct rcs_delta *rdp, struct tm *tb) |
rcs_set_tz(char *tz, struct rcs_delta *rdp) |
|
{ |
{ |
int tzone; |
int tzone; |
|
int neg, pos; |
char *h, *m; |
char *h, *m; |
struct tm *tb, ltb; |
struct tm *ltb; |
time_t now; |
time_t now; |
|
|
tb = &rdp->rd_date; |
|
|
|
if (!strcmp(tz, "LT")) { |
if (!strcmp(tz, "LT")) { |
now = mktime(&rdp->rd_date); |
now = mktime(&rdp->rd_date); |
tb = localtime(&now); |
ltb = localtime(&now); |
tb->tm_hour += ((int)tb->tm_gmtoff/3600); |
ltb->tm_hour += ((int)ltb->tm_gmtoff/3600); |
|
memcpy(tb, ltb, sizeof(struct tm)); |
} else { |
} else { |
|
neg = pos = 0; |
switch (*tz) { |
switch (*tz) { |
case '-': |
case '-': |
case '+': |
neg = 1; |
break; |
break; |
|
case '+': |
|
pos = 1; |
|
break; |
default: |
default: |
fatal("%s: not a known time zone", tz); |
fatal("%s: not a known time zone", tz); |
} |
} |
|
|
h = tz; |
h = (tz + 1); |
if ((m = strrchr(tz, ':')) != NULL) |
if ((m = strrchr(tz, ':')) != NULL) |
*(m++) = '\0'; |
*(m++) = '\0'; |
|
|
ltb = rdp->rd_date; |
memcpy(tb, &rdp->rd_date, sizeof(struct tm)); |
tb = <b; |
|
|
|
tzone = atoi(h); |
tzone = atoi(h); |
if ((tzone >= 24) && (tzone <= -24)) |
if ((tzone >= 24) && (tzone <= -24)) |
fatal("%s: not a known time zone", tz); |
fatal("%s: not a known time zone", tz); |
|
|
tb->tm_hour += tzone; |
if (pos) { |
if ((tb->tm_hour >= 24) && (tb->tm_hour <= -24)) |
tb->tm_hour += tzone; |
|
tb->tm_gmtoff += (tzone * 3600); |
|
} else { |
|
tb->tm_hour -= tzone; |
|
tb->tm_gmtoff -= (tzone * 3600); |
|
} |
|
|
|
if ((tb->tm_hour >= 24) || (tb->tm_hour <= -24)) |
tb->tm_hour = 0; |
tb->tm_hour = 0; |
|
|
tb->tm_gmtoff += (tzone*3600); |
|
|
|
if (m != NULL) { |
if (m != NULL) { |
tzone = atoi(m); |
tzone = atoi(m); |
if (tzone >= 60) |
if (tzone >= 60) |
|
|
|
|
if ((tb->tm_min + tzone) >= 60) { |
if ((tb->tm_min + tzone) >= 60) { |
tb->tm_hour++; |
tb->tm_hour++; |
tb->tm_min -= tzone; |
tb->tm_min -= (60 - tzone); |
} else |
} else |
tb->tm_min += tzone; |
tb->tm_min += tzone; |
|
|
tb->tm_gmtoff += (tzone*60); |
tb->tm_gmtoff += (tzone*60); |
} |
} |
} |
} |
|
|
return (tb); |
|
} |
} |