asn1ct_constructed_ber.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 1,497 行 · 第 1/4 页

ERL
1,497
字号
    emit(["   'dec_",asn1ct_gen:list2name(Typename),"_result'(lists:sort(SetTerm), SetBytes, "]),    asn1ct_gen_ber:add_removed_bytes(),    emit([").",nl,nl,nl]),    emit({"%%-------------------------------------------------",nl}),    emit({"%% Set loop fun for ",asn1ct_gen:list2name(Typename),nl}),    emit({"%%-------------------------------------------------",nl}),    asn1ct_name:clear(),    asn1ct_name:new(term),    emit(["'dec_",asn1ct_gen:list2name(Typename),"_fun'(",{curr,bytes},	  ", OptOrMand) ->",nl]),        asn1ct_name:new(bytes),    gen_dec_set(Erules,Typename,CompList,1,Ext),    emit(["      %% tag not found, if extensionmark we should skip bytes here",nl]),    emit([indent(6),"_ -> {[], Bytes,0}",nl]),    emit([indent(3),"end.",nl,nl,nl]),    emit({"%%-------------------------------------------------",nl}),    emit({"%% Result ",asn1ct_gen:list2name(Typename),nl}),    emit({"%%-------------------------------------------------",nl}),    asn1ct_name:clear(),    emit({"'dec_",asn1ct_gen:list2name(Typename),"_result'(",	  asn1ct_gen_ber:unused_var("TermList",D#type.def),", Bytes, Rb) ->",nl}),        case gen_dec_set_result(Erules,Typename,CompList) of	no_terms -> 	    	    %% return value as record	    asn1ct_name:new(rb),	    emit({"   {{'",asn1ct_gen:list2rname(Typename),"'}, Bytes, Rb}.",nl});	_ ->	    emit({nl,"   case ",{curr,termList}," of",nl}),	    emit({"      [] -> {{'",asn1ct_gen:list2rname(Typename),"', "}),	    mkvlist(asn1ct_name:all(term)),	    emit({"}, Bytes, Rb};",nl}),    	    emit({"      ExtraAtt -> exit({error,{asn1,{too_many_attributes, ExtraAtt}}})",nl}),	    emit({"   end.",nl}),	    emit({nl,nl,nl})    end.%%===============================================================================%%===============================================================================%%===============================================================================%%  Encode/decode SEQUENCE OF and SET OF%%===============================================================================%%===============================================================================%%===============================================================================gen_encode_sof(Erules,Typename,_InnerTypename,D) when record(D,type) ->    asn1ct_name:start(),    {SeqOrSetOf, Cont} = D#type.def,    Objfun = case D#type.tablecinf of		 [{objfun,_}|_R] ->		     ", ObjFun";		 _ ->		     ""	     end,    emit({"   {EncBytes,EncLen} = 'enc_",asn1ct_gen:list2name(Typename),	  "_components'(Val",Objfun,",[],0),",nl}),    MyTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- D#type.tag]	++ 	[#tag{class = asn1ct_gen_ber:decode_class('UNIVERSAL'),	      number = asn1ct_gen_ber:decode_type(SeqOrSetOf),	      form = ?CONSTRUCTED,	      type = 'IMPLICIT'}],%    gen_encode_tags(Erules,MyTag,"EncLen","EncBytes"), 	    emit(["   ?RT_BER:encode_tags(TagIn ++ ", 		  {asis,MyTag},", EncBytes, EncLen).",nl,nl]),    gen_encode_sof_components(Erules,Typename,SeqOrSetOf,Cont).%     gen_enc_line(Erules,Typename,TypeNameSuffix,Cont,"H",0,% 		 mandatory,"{EncBytes,EncLen} = "),    gen_decode_sof(Erules,Typename,_InnerTypename,D) when record(D,type) ->    asn1ct_name:start(),    {SeqOrSetOf, TypeTag, Cont} = 	case D#type.def of	    {'SET OF',_Cont} -> {'SET OF','SET',_Cont};	    {'SEQUENCE OF',_Cont} -> {'SEQUENCE OF','SEQUENCE',_Cont}	end,    TypeNameSuffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,Cont#type.def),        emit({"   %%-------------------------------------------------",nl}),    emit({"   %% decode tag and length ",nl}),    emit({"   %%-------------------------------------------------",nl}),        asn1ct_name:new(rb),    MyTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- D#type.tag]	++ 	[#tag{class = asn1ct_gen_ber:decode_class('UNIVERSAL'),	      number = asn1ct_gen_ber:decode_type(TypeTag),	      form = ?CONSTRUCTED,	      type = 'IMPLICIT'}],    emit(["   {{_,Len},",{next,bytes},",",{curr,rb},	  "} = ?RT_BER:check_tags(TagIn ++ ",{asis,MyTag},", ",	  {curr,bytes},", OptOrMand), ",nl]),    emit(["   ?RT_BER:decode_components(",{curr,rb}]),    InnerType = asn1ct_gen:get_inner(Cont#type.def),    ContName = case asn1ct_gen:type(InnerType) of		   Atom when atom(Atom) -> Atom;		   _ -> TypeNameSuffix	       end,    emit([", Len, ",{next,bytes},", "]),%    NewCont = %	case Cont#type.def of%	    {'ENUMERATED',_,Components}-> %		Cont#type{def={'ENUMERATED',Components}};%	    _ -> Cont%	end,     ObjFun =	case D#type.tablecinf of	    [{objfun,_}|_R] ->		", ObjFun";	    _ ->		[]	end,    gen_dec_line_sof(Erules,Typename,ContName,Cont,ObjFun),    emit([", []).",nl,nl,nl]).    gen_encode_sof_components(Erules,Typename,SeqOrSetOf,Cont)   when record(Cont,type)->    {Objfun,ObjFun_novar,EncObj} = 	case Cont#type.tablecinf of	    [{objfun,_}|_R] ->		{", ObjFun",", _",{no_attr,"ObjFun"}};	    _ ->		{"","",false}	end,    emit(["'enc_",asn1ct_gen:list2name(Typename),	  "_components'([]",ObjFun_novar,", AccBytes, AccLen) -> ",nl]),    case catch lists:member(der,get(encoding_options)) of	true when SeqOrSetOf=='SET OF' ->	    emit([indent(3),		  "{asn1rt_check:dynamicsort_SETOF(AccBytes),AccLen};",nl,nl]);	_ ->	    emit([indent(3),"{lists:reverse(AccBytes),AccLen};",nl,nl])    end,    emit(["'enc_",asn1ct_gen:list2name(Typename),	  "_components'([H|T]",Objfun,",AccBytes, AccLen) ->",nl]),    TypeNameSuffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,Cont#type.def),    gen_enc_line(Erules,Typename,TypeNameSuffix,Cont,"H",3,%		 mandatory,"{EncBytes,EncLen} = ",EncObj),		 mandatory,EncObj),    emit([",",nl]),    emit([indent(3),"'enc_",asn1ct_gen:list2name(Typename),	  "_components'(T",Objfun,","]),     emit(["[EncBytes|AccBytes], AccLen + EncLen).",nl,nl]).%%============================================================================%%  Encode/decode CHOICE%%%%============================================================================gen_encode_choice(Erules,Typename,D) when record(D,type) ->    ChoiceTag = D#type.tag,    {'CHOICE',CompList} = D#type.def,    Ext = extensible(CompList),    CompList1 = case CompList of		    {Rl,El} -> Rl ++ El;		    _ -> CompList		end,    gen_enc_choice(Erules,Typename,ChoiceTag,CompList1,Ext),    emit({nl,nl}).gen_decode_choice(Erules,Typename,D) when record(D,type) ->    asn1ct_name:start(),    asn1ct_name:new(bytes),    ChoiceTag = D#type.tag,    {'CHOICE',CompList} = D#type.def,    Ext = extensible(CompList),    CompList1 = case CompList of		    {Rl,El} -> Rl ++ El;		    _ -> CompList		end,    gen_dec_choice(Erules,Typename,ChoiceTag,CompList1,Ext),    emit({".",nl}).%%============================================================================%%  Encode SEQUENCE%%%%============================================================================gen_enc_sequence_call(Erules,TopType,[#'ComponentType'{name=Cname,typespec=Type,prop=Prop}|Rest],Pos,Ext,EncObj) ->    asn1ct_name:new(encBytes),    asn1ct_name:new(encLen),    Element = 	case TopType of	    ['EXTERNAL'] ->		io_lib:format("?RT_BER:cindex(~w,NewVal,~w)",[Pos+1,Cname]);	    _ ->		io_lib:format("?RT_BER:cindex(~w,Val,~w)",[Pos+1,Cname])	end,    InnerType = asn1ct_gen:get_inner(Type#type.def),    print_attribute_comment(InnerType,Pos,Prop),    gen_enc_line(Erules,TopType,Cname,Type,Element,3,Prop,EncObj),    case Rest of	[] ->	    emit({com,nl});	_ ->	    emit({com,nl}),	    gen_enc_sequence_call(Erules,TopType,Rest,Pos+1,Ext,EncObj)    end;gen_enc_sequence_call(_Erules,_TopType,[],_Num,_,_) ->	true.%%============================================================================%%  Decode SEQUENCE%%%%============================================================================gen_dec_sequence_call(Erules,TopType,CompList,Ext,DecObjInf) ->    gen_dec_sequence_call1(Erules,TopType, CompList, 1, Ext,DecObjInf,[],[]).gen_dec_sequence_call1(Erules,TopType,[#'ComponentType'{name=Cname,typespec=Type,prop=Prop,tags=Tags}|Rest],Num,Ext,DecObjInf,LeadingAttrAcc,ArgsAcc) ->    {LA,PostponedDec} = 	gen_dec_component(Erules,TopType,Cname,Tags,Type,Num,Prop,			  Ext,DecObjInf),    case Rest of	[] ->	    {LA ++ LeadingAttrAcc,PostponedDec ++ ArgsAcc};	_ ->	    emit({com,nl}),%	    asn1ct_name:new(term),	    asn1ct_name:new(bytes),	    gen_dec_sequence_call1(Erules,TopType,Rest,Num+1,Ext,DecObjInf,				   LA++LeadingAttrAcc,PostponedDec++ArgsAcc)    end;gen_dec_sequence_call1(_Erules,_TopType,[],1,_,_,_,_) ->    no_terms.%%gen_dec_sequence_call1(Erules,_TopType,[],Num,_) ->%%    true.%%----------------------------%%SEQUENCE mandatory%%----------------------------gen_dec_component(Erules,TopType,Cname,CTags,Type,Pos,Prop,Ext,DecObjInf) ->    InnerType = 	case Type#type.def of	    #'ObjectClassFieldType'{type=OCFTType} -> OCFTType;	    _ -> asn1ct_gen:get_inner(Type#type.def)	end,% 	case asn1ct_gen:get_constraint(Type#type.constraint,% 				       tableconstraint_info) of% 	    no ->% 		asn1ct_gen:get_inner(Type#type.def);% 	    _ ->% 		Type#type.def% 	end,    Prop1 = case {Prop,Ext} of		{mandatory,{ext,Epos,_}} when Pos >= Epos ->		    'OPTIONAL';		_ ->		    Prop	    end,    print_attribute_comment(InnerType,Pos,Prop1),    emit("   "),        case {InnerType,DecObjInf} of	{{typefield,_},NotFalse} when NotFalse /= false ->	    asn1ct_name:new(term),	    asn1ct_name:new(tmpterm),	    emit({"{",{curr,tmpterm},", ",{next,bytes},",",{next,rb},"} = "});	{{objectfield,_,_},_} ->	    asn1ct_name:new(term),	    asn1ct_name:new(tmpterm),	    emit({"{",{curr,tmpterm},", ",{next,bytes},",",{next,rb},"} = "});	_ ->	    asn1ct_name:new(term),	    emit({"{",{curr,term},",",{next,bytes},",",{next,rb},"} = "})    end,    asn1ct_name:new(rb),    PostponedDec = 	gen_dec_line(Erules,TopType,Cname,CTags,Type,Prop1,DecObjInf),    asn1ct_name:new(form),    PostponedDec.%%-------------------------------------%%  Decode SET%%-------------------------------------gen_dec_set(Erules,TopType,CompList,Pos,_Ext) ->    TagList = get_all_choice_tags(CompList),    emit({indent(3),	  {curr,tagList}," = ",{asis,TagList},",",nl}),    emit({indent(3),	  "case ?RT_BER:check_if_valid_tag(Bytes, ",	  {curr,tagList},", OptOrMand) of",nl}),    asn1ct_name:new(tagList),    asn1ct_name:new(rbCho),    asn1ct_name:new(choTags),    gen_dec_set_cases(Erules,TopType,CompList,TagList,Pos),    asn1ct_name:new(tag),    asn1ct_name:new(bytes).gen_dec_set_cases(_,_,[],_,_) ->    ok;gen_dec_set_cases(Erules,TopType,[H|T],List,Pos) ->    case H of	{'EXTENSIONMARK', _, _} ->	    gen_dec_set_cases(Erules,TopType,T,List,Pos);	_ ->	    Name = H#'ComponentType'.name,	    Type = H#'ComponentType'.typespec,	    emit({indent(6),"'",Name,"' ->",nl}),	    case Type#type.def of		{'CHOICE',_NewCompList} -> 		    gen_dec_set_cases_choice(Erules,TopType,H,Pos);		_ ->		    gen_dec_set_cases_type(Erules,TopType,H,Pos)	    end,	    gen_dec_set_cases(Erules,TopType,T,List,Pos+1)    end.gen_dec_set_cases_choice(_Erules,TopType,H,Pos) ->    Cname = H#'ComponentType'.name,    Tag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}	   || X <- (H#'ComponentType'.typespec)#type.tag],    asn1ct_name:new(rbCho),    emit({indent(9),"{Dec, Rest, ",{curr,rbCho},"} = "}),    emit({"'dec_",asn1ct_gen:list2name([Cname|TopType]),	  "'(Bytes,OptOrMand,",{asis,Tag},"),",nl}),    emit(["      {{",Pos,",Dec}, Rest, ",{curr,rbCho},"}"]),    emit([";",nl,nl]).gen_dec_set_cases_type(Erules,TopType,H,Pos) ->    Cname = H#'ComponentType'.name,    Type = H#'ComponentType'.typespec,    %% always use Prop = mandatory here    Prop = H#'ComponentType'.prop,    asn1ct_name:new(rbCho),    emit({indent(9),"{Dec, Rest, ",{curr,rbCho},"} = "}),    asn1ct_name:delete(bytes),    %% we have already seen the tag so now we must find the value     %% that why we always use 'mandatory' here    gen_dec_line(Erules,TopType,Cname,[],Type,mandatory,decObjInf),     asn1ct_name:new(bytes),        emit([",",nl]),    emit(["{{",Pos,",Dec}, Rest, ",{curr,rbCho},"}"]),    emit([";",nl,nl]).%%---------------------------------%%  Decode SET result%%---------------------------------gen_dec_set_result(Erules,TopType,{CompList,_ExtList}) ->

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?