lots of gutting. purposes, input, and output were unclear in many places. still broken.
This commit is contained in:
162
src/ezic_parse.erl
Normal file
162
src/ezic_parse.erl
Normal file
@@ -0,0 +1,162 @@
|
||||
-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) ->
|
||||
{undefined, 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]).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user