Files
ezic/src/ezic_parse.erl

163 lines
3.0 KiB
Erlang

-module(ezic_parse).
-include("include/ezic.hrl").
-export([
year/1
, day_pattern/1
, time/1
, time_val/1
, until/1
, tz_abbr/1
]).
% year(string) to year(int|atom)
year("minimum") -> minimum;
year("min") -> minimum;
year("maximum") -> maximum;
year("max") -> maximum;
year("only") -> only;
year(X) ->
list_to_integer(X).
% X=last(Mon,Tue,Wed,...,Sun) -> {last, (Mon,Tue,Web,...,Sun)}
day_pattern(X=[$l,$a,$s,$t|Day]) ->
case ezic_date:day_to_num(Day) > 0 of
true -> {last, Day};
false -> erlang:error(badday,X)
end;
% X=(Mon,Tue,Wed,...,Sun)[<>]=int().
day_pattern(X=[D,A,Y, Sign,$= | IntS]) ->
Int=list_to_integer(IntS),
Day=[D,A,Y],
{ok, FSign}= sign(Sign),
case ezic_date:day_to_num(Day) > 0 of
true -> #tzon{day=Day, filter={FSign, Int}};
false -> erlang:error(badday, X)
end;
% X=int()
day_pattern(X) ->
list_to_integer(X).
time_val(Str) ->
#tztime{time=Time}= time(Str),
Time.
time("-") ->
#tztime{time={0,0,0}};
time(TS) ->
{Flag, RTime} = time_flag(TS),
Time= time_abs(RTime),
#tztime{time=Time, flag=Flag}.
until([]) ->
current;
until([YS]) ->
Y= list_to_integer(YS),
{Y,1,1};
until([YS,MS]) ->
Y= list_to_integer(YS),
M= ezic_date:month_to_num(MS),
{Y,M,1};
until([YS,MS,DS]) ->
Y= list_to_integer(YS),
M= ezic_date:month_to_num(MS),
D= day_pattern(DS),
{Y,M,D};
until([YS,MS,DS,TS]) ->
Y= list_to_integer(YS),
M= ezic_date:month_to_num(MS),
D= day_pattern(DS),
{{Y,M,D},ezic_parse:time(TS)}.
tz_abbr(Format) ->
tz_abbr(Format, string:str(Format, "%s")).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PRIVATE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
time_flag(TS) ->
{F, RTime}= time_flag_rev(lists:reverse(TS)),
{F, lists:reverse(RTime)}.
% absolute time string (no relativity modifiers)
% e.g. 08:01:03
time_abs(Time) ->
TTok= string:tokens(Time, ":"),
time_tokens(TTok).
time_tokens([HS]) ->
H= list_to_integer(HS),
{H,0,0};
time_tokens([HS,MS]) ->
H= list_to_integer(HS),
M= list_to_integer(MS),
{H,M,0};
time_tokens([HS,MS,SS]) ->
H= list_to_integer(HS),
M= list_to_integer(MS),
S= list_to_integer(SS),
{H,M,S};
time_tokens(X) ->
erlang:error(badtime, X).
sign($>) -> {ok, geq};
sign($<) -> {ok, leq}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% INTERNAL
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
time_flag_rev([F|RTime]) when F =:= $s; F =:= $w; F =:= $u ->
{list_to_atom([F]), RTime};
time_flag_rev([F|RTime]) when F =:= $g; F =:= $z ->
{u, RTime};
time_flag_rev(X=[F|_]) when F-48 < 0; F-48 > 9 ->
erlang:error(badtime, lists:reverse(X));
time_flag_rev(RTime) ->
{w, RTime}.
tz_abbr(Format, 0) ->
Format;
tz_abbr(Format, Pos) ->
First=string:substr(Format, 1, Pos-1),
Last=string:substr(Format, Pos+2),
string:concat(First, [$~, $s|Last]).