From: Sam H. v. a. <we...@ma...> - 2005-10-11 22:45:23
|
Log Message: ----------- eliminate undefined value usage in unformatDateTime, fixing bug #826. also factored out error reporting into unformatDateTime_error and improved formatting slightly. Modified Files: -------------- webwork2/lib/WeBWorK: Utils.pm Revision Data ------------- Index: Utils.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/Utils.pm,v retrieving revision 1.70 retrieving revision 1.71 diff -Llib/WeBWorK/Utils.pm -Llib/WeBWorK/Utils.pm -u -r1.70 -r1.71 --- lib/WeBWorK/Utils.pm +++ lib/WeBWorK/Utils.pm @@ -322,23 +322,29 @@ # time zone. # # Error handling has also been improved. Exceptions are now thrown for errors, -# and more information is given abou the nature of errors. +# and more information is given about the nature of errors. # sub unformatDateAndTime { my ($string) = @_; - my $orgString =$string; + my $orgString = $string; + $string =~ s|^\s+||; $string =~ s|\s+$||; $string =~ s|at| at |i; ## OK if forget to enter spaces or use wrong case $string =~ s|AM| AM|i; ## OK if forget to enter spaces or use wrong case $string =~ s|PM| PM|i; ## OK if forget to enter spaces or use wrong case $string =~ s|,| at |; ## start translating old form of date/time to new form - if ($string =~ m|^\s*[\/\d]+\s+[:\d]+| ) { # case where the at is missing: MM/DD/YYYY at HH:MM AMPM ZONE - die "Incorrect date/time format \"$orgString\". The \"at\" appears to be missing. - Correct format is MM/DD/YYYY at HH:MM AMPM ZONE (e.g. \"03/29/2004 at 06:00am EST\")"; - } - - my($date,$at, $time,$AMPM,$TZ) = split(/\s+/,$string); + + # case where the at is missing: MM/DD/YYYY at HH:MM AMPM ZONE + unformatDateAndTime_error($orgString, "The 'at' appears to be missing.") + if $string =~ m|^\s*[\/\d]+\s+[:\d]+|; + + my ($date, $at, $time, $AMPM, $TZ) = split /\s+/, $string; + + unformatDateAndTime_error($orgString, "The date and/or time appear to be missing.", $date, $time, $AMPM, $TZ) + unless defined $date and defined $at and defined $time; + + # deal with military time unless ($time =~ /:/) { { ##bare block for 'case" structure $time =~ /(\d\d)(\d\d)/; @@ -355,57 +361,56 @@ } ##end of bare block for 'case" structure } - - my ($mday, $mon, $year, $wday, $yday,$sec, $pm, $min, $hour); + + # default value for $AMPM + $AMPM = "AM" unless defined $AMPM; + + my ($mday, $mon, $year, $wday, $yday, $sec, $pm, $min, $hour); $sec=0; $time =~ /^([0-9]+)\s*\:\s*([0-9]*)/; $min=$2; $hour = $1; - if ($hour < 1 or $hour > 12) { - die "Incorrect date/time format \"$orgString\". Hour must be in the range [1,12]. - Correct format is MM/DD/YYYY at HH:MM AMPM ZONE (e.g. \"03/29/2004 at 06:00am EST\") - date = $date - time = $time - ampm = $AMPM - zone = $TZ\n"; - } - if ($min < 0 or $min > 59) { - die "Incorrect date/time format \"$orgString\". Minute must be in the range [0-59]. - Correct format is MM/DD/YYYY at HH:MM AMPM ZONE - date = $date - time = $time - ampm = $AMPM - zone = $TZ\n"; - } + unformatDateAndTime_error($orgString, "Hour must be in the range [1,12].", $date, $time, $AMPM, $TZ) + if $hour < 1 or $hour > 12; + unformatDateAndTime_error($orgString, "Minute must be in the range [0-59].", $date, $time, $AMPM, $TZ) + if $min < 0 or $min > 59; $pm = 0; $pm = 12 if ($AMPM =~/PM/ and $hour < 12); $hour += $pm; $hour = 0 if ($AMPM =~/AM/ and $hour == 12); - $date =~ m!([0-9]+)\s*/\s*([0-9]+)/\s*([0-9]+)! ; + $date =~ m|([0-9]+)\s*/\s*([0-9]+)/\s*([0-9]+)|; $mday =$2; $mon=($1-1); - if ($mday < 1 or $mday > 31) { - die "Incorrect date/time format \"$orgString\". Day must be in the range [1,31]. - Correct format is MM/DD/YY at HH:MM AMPM ZONE - date = $date - time = $time - ampm = $AMPM - zone = $TZ\n"; - } - if ($mon < 0 or $mon > 11) { - die "Incorrect date/time format \"$orgString\". Month must be in the range [1,12]. - Correct format is MM/DD/YY at HH:MM AMPM ZONE - date = $date - time = $time - ampm = $AMPM - zone = $TZ\n"; - } + unformatDateAndTime_error($orgString, "Day must be in the range [1,31].", $date, $time, $AMPM, $TZ) + if $mday < 1 or $mday > 31; + unformatDateAndTime_error($orgString, "Month must be in the range [1,12].", $date, $time, $AMPM, $TZ) + if $mon < 0 or $mon > 11; $year=$3; $wday=""; $yday=""; return ($sec, $min, $hour, $mday, $mon, $year, $TZ); } +sub unformatDateAndTime_error { + + if (@_ > 2) { + my ($orgString, $error, $date, $time, $AMPM, $TZ) = @_; + $date = "(undefined)" unless defined $date; + $time = "(undefined)" unless defined $time; + $AMPM = "(undefined)" unless defined $AMPM; + $TZ = "(undefined)" unless defined $TZ; + die "Incorrect date/time format \"$orgString\": $error\n", + "Correct format is MM/DD/YY at HH:MM AMPM ZONE\n", + "\tdate = $date\n", + "\ttime = $time\n", + "\tampm = $AMPM\n", + "\tzone = $TZ\n"; + } else { + my ($orgString, $error) = @_; + die "Incorrect date/time format \"$orgString\": $error\n", + "Correct format is MM/DD/YY at HH:MM AMPM ZONE\n"; + } +} sub parseDateTime($;$) { my ($string, $display_tz) = @_; |