1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull #include <bio.h>
5 bc7cb1a1 2003-11-23 devnull char dayw[] =
7 bc7cb1a1 2003-11-23 devnull " S M Tu W Th F S"
9 bc7cb1a1 2003-11-23 devnull char *smon[] =
11 bc7cb1a1 2003-11-23 devnull "January", "February", "March", "April",
12 bc7cb1a1 2003-11-23 devnull "May", "June", "July", "August",
13 bc7cb1a1 2003-11-23 devnull "September", "October", "November", "December",
15 bc7cb1a1 2003-11-23 devnull char mon[] =
18 bc7cb1a1 2003-11-23 devnull 31, 29, 31, 30,
19 bc7cb1a1 2003-11-23 devnull 31, 30, 31, 31,
20 bc7cb1a1 2003-11-23 devnull 30, 31, 30, 31,
22 bc7cb1a1 2003-11-23 devnull char string[432];
23 bc7cb1a1 2003-11-23 devnull Biobuf bout;
25 bc7cb1a1 2003-11-23 devnull void main(int argc, char *argv[]);
26 bc7cb1a1 2003-11-23 devnull int number(char *str);
27 bc7cb1a1 2003-11-23 devnull void pstr(char *str, int n);
28 bc7cb1a1 2003-11-23 devnull void cal(int m, int y, char *p, int w);
29 bc7cb1a1 2003-11-23 devnull int jan1(int yr);
30 bc7cb1a1 2003-11-23 devnull int curmo(void);
31 bc7cb1a1 2003-11-23 devnull int curyr(void);
34 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
36 bc7cb1a1 2003-11-23 devnull int y, i, j, m;
38 bc7cb1a1 2003-11-23 devnull if(argc > 3) {
39 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: cal [month] [year]\n");
40 bc7cb1a1 2003-11-23 devnull exits("usage");
42 bc7cb1a1 2003-11-23 devnull Binit(&bout, 1, OWRITE);
45 bc7cb1a1 2003-11-23 devnull * no arg, print current month
47 bc7cb1a1 2003-11-23 devnull if(argc == 1) {
48 bc7cb1a1 2003-11-23 devnull m = curmo();
49 bc7cb1a1 2003-11-23 devnull y = curyr();
50 bc7cb1a1 2003-11-23 devnull goto xshort;
54 bc7cb1a1 2003-11-23 devnull * one arg
55 bc7cb1a1 2003-11-23 devnull * if looks like a month, print month
56 bc7cb1a1 2003-11-23 devnull * else print year
58 bc7cb1a1 2003-11-23 devnull if(argc == 2) {
59 bc7cb1a1 2003-11-23 devnull y = number(argv[1]);
60 bc7cb1a1 2003-11-23 devnull if(y < 0)
62 bc7cb1a1 2003-11-23 devnull if(y >= 1 && y <= 12) {
64 bc7cb1a1 2003-11-23 devnull y = curyr();
65 bc7cb1a1 2003-11-23 devnull goto xshort;
67 bc7cb1a1 2003-11-23 devnull goto xlong;
71 bc7cb1a1 2003-11-23 devnull * two arg, month and year
73 bc7cb1a1 2003-11-23 devnull m = number(argv[1]);
74 bc7cb1a1 2003-11-23 devnull if(m < 0)
76 bc7cb1a1 2003-11-23 devnull y = number(argv[2]);
77 bc7cb1a1 2003-11-23 devnull goto xshort;
80 bc7cb1a1 2003-11-23 devnull * print out just month
83 bc7cb1a1 2003-11-23 devnull if(m < 1 || m > 12)
84 bc7cb1a1 2003-11-23 devnull goto badarg;
85 bc7cb1a1 2003-11-23 devnull if(y < 1 || y > 9999)
86 bc7cb1a1 2003-11-23 devnull goto badarg;
87 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %s %ud\n", smon[m-1], y);
88 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%s\n", dayw);
89 bc7cb1a1 2003-11-23 devnull cal(m, y, string, 24);
90 bc7cb1a1 2003-11-23 devnull for(i=0; i<6*24; i+=24)
91 bc7cb1a1 2003-11-23 devnull pstr(string+i, 24);
92 bc7cb1a1 2003-11-23 devnull exits(0);
95 bc7cb1a1 2003-11-23 devnull * print out complete year
98 bc7cb1a1 2003-11-23 devnull y = number(argv[1]);
99 bc7cb1a1 2003-11-23 devnull if(y<1 || y>9999)
100 bc7cb1a1 2003-11-23 devnull goto badarg;
101 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "\n\n\n");
102 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %ud\n", y);
103 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "\n");
104 bc7cb1a1 2003-11-23 devnull for(i=0; i<12; i+=3) {
105 bc7cb1a1 2003-11-23 devnull for(j=0; j<6*72; j++)
106 bc7cb1a1 2003-11-23 devnull string[j] = '\0';
107 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %.3s", smon[i]);
108 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %.3s", smon[i+1]);
109 bc7cb1a1 2003-11-23 devnull Bprint(&bout, " %.3s\n", smon[i+2]);
110 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%s %s %s\n", dayw, dayw, dayw);
111 bc7cb1a1 2003-11-23 devnull cal(i+1, y, string, 72);
112 bc7cb1a1 2003-11-23 devnull cal(i+2, y, string+23, 72);
113 bc7cb1a1 2003-11-23 devnull cal(i+3, y, string+46, 72);
114 bc7cb1a1 2003-11-23 devnull for(j=0; j<6*72; j+=72)
115 bc7cb1a1 2003-11-23 devnull pstr(string+j, 72);
117 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "\n\n\n");
118 bc7cb1a1 2003-11-23 devnull exits(0);
121 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "cal: bad argument\n");
126 bc7cb1a1 2003-11-23 devnull char* word;
127 bc7cb1a1 2003-11-23 devnull int val;
128 bc7cb1a1 2003-11-23 devnull } dict[] =
130 bc7cb1a1 2003-11-23 devnull "jan", 1,
131 bc7cb1a1 2003-11-23 devnull "january", 1,
132 bc7cb1a1 2003-11-23 devnull "feb", 2,
133 bc7cb1a1 2003-11-23 devnull "february", 2,
134 bc7cb1a1 2003-11-23 devnull "mar", 3,
135 bc7cb1a1 2003-11-23 devnull "march", 3,
136 bc7cb1a1 2003-11-23 devnull "apr", 4,
137 bc7cb1a1 2003-11-23 devnull "april", 4,
138 bc7cb1a1 2003-11-23 devnull "may", 5,
139 bc7cb1a1 2003-11-23 devnull "jun", 6,
140 bc7cb1a1 2003-11-23 devnull "june", 6,
141 bc7cb1a1 2003-11-23 devnull "jul", 7,
142 bc7cb1a1 2003-11-23 devnull "july", 7,
143 bc7cb1a1 2003-11-23 devnull "aug", 8,
144 bc7cb1a1 2003-11-23 devnull "august", 8,
145 bc7cb1a1 2003-11-23 devnull "sep", 9,
146 bc7cb1a1 2003-11-23 devnull "sept", 9,
147 bc7cb1a1 2003-11-23 devnull "september", 9,
148 bc7cb1a1 2003-11-23 devnull "oct", 10,
149 bc7cb1a1 2003-11-23 devnull "october", 10,
150 bc7cb1a1 2003-11-23 devnull "nov", 11,
151 bc7cb1a1 2003-11-23 devnull "november", 11,
152 bc7cb1a1 2003-11-23 devnull "dec", 12,
153 bc7cb1a1 2003-11-23 devnull "december", 12,
158 bc7cb1a1 2003-11-23 devnull * convert to a number.
159 bc7cb1a1 2003-11-23 devnull * if its a dictionary word,
160 bc7cb1a1 2003-11-23 devnull * return negative number
163 bc7cb1a1 2003-11-23 devnull number(char *str)
165 bc7cb1a1 2003-11-23 devnull int n, c;
166 bc7cb1a1 2003-11-23 devnull char *s;
168 bc7cb1a1 2003-11-23 devnull for(n=0; s=dict[n].word; n++)
169 bc7cb1a1 2003-11-23 devnull if(strcmp(s, str) == 0)
170 bc7cb1a1 2003-11-23 devnull return -dict[n].val;
172 bc7cb1a1 2003-11-23 devnull s = str;
173 bc7cb1a1 2003-11-23 devnull while(c = *s++) {
174 bc7cb1a1 2003-11-23 devnull if(c<'0' || c>'9')
175 bc7cb1a1 2003-11-23 devnull return 0;
176 bc7cb1a1 2003-11-23 devnull n = n*10 + c-'0';
178 bc7cb1a1 2003-11-23 devnull return n;
182 bc7cb1a1 2003-11-23 devnull pstr(char *str, int n)
185 bc7cb1a1 2003-11-23 devnull char *s;
187 bc7cb1a1 2003-11-23 devnull s = str;
189 bc7cb1a1 2003-11-23 devnull while(i--)
190 bc7cb1a1 2003-11-23 devnull if(*s++ == '\0')
191 bc7cb1a1 2003-11-23 devnull s[-1] = ' ';
192 bc7cb1a1 2003-11-23 devnull i = n+1;
193 bc7cb1a1 2003-11-23 devnull while(i--)
194 bc7cb1a1 2003-11-23 devnull if(*--s != ' ')
196 bc7cb1a1 2003-11-23 devnull s[1] = '\0';
197 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%s\n", str);
201 bc7cb1a1 2003-11-23 devnull cal(int m, int y, char *p, int w)
203 bc7cb1a1 2003-11-23 devnull int d, i;
204 bc7cb1a1 2003-11-23 devnull char *s;
207 bc7cb1a1 2003-11-23 devnull d = jan1(y);
208 bc7cb1a1 2003-11-23 devnull mon[2] = 29;
209 bc7cb1a1 2003-11-23 devnull mon[9] = 30;
211 bc7cb1a1 2003-11-23 devnull switch((jan1(y+1)+7-d)%7) {
214 bc7cb1a1 2003-11-23 devnull * non-leap year
217 bc7cb1a1 2003-11-23 devnull mon[2] = 28;
223 bc7cb1a1 2003-11-23 devnull default:
224 bc7cb1a1 2003-11-23 devnull mon[9] = 19;
228 bc7cb1a1 2003-11-23 devnull * leap year
233 bc7cb1a1 2003-11-23 devnull for(i=1; i<m; i++)
234 bc7cb1a1 2003-11-23 devnull d += mon[i];
236 bc7cb1a1 2003-11-23 devnull s += 3*d;
237 bc7cb1a1 2003-11-23 devnull for(i=1; i<=mon[m]; i++) {
238 bc7cb1a1 2003-11-23 devnull if(i==3 && mon[m]==19) {
239 bc7cb1a1 2003-11-23 devnull i += 11;
240 bc7cb1a1 2003-11-23 devnull mon[m] += 11;
242 bc7cb1a1 2003-11-23 devnull if(i > 9)
243 bc7cb1a1 2003-11-23 devnull *s = i/10+'0';
245 bc7cb1a1 2003-11-23 devnull *s++ = i%10+'0';
247 bc7cb1a1 2003-11-23 devnull if(++d == 7) {
249 bc7cb1a1 2003-11-23 devnull s = p+w;
256 bc7cb1a1 2003-11-23 devnull * return day of the week
257 bc7cb1a1 2003-11-23 devnull * of jan 1 of given year
260 bc7cb1a1 2003-11-23 devnull jan1(int yr)
262 bc7cb1a1 2003-11-23 devnull int y, d;
265 bc7cb1a1 2003-11-23 devnull * normal gregorian calendar
266 bc7cb1a1 2003-11-23 devnull * one extra day per four years
270 bc7cb1a1 2003-11-23 devnull d = 4+y+(y+3)/4;
273 bc7cb1a1 2003-11-23 devnull * julian calendar
274 bc7cb1a1 2003-11-23 devnull * regular gregorian
275 bc7cb1a1 2003-11-23 devnull * less three days per 400
278 bc7cb1a1 2003-11-23 devnull if(y > 1800) {
279 bc7cb1a1 2003-11-23 devnull d -= (y-1701)/100;
280 bc7cb1a1 2003-11-23 devnull d += (y-1601)/400;
284 bc7cb1a1 2003-11-23 devnull * great calendar changeover instant
287 bc7cb1a1 2003-11-23 devnull if(y > 1752)
290 bc7cb1a1 2003-11-23 devnull return d%7;
294 bc7cb1a1 2003-11-23 devnull * system dependent
295 bc7cb1a1 2003-11-23 devnull * get current month and year
298 bc7cb1a1 2003-11-23 devnull curmo(void)
302 bc7cb1a1 2003-11-23 devnull tm = localtime(time(0));
303 bc7cb1a1 2003-11-23 devnull return tm->mon+1;
307 bc7cb1a1 2003-11-23 devnull curyr(void)
311 bc7cb1a1 2003-11-23 devnull tm = localtime(time(0));
312 bc7cb1a1 2003-11-23 devnull return tm->year+1900;