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 + -
显示快捷键?