152
154
NewC = [{'ValueRange',{0,length(Nlist1)-1}}],
153
155
emit(["case (case ",Value," of {_,_}->element(2,",Value,");_->",
154
156
Value," end) of",nl]),
155
emit_enc_enumerated_cases(NewC, NewList++[{asn1_enum,length(Nlist1)-1}], 0);
157
emit_enc_enumerated_cases(Erules,NewC, NewList++[{asn1_enum,length(Nlist1)-1}], 0);
156
158
{'ENUMERATED',NamedNumberList} ->
157
159
NewList = [X||{X,_} <- NamedNumberList],
158
160
NewC = [{'ValueRange',{0,length(NewList)-1}}],
159
161
emit(["case (case ",Value," of {_,_}->element(2,",Value,");_->",
160
162
Value," end) of",nl]),
161
emit_enc_enumerated_cases(NewC, NewList, 0);
163
emit_enc_enumerated_cases(Erules,NewC, NewList, 0);
164
166
emit({"?RT_PER:encode_real(",Value,")"});
235
240
exit({asn1_error,nyi,XX})
238
emit_enc_enumerated_cases(C, [H], Count) ->
239
emit_enc_enumerated_case(C, H, Count),
243
emit_enc_enumerated_cases(Erule,C, [H], Count) ->
244
emit_enc_enumerated_case(Erule,C, H, Count),
240
245
emit([";",nl,"EnumVal -> exit({error,{asn1, {enumerated_not_in_range, EnumVal}}})"]),
241
246
emit([nl,"end"]);
242
emit_enc_enumerated_cases(C, ['EXT_MARK'|T], _Count) ->
243
emit_enc_enumerated_cases(C, T, 0);
244
emit_enc_enumerated_cases(C, [H1,H2|T], Count) ->
245
emit_enc_enumerated_case(C, H1, Count),
247
emit_enc_enumerated_cases(Erule, C, ['EXT_MARK'|T], _Count) ->
248
emit_enc_enumerated_cases(Erule, C, T, 0);
249
emit_enc_enumerated_cases(Erule, C, [H1,H2|T], Count) ->
250
emit_enc_enumerated_case(Erule, C, H1, Count),
247
emit_enc_enumerated_cases(C, [H2|T], Count+1).
252
emit_enc_enumerated_cases(Erule, C, [H2|T], Count+1).
251
emit_enc_enumerated_case(_C, {asn1_enum,High}, _) ->
256
emit_enc_enumerated_case(uper_bin,_C, {asn1_enum,High}, _) ->
258
"{asn1_enum,EnumV} when integer(EnumV), EnumV > ",High," -> ",
259
"[<<1:1>>,?RT_PER:encode_small_number(EnumV)]"]);
260
emit_enc_enumerated_case(_Per,_C, {asn1_enum,High}, _) ->
253
262
"{asn1_enum,EnumV} when integer(EnumV), EnumV > ",High," -> ",
254
263
"[{bit,1},?RT_PER:encode_small_number(EnumV)]"]);
255
emit_enc_enumerated_case(_C, 'EXT_MARK', _Count) ->
264
emit_enc_enumerated_case(_Erule, _C, 'EXT_MARK', _Count) ->
257
emit_enc_enumerated_case(_C, {1,EnumName}, Count) ->
266
emit_enc_enumerated_case(uper_bin,_C, {1,EnumName}, Count) ->
267
emit(["'",EnumName,"' -> [<<1:1>>,?RT_PER:encode_small_number(",Count,")]"]);
268
emit_enc_enumerated_case(_Per,_C, {1,EnumName}, Count) ->
258
269
emit(["'",EnumName,"' -> [{bit,1},?RT_PER:encode_small_number(",Count,")]"]);
259
emit_enc_enumerated_case(C, {0,EnumName}, Count) ->
270
emit_enc_enumerated_case(uper_bin,C, {0,EnumName}, Count) ->
271
emit(["'",EnumName,"' -> [<<0:1>>,?RT_PER:encode_integer(",{asis,C},", ",Count,")]"]);
272
emit_enc_enumerated_case(_Per,C, {0,EnumName}, Count) ->
260
273
emit(["'",EnumName,"' -> [{bit,0},?RT_PER:encode_integer(",{asis,C},", ",Count,")]"]);
261
emit_enc_enumerated_case(C, EnumName, Count) ->
274
emit_enc_enumerated_case(_Erule, C, EnumName, Count) ->
262
275
emit(["'",EnumName,"' -> ?RT_PER:encode_integer(",{asis,C},", ",Count,")"]).
264
277
%% effective_constraint(Type,C)
312
325
greatest_common_range(SV,[]) ->
314
greatest_common_range([{_,Int}],[{_,{'MIN',Ub}}]) when integer(Int),
327
greatest_common_range(SV,VR) ->
328
greatest_common_range2(mk_vr(SV),mk_vr(VR)).
329
greatest_common_range2({_,Int},{'MIN',Ub}) when integer(Int),
316
331
[{'ValueRange',{'MIN',Int}}];
317
greatest_common_range([{_,Int}],[{_,{Lb,Ub}}]) when integer(Int),
332
greatest_common_range2({_,Int},{Lb,Ub}) when integer(Int),
319
334
[{'ValueRange',{Int,Ub}}];
320
greatest_common_range([{_,Int}],VR=[{_,{_Lb,_Ub}}]) when integer(Int) ->
322
greatest_common_range([{_,L}],[{_,{Lb,Ub}}]) when list(L) ->
335
greatest_common_range2({_,Int},VR={_Lb,_Ub}) when integer(Int) ->
337
greatest_common_range2({_,L},{Lb,Ub}) when list(L) ->
323
338
Min = least_Lb([Lb|L]),
324
339
Max = greatest_Ub([Ub|L]),
325
340
[{'ValueRange',{Min,Max}}].
342
mk_vr([{Type,I}]) when is_atom(Type), is_integer(I) ->
344
mk_vr([{Type,{Lb,Ub}}]) when is_atom(Type) ->
329
350
case lists:member('MIN',L) of
466
gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
467
gen_encode_objectfields(ClassName,[_C|Cs],O,OF,Acc) ->
468
gen_encode_objectfields(ClassName,Cs,O,OF,Acc);
469
gen_encode_objectfields(_,[],_,_,Acc) ->
492
gen_encode_objectfields(Erule,ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
493
gen_encode_objectfields(Erule,ClassName,[_C|Cs],O,OF,Acc) ->
494
gen_encode_objectfields(Erule,ClassName,Cs,O,OF,Acc);
495
gen_encode_objectfields(_, _,[],_,_,Acc) ->
720
752
gen_objset_code(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassDef)->
721
753
ClassFields = (ClassDef#classdef.typespec)#objectclass.fields,
723
gen_objset_enc(ObjSetName,UniqueFName,Set,ClassName,ClassFields,1,[]),
755
gen_objset_enc(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassFields,1,[]),
724
756
gen_objset_dec(ObjSetName,UniqueFName,Set,ClassName,ClassFields,1),
725
757
gen_internal_funcs(Erules,InternalFuncs).
727
759
%% gen_objset_enc iterates over the objects of the object set
728
gen_objset_enc(_,{unique,undefined},_,_,_,_,_) ->
760
gen_objset_enc(_,_,{unique,undefined},_,_,_,_,_) ->
729
761
%% There is no unique field in the class of this object set
730
762
%% don't bother about the constraint
732
gen_objset_enc(ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],
764
gen_objset_enc(Erule,ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],
733
765
ClName,ClFields,NthObj,Acc)->
734
766
emit({"'getenc_",ObjSName,"'(",{asis,UniqueName},",",{asis,Val},
777
809
emit_default_getenc(ObjSetName,UniqueName),
778
810
emit({".",nl,nl}),
779
811
InternalFunc++Acc;
780
gen_objset_enc(ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
812
gen_objset_enc(Erule,ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
781
813
_ClFields,_NthObj,Acc) ->
782
814
emit({"'getenc_",ObjSetName,"'(_, _) ->",nl}),
783
815
emit({indent(3),"fun(_, Val, _) ->",nl}),
784
emit({indent(6),"[{octets,Val}]",nl}),
818
emit([indent(6),"Val",nl]);
820
emit([indent(6),"[{octets,Val}]",nl])
785
822
emit({indent(3),"end.",nl,nl}),
787
gen_objset_enc(_,_,[],_,_,_,Acc) ->
824
gen_objset_enc(_,_,_,[],_,_,_,Acc) ->
790
827
emit_ext_encfun(ModuleName,Name) ->
792
829
Name,"'(T,V,O) end"]).
794
831
emit_default_getenc(ObjSetName,UniqueName) ->
795
emit(["'getenc_",ObjSetName,"'(",{asis,UniqueName},", _) ->",nl]),
796
emit([indent(4),"fun(C,V,_) -> exit({'Type not compatible with table constraint',{component,C},{value,V}}) end"]).
832
emit(["'getenc_",ObjSetName,"'(",{asis,UniqueName},", ErrV) ->",nl]),
833
emit([indent(4),"fun(C,V,_) -> exit({'Type not compatible with table constraint',{component,C},{value,V},{unique_name_and_value,",{asis,UniqueName},",ErrV}}) end"]).
799
836
%% gen_inlined_enc_funs for each object iterates over all fields of a
800
837
%% class, and for each typefield it checks if the object has that
801
838
%% field and emits the proper code.
802
gen_inlined_enc_funs(Fields,[{typefield,Name,_}|Rest],ObjSetName,NthObj) ->
839
gen_inlined_enc_funs(Erule,Fields,[{typefield,Name,_}|Rest],ObjSetName,NthObj) ->
803
840
CurrMod = get(currmod),
804
841
InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
805
842
case lists:keysearch(Name,1,Fields) of
807
844
emit({indent(3),"fun(Type, Val, _) ->",nl,
808
845
indent(6),"case Type of",nl}),
809
846
{Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
810
gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
847
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj+N,Ret);
811
848
{value,{_,Type}} when record(Type,typedef) ->
812
849
emit({indent(3),"fun(Type, Val, _) ->",nl,
813
850
indent(6),"case Type of",nl}),
814
851
emit({indent(9),{asis,Name}," ->",nl}),
815
852
{Ret,N} = emit_inner_of_fun(Type,InternalDefFunName),
816
gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
853
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj+N,Ret);
817
854
{value,{_,#'Externaltypereference'{module=CurrMod,type=T}}} ->
818
855
emit({indent(3),"fun(Type, Val, _) ->",nl,
819
856
indent(6),"case Type of",nl}),
820
857
emit({indent(9),{asis,Name}," ->",nl}),
821
858
emit([indent(12),"'enc_",T,"'(Val)"]),
822
859
% {Ret,N} = emit_inner_of_fun(TDef,InternalDefFunName),
823
gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,[]);
860
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj,[]);
824
861
{value,{_,#'Externaltypereference'{module=M,type=T}}} ->
825
862
emit({indent(3),"fun(Type, Val, _) ->",nl,
826
863
indent(6),"case Type of",nl}),
827
864
emit({indent(9),{asis,Name}," ->",nl}),
828
865
emit([indent(12),"'",M,"'",":'enc_",T,"'(Val)"]),
829
gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,[]);
866
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj,[]);
867
false when Erule == uper_bin ->
868
emit([indent(3),"fun(Type,Val,_) ->",nl,
869
indent(6),"case Type of",nl,
870
indent(9),{asis,Name}," -> Val",nl]),
871
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj,[]);
831
873
emit([indent(3),"fun(Type,Val,_) ->",nl,
832
874
indent(6),"case Type of",nl,
833
875
indent(9),{asis,Name}," -> [{octets,Val}]",nl]),
834
gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,[])
876
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj,[])
836
gen_inlined_enc_funs(Fields,[_H|Rest],ObjSetName,NthObj) ->
837
gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj);
838
gen_inlined_enc_funs(_,[],_,NthObj) ->
878
gen_inlined_enc_funs(Erule,Fields,[_H|Rest],ObjSetName,NthObj) ->
879
gen_inlined_enc_funs(Erule,Fields,Rest,ObjSetName,NthObj);
880
gen_inlined_enc_funs(_,_,[],_,NthObj) ->
841
gen_inlined_enc_funs1(Fields,[{typefield,Name,_}|Rest],ObjSetName,
883
gen_inlined_enc_funs1(Erule,Fields,[{typefield,Name,_}|Rest],ObjSetName,
843
885
CurrentMod = get(currmod),
844
886
InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
860
902
emit({";",nl,indent(9),{asis,Name}," ->",nl}),
861
903
emit([indent(12),"'",M,"'",":'enc_",T,"'(Val)"]),
905
false when Erule == uper_bin ->
907
indent(9),{asis,Name}," -> ",nl,
865
912
indent(9),{asis,Name}," -> ",nl,
866
913
"[{octets,Val}]",nl]),
869
gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+NAdd,Acc2);
870
gen_inlined_enc_funs1(Fields,[_H|Rest],ObjSetName,NthObj,Acc)->
871
gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,Acc);
872
gen_inlined_enc_funs1(_,[],_,NthObj,Acc) ->
916
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj+NAdd,Acc2);
917
gen_inlined_enc_funs1(Erule,Fields,[_H|Rest],ObjSetName,NthObj,Acc)->
918
gen_inlined_enc_funs1(Erule,Fields,Rest,ObjSetName,NthObj,Acc);
919
gen_inlined_enc_funs1(_,_,[],_,NthObj,Acc) ->
873
920
emit({nl,indent(6),"end",nl}),
874
921
emit({indent(3),"end"}),
977
1024
Name,"'(T,V,O1,O2) end"]).
979
1026
emit_default_getdec(ObjSetName,UniqueName) ->
980
emit(["'getdec_",ObjSetName,"'(",{asis,UniqueName},", _) ->",nl]),
981
emit([indent(2), "fun(C,V,_,_) -> exit({{component,C},{value,V}}) end"]).
1027
emit(["'getdec_",ObjSetName,"'(",{asis,UniqueName},", ErrV) ->",nl]),
1028
emit([indent(2), "fun(C,V,_,_) -> exit({{component,C},{value,V},{unique_name_and_value,",{asis,UniqueName},",ErrV}}) end"]).
984
1031
gen_inlined_dec_funs(Fields,[{typefield,Name,_}|Rest],