ic_code.erl

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

ERL
583
字号
type_expand_all(_G,_N,_X,_Fd,_Tabs,[]) ->     ok;type_expand_all(G,N,X,Fd,Tabs,[{ArgName,Type}|Rest]) ->    type_expand(G,N,X,Fd,Tabs,ArgName,Type),    type_expand_all(G,N,X,Fd,Tabs,Rest);type_expand_all(G,N,X,Fd,Tabs,[{default,_ArgName,Type}|Rest]) ->    type_expand(G,N,X,Fd,Tabs,"Def",Type),    type_expand_all(G,N,X,Fd,Tabs,Rest);type_expand_all(G,N,X,Fd,Tabs,[{LabelNr,_ArgName,Type}|Rest]) when integer(LabelNr) ->    type_expand(G,N,X,Fd,Tabs,"V" ++ integer_to_list(LabelNr),Type),    type_expand_all(G,N,X,Fd,Tabs,Rest);type_expand_all(G,N,X,Fd,Tabs,[{Label,_ArgName,Type}|Rest]) ->    type_expand(G,N,X,Fd,Tabs,Label,Type),    type_expand_all(G,N,X,Fd,Tabs,Rest).type_expand(_G,_N,_X,Fd,Tabs,Name,tk_null) ->    type_expand_null(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_void) ->    type_expand_void(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_float) ->    type_expand_float(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_double) ->    type_expand_double(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_longdouble) ->    type_expand_longdouble(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_short) ->    type_expand_short(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_ushort) ->    type_expand_ushort(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_long) ->    type_expand_long(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_longlong) ->    type_expand_longlong(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_ulong) ->    type_expand_ulong(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_ulonglong) ->    type_expand_ulonglong(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_char) ->    type_expand_char(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_wchar) ->    type_expand_wchar(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_boolean) ->    type_expand_boolean(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_octet) ->    type_expand_octet(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_any) ->    type_expand_any(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_TypeCode) ->    type_expand_typecode(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,tk_Principal) ->    type_expand_principal(Fd,Tabs,Name);type_expand(G, N, X,Fd,Tabs,Name, {tk_except, Id, ExcName, ElementList}) ->    type_expand_exception(G, N, X, Fd,Tabs,Name, 			  {tk_except, Id, ExcName, ElementList});type_expand(_G,_N,_X,Fd,Tabs,Name,{tk_fixed, _Digits, _Scale}) ->    type_expand_fixed(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,{tk_objref, _IFRId, _ObjTabs, _ObjName}) ->    type_expand_object(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,{tk_objref, _IFRId, _ObjName}) ->    type_expand_object(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,{tk_string, _Length}) ->    type_expand_string(Fd,Tabs,Name);type_expand(_G,_N,_X,Fd,Tabs,Name,{tk_wstring, _Length}) ->    type_expand_wstring(Fd,Tabs,Name);type_expand(G,N,X,Fd,Tabs,Name,{tk_union, IFRId, UnionName, DTC, DNr, LblList}) ->    type_expand_union(G,N,X,Fd,Tabs,Name,{tk_union, IFRId, UnionName, DTC, DNr, LblList});type_expand(_G,_N,_X,Fd,Tabs,Name,{tk_enum, IFRId, EnumName, ElemNameList}) ->    type_expand_enum(Fd,Tabs,Name,{tk_enum, IFRId, EnumName, ElemNameList});type_expand(G,N,X,Fd,Tabs,Name,{tk_sequence, ElemTC, Length}) ->    type_expand_sequence(G,N,X,Fd,Tabs,Name,{tk_sequence, ElemTC, Length});type_expand(G,N,X,Fd,Tabs,Name,{tk_array, ElemTC, Length}) ->    type_expand_array(G,N,X,Fd,Tabs,Name,{tk_array, ElemTC, Length});type_expand(G,N,X,Fd,Tabs,Name,{tk_struct, IFRId, StructName, TcList}) ->    type_expand_struct(G,N,X,Fd,Tabs,Name,{tk_struct, IFRId, StructName, TcList});type_expand(_G,_N,_X,Fd,Tabs,Name,_) ->    type_expand_error(Fd,Tabs,Name).%% Basic OMG IDL typestype_expand_null(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = null()~n",[Tabs,Name]).type_expand_void(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = void()~n",[Tabs,Name]).type_expand_float(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = float()~n",[Tabs,Name]).type_expand_double(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = double()~n",[Tabs,Name]).type_expand_longdouble(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = long_double()~n",[Tabs,Name]).type_expand_short(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = short()~n",[Tabs,Name]).type_expand_ushort(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = unsigned_Short()~n",[Tabs,Name]).type_expand_long(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = long()~n",[Tabs,Name]).type_expand_longlong(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = long_Long()~n",[Tabs,Name]).type_expand_ulong(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = unsigned_Long()~n",[Tabs,Name]).type_expand_ulonglong(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = unsigned_Long_Long()~n",[Tabs,Name]).type_expand_char(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = char()~n",[Tabs,Name]).type_expand_wchar(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = wchar()~n",[Tabs,Name]).type_expand_boolean(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = boolean()~n",[Tabs,Name]).type_expand_octet(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = octet()~n",[Tabs,Name]).type_expand_any(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = any()~n",[Tabs,Name]).type_expand_typecode(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = TypeCode()~n",[Tabs,Name]).type_expand_principal(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = principal()~n",[Tabs,Name]).type_expand_fixed(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = fixed()~n",[Tabs,Name]).type_expand_object(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = Object_Ref()~n",[Tabs,Name]).%% Constructed OMG IDL typestype_expand_string(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = String()~n",[Tabs,Name]).type_expand_wstring(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = WString()~n",[Tabs,Name]).type_expand_exception(G, N, X, Fd, Tabs, Name, {tk_except, Id, ExcName, ElementList}) ->    ScopedStructName = getScopedName(G, N, ExcName, Id),    ic_codegen:emit(Fd,"%%~s ~s = ",[Tabs, Name]),    type_expand_exception_rule(Fd, ScopedStructName, ElementList),    type_expand_all(G, N, X, Fd, Tabs, ElementList).type_expand_struct(G,N,X,Fd,Tabs,Name,{tk_struct, IFRId, StructName, TcList}) ->    ScopedStructName = getScopedName(G,N,StructName,IFRId),    ic_codegen:emit(Fd,"%%~s ~s = ",[Tabs,Name]),    type_expand_struct_rule(Fd,ScopedStructName,TcList),    type_expand_all(G,N,X,Fd,Tabs,TcList).type_expand_union(G,N,X,Fd,Tabs,Name,{tk_union, IFRId, UnionName, DTC, _DNr, LblList}) ->    ScopedUnionName = getScopedName(G,N,UnionName,IFRId),    ic_codegen:emit(Fd,"%%~s ~s = #'~s'{label, value}\n",[Tabs,Name,ScopedUnionName]),    type_expand(G,N,X,Fd,Tabs,"label",DTC),    ic_codegen:emit(Fd,"%%~s value = ",[Tabs]),    type_expand_union_rule(Fd,LblList),    type_expand_all(G,N,X,Fd,Tabs,LblList).type_expand_enum(Fd,Tabs,Name,{tk_enum, _IFRId, EnumName, ElemNameList}) ->    ic_codegen:emit(Fd,"%%~s ~s = ~s~n",[Tabs,Name,EnumName]),    type_expand_enum_rule(Fd,Tabs,EnumName,ElemNameList).type_expand_sequence(G,N,X,Fd,Tabs,Name,{tk_sequence, ElemTC, _Length}) ->    ic_codegen:emit(Fd,"%%~s ~s = [ ~sElem ]~n",[Tabs,Name,Name]),    type_expand(G,N,X,Fd,Tabs,Name++"Elem",ElemTC).type_expand_array(G,N,X,Fd,Tabs,Name,{tk_array, ElemTC, _Length}) ->    ic_codegen:emit(Fd,"%%~s ~s = { ~sElem[,..~sElem] }~n",[Tabs,Name,Name,Name]),    type_expand(G,N,X,Fd,Tabs,Name++"Elem",ElemTC).type_expand_error(Fd,Tabs,Name) ->    ic_codegen:emit(Fd,"%%~s ~s = ????~n",[Tabs,Name]).type_expand_exception_rule(Fd,_Name,[]) ->    ic_codegen:emit(Fd," ???? ");type_expand_exception_rule(Fd,Name,TcList) ->    ic_codegen:emit(Fd,"#'~s'{",[Name]),     type_expand_exception_rule(Fd,TcList).type_expand_exception_rule(Fd,[{Name,_TC}]) ->    ic_codegen:emit(Fd,"~s}~n",[Name]);type_expand_exception_rule(Fd,[{Name,_TC}|Rest]) ->    ic_codegen:emit(Fd,"~s,",[Name]),    type_expand_exception_rule(Fd,Rest).type_expand_struct_rule(Fd,_Name,[]) ->    ic_codegen:emit(Fd," ???? ");type_expand_struct_rule(Fd,Name,TcList) ->    ic_codegen:emit(Fd,"#'~s'{",[Name]),     type_expand_struct_rule(Fd,TcList).type_expand_struct_rule(Fd,[{Name,_TC}]) ->    ic_codegen:emit(Fd,"~s}~n",[Name]);type_expand_struct_rule(Fd,[{Name,_TC}|Rest]) ->    ic_codegen:emit(Fd,"~s,",[Name]),    type_expand_struct_rule(Fd,Rest).type_expand_union_rule(Fd,[]) ->    ic_codegen:emit(Fd," ????");type_expand_union_rule(Fd,[{default,_Name,_TC}]) ->    ic_codegen:emit(Fd,"Def~n",[]);type_expand_union_rule(Fd,[{LNr,_Name,_TC}]) when integer(LNr)->    ic_codegen:emit(Fd,"V~p~n",[LNr]);type_expand_union_rule(Fd,[{Label,_Name,_TC}]) ->    ic_codegen:emit(Fd,"~s~n",[Label]);type_expand_union_rule(Fd,[{default,_Name,_TC}|Rest]) ->    ic_codegen:emit(Fd,"Default | "),    type_expand_union_rule(Fd,Rest);type_expand_union_rule(Fd,[{LNr,_Name,_TC}|Rest]) when integer(LNr) ->    ic_codegen:emit(Fd,"V~p | ",[LNr]),    type_expand_union_rule(Fd,Rest);type_expand_union_rule(Fd,[{Label,_Name,_TC}|Rest]) ->    ic_codegen:emit(Fd,"~s | ",[Label]),    type_expand_union_rule(Fd,Rest).type_expand_enum_rule(Fd,Tabs,Name,[]) ->    ic_codegen:emit(Fd,"%%~s ~s = ????",[Tabs,Name]);type_expand_enum_rule(Fd,Tabs,Name,ElList) ->    ic_codegen:emit(Fd,"%%~s ~s = ",[Tabs,Name]),    type_expand_enum_rule(Fd,ElList).type_expand_enum_rule(Fd,[ElName]) ->    ic_codegen:emit(Fd,"'~s' ~n",[ElName]);type_expand_enum_rule(Fd,[First|Rest]) ->    ic_codegen:emit(Fd,"'~s' | ",[First]),    type_expand_enum_rule(Fd,Rest).type_expand_enum_elements(_Fd,_Tabs,[]) ->    ok;type_expand_enum_elements(Fd,Tabs,[Elem|Elems]) ->    ic_codegen:emit(Fd,"%%~s ~s = Atom()~n",[Tabs,Elem]),    type_expand_enum_elements(Fd,Tabs,Elems).%% Returns the right scoped name to be used%% along with the expansion comments getScopedName(G,N,Name,IfrId) ->    PTab = ic_genobj:pragmatab(G),    case ets:match(PTab,{alias,'$0',IfrId}) of	[] -> %% No Alias - should never happen	    ic_util:to_undersc(ic_pragma:mk_scope(IfrId));	[[[_S|N]]] -> %% An alias	    ic_util:to_undersc([Name|N]);	[[[S|FoundScope]]] -> %% Maybe inherited	    case ic_pragma:is_inherited_by(FoundScope,N,PTab) of		false -> %% Not inherited		    ic_util:to_undersc([S|FoundScope]);		true -> %% inherited		    ic_util:to_undersc([Name|N])	    end    end.%% mk_list produces a nice comma separated %% string of variable namesmk_list([]) -> [];mk_list([Arg | Args]) ->    Arg ++ mk_list2(Args).mk_list2([Arg | Args]) ->    ", " ++ Arg ++ mk_list2(Args);mk_list2([]) -> [].%%-----------------------------------------------------------------%% Internal functions%%-----------------------------------------------------------------

⌨️ 快捷键说明

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