-
Notifications
You must be signed in to change notification settings - Fork 0
/
todolist
309 lines (241 loc) · 8.35 KB
/
todolist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#!/usr/bin/env perl
# todo_list: Write a to-do list manager, that can add, list, and
# delete items; store the data in the file todolist.txt.
# Note:
#
# Status: In progress.
# main
# add
# list
# del: TBD
#
#
use strict;
use warnings;
use feature qw(say);
my $date_mm_dd = '^(\d\d?)/(\d\d?)$';
my $date_mm_dd_yy = '^(\d\d?)/(\d\d?)/(\d\d?)$';
my $date_mm_dd_yyyy = '^(\d\d?)/(\d\d?)/(\d\d\d\d)$';
my @other_args;
my $todofile = "todolist.txt";
my $msg_dbg1 = "DBG: \$_: ";
sub add;
sub list;
sub del;
# Get command and args
my $cmd = uc shift;
print "DBG: \$cmd: [$cmd]", "\n";
if (@ARGV) {
@other_args = @ARGV;
print "DBG: \@other_args [@other_args]", "\n";
}
if ($cmd eq 'ADD') {
add( @other_args );
}
elsif ($cmd eq 'LIST') {
list( @other_args );
}
elsif ($cmd eq 'DELETE' ) {
del( @other_args );
}
else {
print "ERR: No valid command found; got [$cmd]\n";
print " Valid cmds are: add, list, or delete.\n";
print " Enter pod2text $0 for help.\n";
die $!;
}
exit;
# Append the task entered at cmd line to the todo data file.
# Include the due date, if entered; otherwise, use today's date.
sub add {
my $arg1 = shift;
my @args = @_;
print "DBG add(): \$arg1: ,$arg1,\n";
print "DBG add(): \@args: ,@args,\n";
my ($checked_date, @task);
# If there is no argument, die w/ an error.
# If $arg1 is not a date pattern, use it as the task,
# and use today's date for the due date;
# else get the date from $arg1 and convert it to desired format,
# and use @args as the task.
if ( not defined $arg1 ) {
die "DIE No task found to add to the list";
}
if ( $arg1 !~ m{\d\d?/} ) {
# Use today's date.
$checked_date = check_date();
push @task, $arg1 , @args;
}
else {
$checked_date = check_date($arg1);
#DBG print "DBG add()40: $checked_date\n";
@task = @args;
}
#TBD Open file for appending, then write the line of data to it.
open my $fh, '>>', $todofile;
print {$fh} "$checked_date @task\n";
close $fh;
return;
}
# Verify that the date entered at the cmd line is valid. If no date
# was entered, use today's date. Return the date as YYYY-MM-DD, or die
# if date was invalid.
sub check_date {
my $date_requested = shift;
my @args = @_; #TBR?
print "DBG check_date()10: \$date_requested: ,$date_requested,\n" if ($date_requested);
my ($month, $day);
#TBR my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst )
#TBR = localtime();
#TBR $year += 1900;
my @time_fields = localtime();
$year = $time_fields[5] + 1900;
#DBG print "DBG check_date()20: showing current date: y-m-d: ,$year\-$mon\-$mday,\n";
if ( not defined $date_requested ){
# When no date given, use today.
#ORG return "$year\-$month\-$day";
return "[not defined]: $year\-$mon\-$mday";
}
if ($date_requested =~ m/$date_mm_dd/) {
$month = $1;
$day = $2;
#ORG return "$year\-$month\-$day";
return "mmdd: $year\-$month\-$day";
}
if ($date_requested =~ m/$date_mm_dd_yy/) {
$month = $1;
$day = $2;
my $yr = $3;
if ($yr < 50 ) {
$year = $yr + 2000;
}
else {
$year = $yr + 1900;
}
#ORG return "$year\-$month\-$day";
return "mmddyy: $year\-$month\-$day";
}
if ($date_requested =~ m/$date_mm_dd_yyyy/) {
$month = $1;
$day = $2;
$year = $3;
#ORG return "$year\-$month\-$day";
return "mmddyyyy: $year\-$month\-$day";
}
die "DIE check_date(): The date is not valid: [$date_requested].";
}
sub del {
my $arg1 = shift;
my @args = @_;
print "DBG del(): \$arg1: ,$arg1,\n";
print "DBG del(): \@args: ,@args,\n";
return;
}
sub list {
my $arg1 = shift;
my @args = @_;
#DBG print "DBG list(): \$arg1: ,$arg1,\n";
#DBG print "DBG list(): \@args: ,@args,\n";
my $checked_date;
# If $arg1 matches a date pattern
if (not defined $arg1 ) {
# Use today's date
$checked_date = check_date();
print "DBG list()30: $checked_date\n";
}
else {
$checked_date = check_date($arg1);
print "DBG list()40: $checked_date\n";
}
# Open data file
# Print header
# Init line counter
# Loop: read each line
# Increment line counter
# If ($arg1 matches all)
# Print "number. date task"
# If (due date exists and matches date of current line)
# Print "number. task"
# End of loop
# Close data file
return;
}
=pod
# =begin spec
Files: To Do List
Return to exercise list
Write a to-do list manager. The program should have the ability to print the
to-do items for a particular day, add an item, or delete an item. The program
must store its data in a file called "todolist.txt" in a particular format,
defined below.
You must not use any date-related Perl modules in solving this module. Use only
regular expressions to parse dates and the built-in localtime() function to get
the current date.
When run, the program will first look at its command-line arguments (@ARGV) for
instructions. The first word is the command to be executed, and the rest of the
contents of @ARGV will be the arguments to that command. You must implement the
following commands: add, list, and delete. Based on the command entered the
program should do the relevant task and exit. Each command has its own syntax:
add
Adds an item to the file. The first word after add may be a date in the
format MM/DD or MM/DD/YY or MM/DD/YYYY. If it matches none of those
patterns use today's date. If it matches the MM/DD pattern, use the current
year. If it matches MM/DD/YY, and YY is less than 50, use the current
century; if it is greater than 50 use the 1900's. If it matches MM/DD/YYYY
then the date is fully specified.
If there is a date given, everything else is to be joined together in a
string, and that will be the description of the to-do item. If there is no
date, the entire argument list is to be joined together as the description.
Open the file todolist.txt for appending and add a line to it consisting of
the date in the format YYYY-MM-DD followed by the description of the item.
Note that regardless of what format the date was entered in, the full
4-digit year must be used here.
Examples:
todolist.plx add Start on project
todolist.plx add 5/06/02 project is due
todolist.plx add 5/6/2002 pay credit card
This would create entries in the file (assuming it was run on April 30)
like this:
2002-04-30 Start on project
2002-05-06 project is due
2002-05-06 pay credit card
Your program should store the data in this format.
list
Lists items from the file. The next argument after delete, if any, should
be one of "all", or a date in the format MM/DD or MM/DD/YY or MM/DD/YYYY
(see add for an explanation of how to parse dates).
If the argument is "all" then read the file todolist.txt and display all
entries, along with the date due (in YYYY-MM-DD form). Otherwise, display
the entries for the date specified (remember, no date means today's
entries) but do not display the date. At the start of each line of output
you must give a number (beginning with 1, not 0!) corresponding to which
line in the file is being displayed. This is to be used during the delete
command (see below).
Examples:
Command Output
todolist.plx list 5/6
2. project is due
3. pay credit card
todolist.plx list
1. Start on project
todolist.plx list all
1. 2002-04-30 Start on project
2. 2002-05-06 project is due
3. 2002-05-06 pay credit card
delete
Removes an item from the file. The next argument after list must be a
number indicating which line is to be deleted. Read from the file
todolist.txt and write to the file todonew.txt, printing all lines except
for the one specified by that number. Then rename the file todonew.txt to
todolist.txt (after closing your filehandles!).
Examples:
Command Output
todolist.plx list 5/6
2. project is due
3. pay credit card
todolist.plx delete 2
Deleted 2: "project is due"
todolist.plx list 5/6
2. pay credit card
# =end spec
=cut