655
655
CRange = greatest_common_range(SV,VR),
656
656
pre_encode(integer,CRange);
657
657
effective_constraint(bitstring,C) ->
658
% Constr=get_constraints(C,'SizeConstraint'),
661
% [{'SizeConstraint',Val}] -> Val;
664
get_constraint(C,'SizeConstraint');
665
effective_constraint(Type,C) ->
666
io:format("Effective constraint for ~p, not implemented yet.~n",[Type]),
658
get_constraint(C,'SizeConstraint').
669
660
effective_constr(_,[]) ->
671
662
effective_constr('SingleValue',List) ->
672
663
SVList = lists:flatten(lists:map(fun(X)->element(2,X)end,List)),
673
664
% sort and remove duplicates
674
% SortedSVList = lists:sort(SVList),
675
665
RemoveDup = fun([],_) ->[];
677
667
([H,H|T],F) -> F([H|T],F);
720
710
_ -> lists:max(L)
723
% effective_constraint1('SingleValue',List) ->
724
% SVList = lists:map(fun(X)->element(2,X)end,List),
725
% sv_effective_constraint(hd(SVList),tl(SVList));
726
% effective_constraint1('ValueRange',List) ->
727
% VRList = lists:map(fun(X)->element(2,X)end,List),
728
% vr_effective_constraint(lists:map(fun(X)->element(1,X)end,VRList),
729
% lists:map(fun(X)->element(2,X)end,VRList)).
731
%% vr_effective_constraint/2
732
%% Gets all LowerEndPoints and UpperEndPoints as arguments
733
%% Returns {'ValueRange',{Lb,Ub}} where Lb is the highest value of
734
%% the LowerEndPoints and Ub is the lowest value of the UpperEndPoints,
735
%% i.e. the intersection of all value ranges.
736
% vr_effective_constraint(Mins,Maxs) ->
737
% Lb=lists:foldl(fun(X,'MIN') when integer(X) -> X;
738
% (X,'MIN') -> 'MIN';
739
% (X,AccIn) when integer(X),X >= AccIn -> X;
741
% end,hd(Mins),tl(Mins)),
742
% Ub = lists:min(Maxs),
743
% {'ValueRange',{Lb,Ub}}.
746
% sv_effective_constraint(SV,[]) ->
747
% {'SingleValue',SV};
748
% sv_effective_constraint([],_) ->
749
% exit({error,{asn1,{illegal_single_value_constraint}}});
750
% sv_effective_constraint(SV,[SV|Rest]) ->
751
% sv_effective_constraint(SV,Rest);
752
% sv_effective_constraint(Int,[SV|Rest]) when integer(Int),list(SV) ->
753
% case lists:member(Int,SV) of
755
% sv_effective_constraint(Int,Rest);
757
% exit({error,{asn1,{illegal_single_value_constraint}}})
759
% sv_effective_constraint(SV,[Int|Rest]) when integer(Int),list(SV) ->
760
% case lists:member(Int,SV) of
762
% sv_effective_constraint(Int,Rest);
764
% exit({error,{asn1,{illegal_single_value_constraint}}})
766
% sv_effective_constraint(SV1,[SV2|Rest]) when list(SV1),list(SV2) ->
767
% sv_effective_constraint(common_set(SV1,SV2),Rest);
768
% sv_effective_constraint(_,_) ->
769
% exit({error,{asn1,{illegal_single_value_constraint}}}).
772
%% Two lists as input
773
%% Returns the list with all elements that are common for both
775
% common_set(SV1,SV2) ->
776
% lists:filter(fun(X)->lists:member(X,SV1) end,SV2).
926
861
gen_encode_objectfields(_,[],_,_,Acc) ->
929
% gen_encode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
930
% Fields = Class#objectclass.fields,
933
% case is_typefield(Fields,FieldName) of
935
% Def = Type#typedef.typespec,
936
% emit({"'enc_",ObjName,"'(",{asis,FieldName},
937
% ", Val, Dummy) ->",nl}),
940
% case Type#typedef.name of
942
% gen_encode_prim(per,Def,"false","Val"),
944
% {constructed,bif} ->
945
% emit({" 'enc_",ObjName,'_',FieldName,
947
% [{['enc_',ObjName,'_',FieldName],Def}];
948
% {ExtMod,TypeName} ->
949
% emit({" '",ExtMod,"':'enc_",TypeName,"'(Val)"}),
952
% emit({" 'enc_",TypeName,"'(Val)"}),
955
% case more_genfields(Fields,Rest) of
962
% {false,objectfield} ->
963
% emit({"'enc_",ObjName,"'(",{asis,FieldName},
964
% ", Val, [H|T]) ->",nl}),
965
% case Type#typedef.name of
966
% {ExtMod,TypeName} ->
967
% emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
970
% emit({indent(3),"'enc_",TypeName,"'(H, Val, T)"})
972
% case more_genfields(Fields,Rest) of
981
% gen_encode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
982
% gen_encode_objectfields(C,O,[_|T],Acc) ->
983
% gen_encode_objectfields(C,O,T,Acc);
984
% gen_encode_objectfields(_,_,[],Acc) ->
987
866
gen_encode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
988
867
case is_already_generated(enc,TypeDef#typedef.name) of
1188
1067
%%%%%%%%%%%%%%%
1190
% gen_decode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
1191
% Fields = Class#objectclass.fields,
1194
% case is_typefield(Fields,FieldName) of
1196
% Def = Type#typedef.typespec,
1197
% emit({"'dec_",ObjName,"'(",{asis,FieldName},
1198
% ", Val, Telltype, RestPrimFieldName) ->",nl}),
1201
% case Type#typedef.name of
1202
% {primitive,bif} ->
1203
% gen_dec_prim(per,Def,"Val"),
1205
% {constructed,bif} ->
1206
% emit({" 'dec_",ObjName,'_',FieldName,
1207
% "'(Val, Telltype)"}),
1208
% [{['dec_',ObjName,'_',FieldName],Def}];
1209
% {ExtMod,TypeName} ->
1210
% emit({" '",ExtMod,"':'dec_",TypeName,
1211
% "'(Val, Telltype)"}),
1214
% emit({" 'dec_",TypeName,"'(Val, Telltype)"}),
1217
% case more_genfields(Fields,Rest) of
1224
% {false,objectfield} ->
1225
% emit({"'dec_",ObjName,"'(",{asis,FieldName},
1226
% ", Val, Telltype, [H|T]) ->",nl}),
1227
% case Type#typedef.name of
1228
% {ExtMod,TypeName} ->
1229
% emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
1230
% "'(H, Val, Telltype, T)"});
1232
% emit({indent(3),"'dec_",TypeName,
1233
% "'(H, Val, Telltype, T)"})
1235
% case more_genfields(Fields,Rest) of
1245
% gen_decode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
1246
% gen_decode_objectfields(C,O,[_|T],CAcc) ->
1247
% gen_decode_objectfields(C,O,T,CAcc);
1248
% gen_decode_objectfields(_,_,[],CAcc) ->
1251
gen_decode_constr_type(Erules,[{Name,Def}|Rest]) ->
1252
emit({Name,"(Bytes,_) ->",nl}),
1253
InnerType = asn1ct_gen:get_inner(Def#type.def),
1254
asn1ct_gen:gen_decode_constructed(Erules,Name,InnerType,Def),
1255
gen_decode_constr_type(Erules,Rest);
1256
1070
gen_decode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
1257
1071
case is_already_generated(dec,TypeDef#typedef.name) of
1960
% dec_enumerated_cases(NNL,Tmpremain,No) ->
1961
% Cases=dec_enumerated_cases1(NNL,Tmpremain,0),
1962
% lists:flatten(io_lib:format("(case ~s "++Cases++
1963
% "~s when atom(~s)->exit({error,{asn1,{namednumber,~s}}});_->~s end)",[Value,"TmpVal","TmpVal","TmpVal",Value])).
1965
1763
dec_enumerated_cases([Name|Rest],Tmpremain,No) ->
1966
1764
io_lib:format("~w->{~w,~s};",[No,Name,Tmpremain])++
1967
1765
dec_enumerated_cases(Rest,Tmpremain,No+1);
1968
1766
dec_enumerated_cases([],_,_) ->
1972
% more_genfields(_Fields,[]) ->
1974
% more_genfields(Fields,[{FieldName,_}|T]) ->
1975
% case is_typefield(Fields,FieldName) of
1977
% {false,objectfield} -> true;
1978
% {false,_} -> more_genfields(Fields,T)