J
Josef 'Jupp' SCHUGT
Hi!
I am presently working on a new version of my feed aggregator
'rubric'. This time I am focussing on security issues so among other
changes the config file will no longer be a Ruby script. For parsing
a string that defines a period of time I wrote the following little
routine (GPL applies, long lines but still < 80 characters):
def to_sec(argument)
return argument if argument.class < Integer
if argument.class == String
case argument
when /^(.*?)[+,](.*)$/ then to_sec($1) + to_sec($2)
when /^\s*([0-9_]+)\s*\*(.+)$/ then $1.to_i * to_sec($2)
when /^\s*[0-9_]+\s*(s(ec(ond)?s?)?)?\s*$/ then argument.to_i
when /^\s*([0-9_]+)\s*m(in(ute)?s?)?\s*$/ then $1.to_i * 60
when /^\s*([0-9_]+)\s*h(ours?)?\s*$/ then $1.to_i * 3600
when /^\s*([0-9_]+)\s*d(ays?)?\s*$/ then $1.to_i * 86400
when /^\s*([0-9_]+)\s*w(eeks?)?\s*$/ then $1.to_i * 604800
when /^\s*([0-9_]+)\s*months?\s*$/ then $1.to_i * 2419200
else 0
end
end
end
Two questions arise:
1. Should one require integral values or would it be better to allow
the use of decimal numbers?
2. If decimal numbers are allowed would it be a good idea to allow
the use of exponential notation?
What the above code allows you to do: You can specify
n seconds as: n, n s, n sec, n secs, n second, n seconds
n minutes as: n m, n min, n mins, n minute, n minutes
n hours as: n h, n hour, n hours
n weeks as: n w, n week, n weeks
n months as: n month n months
where a month has 28 days. You can use multiplications so that the
following values are identical:
* 1 month
* 4 weeks
* 4 * 24 hours
* 4 * 24 * 60 minutes
* 4 * 24 * 60 * 60 seconds
You can also use additions which can be written in a mathematical way
using a '+' sign or as you read (using colons) so that the following
values are identical:
* 2 month + 3 weeks + 5 days + 7 hours + 11 minutes + 13 seconds
* 2 month, 3 weeks, 5 days, 7 hours, 11 minutes, 13 seconds
* 2 * 4 weeks, 3 * 7 days, 5 * 24 hours, 7 * 60 minutes,
11 * 60 seconds, 13 seconds
Even '2 * 4 * 7 * 24 * 60 * 60 s, 3 * 7 * 24 * 60 * 60 s,
5 * 24 * 60 * 60 s, 7 * 60 * 60 s, 11 * 60 s, 13 s' is possible
(although it is not recommended
.
Josef 'Jupp' SCHUGT
I am presently working on a new version of my feed aggregator
'rubric'. This time I am focussing on security issues so among other
changes the config file will no longer be a Ruby script. For parsing
a string that defines a period of time I wrote the following little
routine (GPL applies, long lines but still < 80 characters):
def to_sec(argument)
return argument if argument.class < Integer
if argument.class == String
case argument
when /^(.*?)[+,](.*)$/ then to_sec($1) + to_sec($2)
when /^\s*([0-9_]+)\s*\*(.+)$/ then $1.to_i * to_sec($2)
when /^\s*[0-9_]+\s*(s(ec(ond)?s?)?)?\s*$/ then argument.to_i
when /^\s*([0-9_]+)\s*m(in(ute)?s?)?\s*$/ then $1.to_i * 60
when /^\s*([0-9_]+)\s*h(ours?)?\s*$/ then $1.to_i * 3600
when /^\s*([0-9_]+)\s*d(ays?)?\s*$/ then $1.to_i * 86400
when /^\s*([0-9_]+)\s*w(eeks?)?\s*$/ then $1.to_i * 604800
when /^\s*([0-9_]+)\s*months?\s*$/ then $1.to_i * 2419200
else 0
end
end
end
Two questions arise:
1. Should one require integral values or would it be better to allow
the use of decimal numbers?
2. If decimal numbers are allowed would it be a good idea to allow
the use of exponential notation?
What the above code allows you to do: You can specify
n seconds as: n, n s, n sec, n secs, n second, n seconds
n minutes as: n m, n min, n mins, n minute, n minutes
n hours as: n h, n hour, n hours
n weeks as: n w, n week, n weeks
n months as: n month n months
where a month has 28 days. You can use multiplications so that the
following values are identical:
* 1 month
* 4 weeks
* 4 * 24 hours
* 4 * 24 * 60 minutes
* 4 * 24 * 60 * 60 seconds
You can also use additions which can be written in a mathematical way
using a '+' sign or as you read (using colons) so that the following
values are identical:
* 2 month + 3 weeks + 5 days + 7 hours + 11 minutes + 13 seconds
* 2 month, 3 weeks, 5 days, 7 hours, 11 minutes, 13 seconds
* 2 * 4 weeks, 3 * 7 days, 5 * 24 hours, 7 * 60 minutes,
11 * 60 seconds, 13 seconds
Even '2 * 4 * 7 * 24 * 60 * 60 s, 3 * 7 * 24 * 60 * 60 s,
5 * 24 * 60 * 60 s, 7 * 60 * 60 s, 11 * 60 s, 13 s' is possible
(although it is not recommended
Josef 'Jupp' SCHUGT