lots of gutting. purposes, input, and output were unclear in many places. still broken.

This commit is contained in:
aj
2010-11-08 01:29:15 -08:00
parent 9ad8f3c826
commit d00937c3e9
13 changed files with 828 additions and 552 deletions

View File

@@ -8,46 +8,24 @@
-endif.
-export([rule/1,zone/1,link/1,leap/1, separate/1]).
-export([
link/1
, leap/1
, separate/1
]).
rule([Name,FromS,ToS,Type,InS,OnS,AtS,SaveS,Letters]) ->
From= parse_from(FromS),
To= parse_to(ToS),
% @todo handle year types
In= ezic_date:month_to_num(InS),
On= parse_on(OnS),
At=parse_at(AtS),
Save=parse_save(SaveS),
{ok, #rule{
name=Name, from=From, to=To, type=Type,
in=In, on=On, at=At, save=Save, letters=Letters
}}.
zone([Name,GmtOffS,Rule,FormatS | UntilTokens]) ->
GmtOff=parse_time(GmtOffS),
Until = parse_until(UntilTokens),
Format= convert_format(FormatS),
{ok, #zone{
name=Name, gmtoff=GmtOff, rule=Rule,
format=Format, until=Until
}}.
link([From,To]) ->
{ok, #link{from=From, to=To}}.
% @todo figure out what must be done with leap seconds
leap([YearS, MonthS, DayS, TimeS, Corr, RS]) ->
Y=list_to_integer(YearS),
M=ezic_date:month_to_num(MonthS),
D=list_to_integer(DayS),
Time=parse_abs_time(TimeS),
Y= list_to_integer(YearS),
M= ezic_date:month_to_num(MonthS),
D= list_to_integer(DayS),
Time= ezic_parse:time_val(TimeS),
{ok, #leap{datetime={{Y,M,D}, Time}, corr=Corr, rs=RS}}.
@@ -61,153 +39,3 @@ separate(Records) ->
{ok, Zones, Rules, Leaps, Links}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PRIVATE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
parse_from(X) when X=:="maximum";X=:="max" ->
maximum;
parse_from(X) when X=:="minimum";X=:="min" ->
minimum;
parse_from(Year) ->
list_to_integer(Year).
parse_to("only") ->
only;
parse_to(Other) ->
parse_from(Other).
parse_on(X=[$l,$a,$s,$t|Day]) ->
case ezic_date:day_to_num(Day) > 0 of
true -> {last, Day};
false -> erlang:error(badday,X)
end;
parse_on(X=[D,A,Y, Sign,$= | IntS]) ->
Int=list_to_integer(IntS),
Day=[D,A,Y],
{ok, FSign} =parse_on_sign(Sign),
case ezic_date:day_to_num(Day) > 0 of
true -> #tzon{day=Day, filter={FSign, Int}};
false -> erlang:error(badday, X)
end;
parse_on(X) ->
list_to_integer(X).
parse_until([]) ->
current;
parse_until([YS]) ->
Y= list_to_integer(YS),
{Y,1,1};
parse_until([YS,MS]) ->
Y= list_to_integer(YS),
M= ezic_date:month_to_num(MS),
{Y,M,1};
parse_until([YS,MS,DS]) ->
Y= list_to_integer(YS),
M= ezic_date:month_to_num(MS),
D= parse_on(DS),
{Y,M,D};
parse_until([YS,MS,DS,TS]) ->
Y= list_to_integer(YS),
M= ezic_date:month_to_num(MS),
D= parse_on(DS),
{{Y,M,D},parse_time(TS)}.
parse_at(X) ->
parse_time(X).
parse_save("-") ->
parse_time("-");
parse_save(X) ->
XRev=lists:reverse(X),
parse_save_rev(XRev).
parse_time("-") ->
#tztime{time={0,0,0}};
parse_time(TS) ->
parse_time_rev(lists:reverse(TS)).
parse_abs_time(T) ->
Tokez= string:tokens(T, ":"),
parse_abs_time_2(Tokez).
convert_format(Format) ->
convert_format(Format, string:str(Format, "%s")).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% INTERNAL
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
parse_on_sign($>) -> {ok, geq};
parse_on_sign($<) -> {ok, leq}.
parse_time_rev([F|RTime]) when F =:= $s; F =:= $w; F =:= $u ->
Time=lists:reverse(RTime),
#tztime{time=parse_abs_time(Time), flag=list_to_atom([F])};
parse_time_rev(X=[F|_]) when F-48 < 0; F-48 > 9 ->
erlang:error(badtime, X);
parse_time_rev(RTime) ->
Time=lists:reverse(RTime),
#tztime{time=parse_abs_time(Time)}.
parse_abs_time_2([HS]) ->
H= list_to_integer(HS),
{H,0,0};
parse_abs_time_2([HS,MS]) ->
H= list_to_integer(HS),
M= list_to_integer(MS),
{H,M,0};
parse_abs_time_2([HS,MS,SS]) ->
H= list_to_integer(HS),
M= list_to_integer(MS),
S= list_to_integer(SS),
{H,M,S};
parse_abs_time_2(X) ->
erlang:error(badtime, X).
parse_save_rev(X=[F|_]) when F-48 < 0; F-48 > 9 ->
erlang:error(badsave, lists:reverse(X));
parse_save_rev(X) ->
parse_time(lists:reverse(X)).
convert_format(Format, 0) ->
Format;
convert_format(Format, Pos) ->
First=string:substr(Format, 1, Pos-1),
Last=string:substr(Format, Pos+2),
string:concat(First, [$~, $s|Last]).