~ubuntu-branches/ubuntu/oneiric/9base/oneiric

« back to all changes in this revision

Viewing changes to lib9/tm2sec.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2009-08-20 17:34:06 UTC
  • mfrom: (6.2.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090820173406-xpwqa9ruyevvc0ut
Tags: 1:3-3
* Updating maintainer field.
* Updating vcs fields.
* Updating package to standards version 3.8.3.
* Updatin variables writing in rules to consistent style.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <u.h>
 
2
#include <libc.h>
 
3
 
 
4
#include "zoneinfo.h"
 
5
 
 
6
#define SEC2MIN 60L
 
7
#define SEC2HOUR (60L*SEC2MIN)
 
8
#define SEC2DAY (24L*SEC2HOUR)
 
9
 
 
10
/*
 
11
 *  days per month plus days/year
 
12
 */
 
13
static  int     dmsize[] =
 
14
{
 
15
        365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
 
16
};
 
17
static  int     ldmsize[] =
 
18
{
 
19
        366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
 
20
};
 
21
 
 
22
/*
 
23
 *  return the days/month for the given year
 
24
 */
 
25
static int *
 
26
yrsize(int y)
 
27
{
 
28
        if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0))
 
29
                return ldmsize;
 
30
        else
 
31
                return dmsize;
 
32
}
 
33
 
 
34
/*
 
35
 * compute seconds since Jan 1 1970 GMT
 
36
 * and convert to our timezone.
 
37
 */
 
38
long
 
39
tm2sec(Tm *tm)
 
40
{
 
41
        Tinfo ti0, ti1, *ti;
 
42
        long secs;
 
43
        int i, yday, year, *d2m;
 
44
 
 
45
        secs = 0;
 
46
 
 
47
        /*
 
48
         *  seconds per year
 
49
         */
 
50
        year = tm->year + 1900;
 
51
        for(i = 1970; i < year; i++){
 
52
                d2m = yrsize(i);
 
53
                secs += d2m[0] * SEC2DAY;
 
54
        }
 
55
 
 
56
        /*
 
57
         *  if mday is set, use mon and mday to compute yday
 
58
         */
 
59
        if(tm->mday){
 
60
                yday = 0;
 
61
                d2m = yrsize(year);
 
62
                for(i=0; i<tm->mon; i++)
 
63
                        yday += d2m[i+1];
 
64
                yday += tm->mday-1;
 
65
        }else{
 
66
                yday = tm->yday;
 
67
        }
 
68
        secs += yday * SEC2DAY;
 
69
 
 
70
        /*
 
71
         * hours, minutes, seconds
 
72
         */
 
73
        secs += tm->hour * SEC2HOUR;
 
74
        secs += tm->min * SEC2MIN;
 
75
        secs += tm->sec;
 
76
 
 
77
        /*
 
78
         * Assume the local time zone if zone is not GMT
 
79
         */
 
80
        if(strcmp(tm->zone, "GMT") != 0) {
 
81
                i = zonelookuptinfo(&ti0, secs);
 
82
                ti = &ti0;
 
83
                if (i != -1)
 
84
                if (ti->tzoff!=0) {
 
85
                        /*
 
86
                         * to what local time period `secs' belongs?
 
87
                         */
 
88
                        if (ti->tzoff>0) {
 
89
                                /*
 
90
                                 * east of GMT; check previous local time transition
 
91
                                 */
 
92
                                if (ti->t+ti->tzoff > secs)
 
93
                                if (zonetinfo(&ti1, i-1)!=-1)
 
94
                                        ti = &ti1;
 
95
                        } else
 
96
                                /*
 
97
                                 * west of GMT; check next local time transition
 
98
                                 */
 
99
                                if (zonetinfo(&ti1, i+1))
 
100
                                if (ti1.t+ti->tzoff < secs)
 
101
                                        ti = &ti1;
 
102
//                      fprint(2, "tt: %ld+%d %ld\n", (long)ti->t, ti->tzoff, (long)secs);
 
103
                        secs -= ti->tzoff;
 
104
                }
 
105
        }
 
106
        
 
107
        if(secs < 0)
 
108
                secs = 0;
 
109
        return secs;
 
110
}