163 lines
3.0 KiB
Erlang
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]).
|
|
|
|
|
|
|
|
|
|
|