Blame


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>
4 bc7cb1a1 2003-11-23 devnull #include <regexp.h>
5 bc7cb1a1 2003-11-23 devnull #include <ctype.h>
6 bc7cb1a1 2003-11-23 devnull
7 bc7cb1a1 2003-11-23 devnull typedef struct Date Date;
8 bc7cb1a1 2003-11-23 devnull struct Date {
9 bc7cb1a1 2003-11-23 devnull Reprog *p; /* an RE to match this date */
10 bc7cb1a1 2003-11-23 devnull Date *next; /* pointer to next in list */
11 bc7cb1a1 2003-11-23 devnull };
12 bc7cb1a1 2003-11-23 devnull
13 bc7cb1a1 2003-11-23 devnull enum{
14 bc7cb1a1 2003-11-23 devnull Secondsperday = 24*60*60
15 bc7cb1a1 2003-11-23 devnull };
16 bc7cb1a1 2003-11-23 devnull
17 bc7cb1a1 2003-11-23 devnull Biobuf in;
18 bc7cb1a1 2003-11-23 devnull int debug, matchyear;
19 bc7cb1a1 2003-11-23 devnull
20 bc7cb1a1 2003-11-23 devnull Date *dates(Date**, Tm*);
21 bc7cb1a1 2003-11-23 devnull void upper2lower(char*, char*, int);
22 bc7cb1a1 2003-11-23 devnull void *alloc(unsigned int);
23 bc7cb1a1 2003-11-23 devnull
24 bc7cb1a1 2003-11-23 devnull void
25 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
26 bc7cb1a1 2003-11-23 devnull {
27 bc7cb1a1 2003-11-23 devnull int i, fd, ahead;
28 bc7cb1a1 2003-11-23 devnull long now;
29 bc7cb1a1 2003-11-23 devnull char *line;
30 bc7cb1a1 2003-11-23 devnull Tm *tm;
31 bc7cb1a1 2003-11-23 devnull Date *first, *last, *d;
32 bc7cb1a1 2003-11-23 devnull char buf[1024];
33 bc7cb1a1 2003-11-23 devnull
34 bc7cb1a1 2003-11-23 devnull ahead = 0;
35 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
36 bc7cb1a1 2003-11-23 devnull case 'y':
37 bc7cb1a1 2003-11-23 devnull matchyear = 1;
38 bc7cb1a1 2003-11-23 devnull break;
39 bc7cb1a1 2003-11-23 devnull case 'd':
40 bc7cb1a1 2003-11-23 devnull debug = 1;
41 bc7cb1a1 2003-11-23 devnull break;
42 bc7cb1a1 2003-11-23 devnull case 'p':
43 bc7cb1a1 2003-11-23 devnull ahead = atoi(ARGF());
44 bc7cb1a1 2003-11-23 devnull break;
45 bc7cb1a1 2003-11-23 devnull default:
46 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: calendar [-y] [-d] [files ...]\n");
47 bc7cb1a1 2003-11-23 devnull exits("usage");
48 bc7cb1a1 2003-11-23 devnull }ARGEND;
49 bc7cb1a1 2003-11-23 devnull
50 bc7cb1a1 2003-11-23 devnull /* make a list of dates */
51 bc7cb1a1 2003-11-23 devnull now = time(0);
52 bc7cb1a1 2003-11-23 devnull tm = localtime(now);
53 bc7cb1a1 2003-11-23 devnull last = nil;
54 bc7cb1a1 2003-11-23 devnull first = dates(&last, tm);
55 bc7cb1a1 2003-11-23 devnull now += Secondsperday;
56 bc7cb1a1 2003-11-23 devnull tm = localtime(now);
57 bc7cb1a1 2003-11-23 devnull dates(&last, tm);
58 bc7cb1a1 2003-11-23 devnull if(tm->wday == 6){
59 bc7cb1a1 2003-11-23 devnull now += Secondsperday;
60 bc7cb1a1 2003-11-23 devnull tm = localtime(now);
61 bc7cb1a1 2003-11-23 devnull dates(&last, tm);
62 bc7cb1a1 2003-11-23 devnull }
63 bc7cb1a1 2003-11-23 devnull if(tm->wday == 0){
64 bc7cb1a1 2003-11-23 devnull now += Secondsperday;
65 bc7cb1a1 2003-11-23 devnull tm = localtime(now);
66 bc7cb1a1 2003-11-23 devnull dates(&last, tm);
67 bc7cb1a1 2003-11-23 devnull }
68 bc7cb1a1 2003-11-23 devnull if(ahead){
69 bc7cb1a1 2003-11-23 devnull now = time(0);
70 bc7cb1a1 2003-11-23 devnull now += ahead * Secondsperday;
71 bc7cb1a1 2003-11-23 devnull tm = localtime(now);
72 bc7cb1a1 2003-11-23 devnull dates(&last, tm);
73 bc7cb1a1 2003-11-23 devnull }
74 bc7cb1a1 2003-11-23 devnull
75 bc7cb1a1 2003-11-23 devnull for(i=0; i<argc || (i==0 && argc==0); i++){
76 bc7cb1a1 2003-11-23 devnull if(i==0 && argc==0)
77 bc7cb1a1 2003-11-23 devnull snprint(buf, sizeof(buf),
78 c8b6342d 2005-01-13 devnull "%s/lib/calendar", getenv("HOME"));
79 bc7cb1a1 2003-11-23 devnull else
80 bc7cb1a1 2003-11-23 devnull strcpy(buf, argv[i]);
81 bc7cb1a1 2003-11-23 devnull fd = open(buf, OREAD);
82 bc7cb1a1 2003-11-23 devnull if(fd<0 || Binit(&in, fd, OREAD)<0){
83 bc7cb1a1 2003-11-23 devnull fprint(2, "calendar: can't open %s: %r\n", buf);
84 bc7cb1a1 2003-11-23 devnull exits("open");
85 bc7cb1a1 2003-11-23 devnull }
86 bc7cb1a1 2003-11-23 devnull
87 bc7cb1a1 2003-11-23 devnull /* go through the file */
88 bc7cb1a1 2003-11-23 devnull while(line = Brdline(&in, '\n')){
89 bc7cb1a1 2003-11-23 devnull line[Blinelen(&in) - 1] = 0;
90 bc7cb1a1 2003-11-23 devnull upper2lower(buf, line, sizeof buf);
91 bc7cb1a1 2003-11-23 devnull for(d=first; d; d=d->next)
92 bc7cb1a1 2003-11-23 devnull if(regexec(d->p, buf, 0, 0)){
93 bc7cb1a1 2003-11-23 devnull print("%s\n", line);
94 bc7cb1a1 2003-11-23 devnull break;
95 bc7cb1a1 2003-11-23 devnull }
96 bc7cb1a1 2003-11-23 devnull }
97 bc7cb1a1 2003-11-23 devnull close(fd);
98 bc7cb1a1 2003-11-23 devnull }
99 bc7cb1a1 2003-11-23 devnull exits("");
100 bc7cb1a1 2003-11-23 devnull }
101 bc7cb1a1 2003-11-23 devnull
102 fa325e9b 2020-01-10 cross char *months[] =
103 bc7cb1a1 2003-11-23 devnull {
104 bc7cb1a1 2003-11-23 devnull "january",
105 bc7cb1a1 2003-11-23 devnull "february",
106 bc7cb1a1 2003-11-23 devnull "march",
107 bc7cb1a1 2003-11-23 devnull "april",
108 bc7cb1a1 2003-11-23 devnull "may",
109 bc7cb1a1 2003-11-23 devnull "june",
110 bc7cb1a1 2003-11-23 devnull "july",
111 bc7cb1a1 2003-11-23 devnull "august",
112 bc7cb1a1 2003-11-23 devnull "september",
113 bc7cb1a1 2003-11-23 devnull "october",
114 bc7cb1a1 2003-11-23 devnull "november",
115 bc7cb1a1 2003-11-23 devnull "december"
116 bc7cb1a1 2003-11-23 devnull };
117 bc7cb1a1 2003-11-23 devnull
118 bc7cb1a1 2003-11-23 devnull /*
119 bc7cb1a1 2003-11-23 devnull * Generate two Date structures. First has month followed by day;
120 bc7cb1a1 2003-11-23 devnull * second has day followed by month. Link them into list after
121 bc7cb1a1 2003-11-23 devnull * last, and return the first.
122 bc7cb1a1 2003-11-23 devnull */
123 bc7cb1a1 2003-11-23 devnull Date*
124 bc7cb1a1 2003-11-23 devnull dates(Date **last, Tm *tm)
125 bc7cb1a1 2003-11-23 devnull {
126 bc7cb1a1 2003-11-23 devnull Date *first;
127 bc7cb1a1 2003-11-23 devnull Date *nd;
128 bc7cb1a1 2003-11-23 devnull char mo[128], buf[128];
129 bc7cb1a1 2003-11-23 devnull
130 bc7cb1a1 2003-11-23 devnull if(utflen(months[tm->mon]) > 3)
131 bc7cb1a1 2003-11-23 devnull snprint(mo, sizeof mo, "%3.3s(%s)?",
132 bc7cb1a1 2003-11-23 devnull months[tm->mon], months[tm->mon]+3);
133 bc7cb1a1 2003-11-23 devnull else
134 bc7cb1a1 2003-11-23 devnull snprint(mo, sizeof mo, "%3.3s", months[tm->mon]);
135 bc7cb1a1 2003-11-23 devnull if (matchyear)
136 bc7cb1a1 2003-11-23 devnull snprint(buf, sizeof buf,
137 bc7cb1a1 2003-11-23 devnull "(^| |\t)((%s( |\t)+)|(%d/))%d( |\t|$)(((%d|%d)( |\t|$))|[^0-9]|([0-9]+[^0-9 \t]))",
138 bc7cb1a1 2003-11-23 devnull mo, tm->mon+1, tm->mday, tm->year+1900, tm->year%100);
139 bc7cb1a1 2003-11-23 devnull else
140 bc7cb1a1 2003-11-23 devnull snprint(buf, sizeof buf,
141 bc7cb1a1 2003-11-23 devnull "(^| |\t)((%s( |\t)+)|(%d/))%d( |\t|$)",
142 bc7cb1a1 2003-11-23 devnull mo, tm->mon+1, tm->mday);
143 bc7cb1a1 2003-11-23 devnull if(debug)
144 bc7cb1a1 2003-11-23 devnull print("%s\n", buf);
145 bc7cb1a1 2003-11-23 devnull
146 bc7cb1a1 2003-11-23 devnull first = alloc(sizeof(Date));
147 bc7cb1a1 2003-11-23 devnull if(*last)
148 bc7cb1a1 2003-11-23 devnull (*last)->next = first;
149 fa325e9b 2020-01-10 cross first->p = regcomp(buf);
150 bc7cb1a1 2003-11-23 devnull
151 bc7cb1a1 2003-11-23 devnull if (matchyear)
152 bc7cb1a1 2003-11-23 devnull snprint(buf, sizeof buf,
153 bc7cb1a1 2003-11-23 devnull "(^| |\t)%d( |\t)+(%s)( |\t|$)(((%d|%d)( |\t|$))|[^0-9]|([0-9]+[^0-9 \t]))",
154 bc7cb1a1 2003-11-23 devnull tm->mday, mo, tm->year+1900, tm->year%100);
155 bc7cb1a1 2003-11-23 devnull else
156 bc7cb1a1 2003-11-23 devnull snprint(buf, sizeof buf,
157 bc7cb1a1 2003-11-23 devnull "(^| |\t)%d( |\t)+(%s)( |\t|$)",
158 bc7cb1a1 2003-11-23 devnull tm->mday, mo);
159 bc7cb1a1 2003-11-23 devnull if(debug)
160 bc7cb1a1 2003-11-23 devnull print("%s\n", buf);
161 bc7cb1a1 2003-11-23 devnull nd = alloc(sizeof(Date));
162 fa325e9b 2020-01-10 cross nd->p = regcomp(buf);
163 bc7cb1a1 2003-11-23 devnull nd->next = 0;
164 bc7cb1a1 2003-11-23 devnull first->next = nd;
165 bc7cb1a1 2003-11-23 devnull *last = nd;
166 bc7cb1a1 2003-11-23 devnull
167 bc7cb1a1 2003-11-23 devnull return first;
168 bc7cb1a1 2003-11-23 devnull }
169 bc7cb1a1 2003-11-23 devnull
170 bc7cb1a1 2003-11-23 devnull /*
171 bc7cb1a1 2003-11-23 devnull * Copy 'from' to 'to', converting to lower case
172 bc7cb1a1 2003-11-23 devnull */
173 bc7cb1a1 2003-11-23 devnull void
174 bc7cb1a1 2003-11-23 devnull upper2lower(char *to, char *from, int len)
175 bc7cb1a1 2003-11-23 devnull {
176 bc7cb1a1 2003-11-23 devnull while(--len>0 && *from!='\0')
177 1c171e3a 2005-07-19 devnull *to++ = tolower((uchar)*from++);
178 bc7cb1a1 2003-11-23 devnull *to = 0;
179 bc7cb1a1 2003-11-23 devnull }
180 bc7cb1a1 2003-11-23 devnull
181 bc7cb1a1 2003-11-23 devnull /*
182 bc7cb1a1 2003-11-23 devnull * Call malloc and check for errors
183 bc7cb1a1 2003-11-23 devnull */
184 bc7cb1a1 2003-11-23 devnull void*
185 bc7cb1a1 2003-11-23 devnull alloc(unsigned int n)
186 bc7cb1a1 2003-11-23 devnull {
187 bc7cb1a1 2003-11-23 devnull void *p;
188 bc7cb1a1 2003-11-23 devnull
189 bc7cb1a1 2003-11-23 devnull p = malloc(n);
190 bc7cb1a1 2003-11-23 devnull if(p == 0){
191 bc7cb1a1 2003-11-23 devnull fprint(2, "calendar: malloc failed: %r\n");
192 bc7cb1a1 2003-11-23 devnull exits("malloc");
193 bc7cb1a1 2003-11-23 devnull }
194 bc7cb1a1 2003-11-23 devnull return p;
195 bc7cb1a1 2003-11-23 devnull }