1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2010 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                  Common Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*            http://www.opensource.org/licenses/cpl1.0.txt             *
11*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23/*
24 * Glenn Fowler
25 * AT&T Research
26 *
27 * Time_t conversion support
28 */
29
30#include <tmx.h>
31
32static unsigned char	offset[7][3] =
33{
34	{ 7, 6, 6 },
35	{ 1, 7, 7 },
36	{ 2, 1, 8 },
37	{ 3, 2, 9 },
38	{ 4, 3, 10},
39	{ 5, 4, 4 },
40	{ 6, 5, 5 },
41};
42
43/*
44 * type is week type
45 *	0 sunday first day of week
46 *	1 monday first day of week
47 *	2 monday first day of iso week
48 * if week<0 then return week for tm
49 * if day<0 then set tm to first day of week
50 * otherwise set tm to day in week
51 * and return tm->tm_yday
52 */
53
54int
55tmweek(Tm_t* tm, int type, int week, int day)
56{
57	int	d;
58
59	if (week < 0)
60	{
61		if ((day = tm->tm_wday - tm->tm_yday % 7) < 0)
62			day += 7;
63		week = (tm->tm_yday + offset[day][type]) / 7;
64		if (type == 2)
65		{
66			if (!week)
67				week = (day > 0 && day < 6 || tmisleapyear(tm->tm_year - 1)) ? 53 : 52;
68			else if (week == 53 && (tm->tm_wday + (31 - tm->tm_mday)) < 4)
69				week = 1;
70		}
71		return week;
72	}
73	if (day < 0)
74		day = type != 0;
75	tm->tm_mon = 0;
76	tm->tm_mday = 1;
77	tmfix(tm);
78	d = tm->tm_wday;
79	tm->tm_mday = week * 7 - offset[d][type] + ((day || type != 2) ? day : 7);
80	tmfix(tm);
81	if (d = tm->tm_wday - day)
82	{
83		tm->tm_mday -= d;
84		tmfix(tm);
85	}
86	return tm->tm_yday;
87}
88