icstruct.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 1,915 行 · 第 1/4 页
ERL
1,915 行
0, "oe_outindex", generator); {_,{array, _, _}} -> ic_cbe:emit_decoding_stmt(G, N, Fd, StructName ++ "_" ++ EN, "oe_out->" ++ EN , "", "oe_env->_inbuf", 0, "oe_outindex", generator); {union, _, _, _, _} -> %% Sequence member = a union ic_cbe:emit_decoding_stmt(G, N, Fd, StructName ++ "_" ++ ic_forms:get_id2(ET), "&oe_out->" ++ EN , "", "oe_env->_inbuf", 0, "oe_outindex", generator); {_,_} -> ic_cbe:emit_decoding_stmt(G, N, Fd, ET, "&oe_out->" ++ EN , "", "oe_env->_inbuf", 0, "oe_outindex", generator); {scoped_id,_,_,_} -> case ic_symtab:get_full_scoped_name(G, N, ET) of {_FullScopedName, _, {tk_array,_,_}, _} -> ic_cbe:emit_decoding_stmt(G, N, Fd, ET, "oe_out->" ++ EN, "", "oe_env->" "_inbuf", 0, "oe_outindex", generator); {_FullScopedName, _, {tk_string,_}, _} -> ic_cbe:emit_decoding_stmt(G, N, Fd, ET, "oe_out->" ++ EN, "", "oe_env->" "_inbuf", 0, "oe_outindex", generator); {_FullScopedName, _, {tk_struct,_,_,_}, _} -> ic_cbe:emit_decoding_stmt(G, N, Fd, ET, "&oe_out->" ++ EN, "", "oe_env->" "_inbuf", 0, "oe_outindex", generator); {_FullScopedName, _, {tk_union,_,_,_,_,_}, _} -> ic_cbe:emit_decoding_stmt(G, N, Fd, ET, "&oe_out->" ++ EN, "", "oe_env->" "_inbuf", 0, "oe_outindex", generator); _ -> ic_cbe:emit_decoding_stmt(G, N, Fd, ET, "&oe_out->" ++ EN, "", "oe_env->" "_inbuf", 0, "oe_outindex", generator) end end end end, ElTypes).ref_array_static_dec(array, true) -> %% Typedef, Static, Basic Type "&(oe_out)";ref_array_static_dec(array, false) -> %% Typedef, Static, Constr Type "&(oe_out)";ref_array_static_dec(array_no_typedef, true) -> %% No Typedef, Static, Basic Type "&oe_out";ref_array_static_dec(array_no_typedef, false) -> %% No Typedef, Static, Constr Type "&oe_out".ref_array_dynamic_dec(G, N, T, array) -> case ictype:isString(G, N, T) of true -> % Typedef, Dynamic, String "oe_out"; false -> % Typedef, Dynamic, No String "&(oe_out)" end;ref_array_dynamic_dec(G, N, T, array_no_typedef) -> case ictype:isString(G, N, T) of true -> % No Typedef, Dynamic, String "oe_out"; false -> % No Typedef, Dynamic, No String "&oe_out" end.array_decode_dimension_loop(G, N, Fd, [Dim], Dimstr, Type, TDFlag) -> Tname = ic_cbe:mk_variable_name(op_variable_count), ic_cbe:store_tmp_decl(" int ~s = 0;\n",[Tname]), emit(Fd, " if ((oe_error_code = ei_decode_tuple_header(oe_env->_inbuf, " "&oe_env->_iin, &oe_array_size)) < 0) {\n", []), emit_c_dec_rpt(Fd, " ", "ei_decode_tuple_header", []), emit(Fd, " return oe_error_code;\n }\n"), %% This is disabled due to a bug in erl_interface : %% tuples inside tuples hae no correct data about the size %% of the tuple........( allways = 0 ) %%emit(Fd, " if (oe_array_size != ~s)\n",[Dim]), %%emit(Fd, " return -1;\n\n"), emit(Fd, " for (~s = 0; ~s < ~s; ~s++) {\n", [Tname, Tname, Dim, Tname]), ArrAccess = case ic_cbe:is_variable_size(G, N, Type) of true -> ref_array_dynamic_dec(G, N, Type, TDFlag) ++ Dimstr ++ "[" ++ Tname ++ "]"; false -> ref_array_static_dec(TDFlag, ictype:isBasicType(G,N,Type)) ++ Dimstr ++ "[" ++ Tname ++ "]" end, ic_cbe:emit_decoding_stmt(G, N, Fd, Type, ArrAccess, "", "oe_env->_inbuf", 0, "oe_outindex", generator), %% emit(Fd, "\n *oe_outindex += %% sizeof(~s);\n",[ic_cbe:mk_c_type(G, N, Type)]), emit(Fd, " }\n");array_decode_dimension_loop(G, N, Fd, [Dim | Ds], _Dimstr, Type, TDFlag) -> Tname = ic_cbe:mk_variable_name(op_variable_count), ic_cbe:store_tmp_decl(" int ~s = 0;\n",[Tname]), emit(Fd, " if ((oe_error_code = ei_decode_tuple_header(oe_env->_inbuf, " "&oe_env->_iin, &oe_array_size)) < 0) {\n", []), emit_c_dec_rpt(Fd, " ", "ei_decode_tuple_header", []), emit(Fd, " return oe_error_code;\n }\n"), %% This is disabled due to a bug in erl_interface : %% tuples inside tuples hae no correct data about the size %% of the tuple........( allways = 0 ) %%emit(Fd, " if (oe_array_size != ~s)\n",[Dim]), %%emit(Fd, " return -1;\n\n"), emit(Fd, " for (~s = 0; ~s < ~s; ~s++) {\n", [Tname, Tname, Dim, Tname]), array_decode_dimension_loop(G, N, Fd, Ds, "[" ++ Tname ++ "]" , Type, TDFlag), emit(Fd, " }\n").dim_multiplication([D]) -> D;dim_multiplication([D |Ds]) -> D ++ "*" ++ dim_multiplication(Ds).emit_encode(array, G, N, _T, Fd, {_Name, Dim}, Type) -> array_encode_dimension_loop(G, N, Fd, Dim, {"",""}, Type, array);emit_encode(array_no_typedef, G, N, _T, Fd, {_Name, Dim}, Type) -> array_encode_dimension_loop(G, N, Fd, Dim, {"",""}, Type, array_no_typedef);emit_encode(sequence_head, G, N, T, Fd, SeqName, ElType) -> Tname = ic_cbe:mk_variable_name(op_variable_count), ic_cbe:store_tmp_decl(" int ~s = 0;\n\n",[Tname]), MaxSize = get_seq_max(T), if MaxSize == infinity -> ok; true -> emit(Fd, " if (oe_rec->_length > ~w) {\n", [MaxSize]), emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, " "DATA_CONVERSION, \"Length of sequence `~s' " "out of bound\");\n" " return -1;\n }\n", [SeqName]) end, emit(Fd, " if (oe_rec->_length != 0) {\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_list_header(oe_env, " "oe_rec->_length)) < 0) {\n", []), emit_c_enc_rpt(Fd, " ", "oi_ei_encode_list_header", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " for (~s = 0; ~s < oe_rec->_length; ~s++) {\n", [Tname, Tname, Tname]), case ElType of {_,_} -> %% ElType = elementary type or pointer type ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf"); {scoped_id,local,_,["term","erlang"]} -> ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf"); {scoped_id,_,_,_} -> case ic_symtab:get_full_scoped_name(G, N, ElType) of {_, typedef, TDef, _} -> case TDef of {tk_struct,_,_,_} -> ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "&oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf"); {tk_sequence,_,_} -> ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "&oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf"); {tk_union,_,_,_,_,_} -> ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "&oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf"); _ -> ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf") end; {_,enum,_,_} -> ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf"); _ -> ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "&oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf") end; _ -> %% ElType = structure ic_cbe:emit_encoding_stmt(G, N, Fd, ElType, "&oe_rec->_buffer[" ++ Tname ++ "]", "oe_env->_outbuf") end, emit(Fd, " }\n"), emit(Fd, " }\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_empty_list(oe_env)) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_empty_list", []), emit(Fd, " return oe_error_code;\n }\n");emit_encode(struct, G, N, _T, Fd, StructName, ElTypes) -> Length = length(ElTypes) + 1, emit(Fd, " if ((oe_error_code = " "oe_ei_encode_tuple_header(oe_env, ~p)) < 0) {\n", [Length]), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_tuple_header", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if ((oe_error_code = " "oe_ei_encode_atom(oe_env, ~p)) < 0) {\n", [StructName]), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), lists:foreach( fun({ET, EN}) -> case ET of {sequence, _, _} -> %% Sequence = struct ic_cbe:emit_encoding_stmt(G, N, Fd, StructName ++ "_" ++ EN, "&oe_rec->" ++ EN, "oe_env->_outbuf"); {_,{array, _, _Dims}} -> ic_cbe:emit_encoding_stmt(G, N, Fd, StructName ++ "_" ++ EN, "oe_rec->" ++ EN, "oe_env->_outbuf"); {union,_,_,_,_} -> ic_cbe:emit_encoding_stmt(G, N, Fd, StructName ++ "_" ++ ic_forms:get_id2(ET), "&oe_rec->" ++ EN, "oe_env->_outbuf"); {struct,_,_,_} -> ic_cbe:emit_encoding_stmt(G, N, Fd, StructName ++ "_" ++ ic_forms:get_id2(ET), "&oe_rec->" ++ EN, "oe_env->_outbuf"); {scoped_id,_,_,_} -> case ictype:member2type(G,StructName,EN) of struct -> ic_cbe:emit_encoding_stmt(G, N, Fd, ET, "&oe_rec->" ++ EN, "oe_env->_outbuf"); sequence -> ic_cbe:emit_encoding_stmt(G, N, Fd, ET, "&oe_rec->" ++ EN, "oe_env->_outbuf"); union -> ic_cbe:emit_encoding_stmt(G, N, Fd, ET, "&oe_rec->" ++ EN, "oe_env->_outbuf"); array -> ic_cbe:emit_encoding_stmt(G, N, Fd, ET, "oe_rec->" ++ EN, "oe_env->_outbuf"); _ -> ic_cbe:emit_encoding_stmt(G, N, Fd, ET, "oe_rec->" ++ EN, "oe_env->_outbuf") end; _ -> ic_cbe:emit_encoding_stmt(G, N, Fd, ET, "oe_rec->" ++ EN, "oe_env->_outbuf") end end, ElTypes).ref_array_static_enc(array, true) -> %% Typedef, Static, Basic Type "oe_rec";ref_array_static_enc(array, false) -> %% Typedef, Static, Constr Type "&(oe_rec)"; ref_array_static_enc(array_no_typedef, true) -> %% No Typedef, Static, Basic Type "oe_rec";ref_array_static_enc(array_no_typedef, false) -> %% No Typedef, Static, Constr Type "&oe_rec".ref_array_dynamic_enc(G, N, T, array) -> case ictype:isString(G, N, T) of true -> % Typedef, Dynamic, String "oe_rec"; false -> % Typedef, Dynamic, No String "&(oe_rec)" end;ref_array_dynamic_enc(G, N, T, array_no_typedef) -> case ictype:isString(G, N, T) of true -> % No Typedef, Dynamic, String "oe_rec"; false -> % No Typedef, Dynamic, No String "&oe_rec" end.array_encode_dimension_loop(G, N, Fd, [Dim], {Str1,_Str2}, Type, TDFlag) -> Tname = ic_cbe:mk_variable_name(op_variable_count), ic_cbe:store_tmp_decl(" int ~s = 0;\n",[Tname]), emit(Fd, " if ((oe_error_code = " "oe_ei_encode_tuple_header(oe_env, ~s)) < 0) {\n", [Dim]), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_tuple_header", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " for (~s = 0; ~s < ~s; ~s++) {\n", [Tname, Tname, Dim, Tname]), ArrAccess = case ic_cbe:is_variable_size(G, N, Type) of true -> ref_array_dynamic_enc(G, N, Type, TDFlag) ++ Str1 ++ "[" ++ Tname ++ "]"; false -> ref_array_static_enc(TDFlag, ictype:isBasicType(G,N,Type)) ++ Str1 ++ "[" ++ Tname ++ "]" end, ic_cbe:emit_encoding_stmt(G, N, Fd, Type, ArrAccess, "oe_env->_outbuf"), emit(Fd, " }\n");array_encode_dimension_loop(G, N, Fd, [Dim | Ds],{Str1,Str2}, Type, TDFlag) -> Tname = ic_cbe:mk_variable_name(op_variable_count), ic_cbe:store_tmp_decl(" int ~s = 0;\n",[Tname]), emit(Fd, " if ((oe_error_code = " "oe_ei_encode_tuple_header(oe_env, ~s)) < 0) {\n", [Dim]), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_tuple_header", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " for (~s = 0; ~s < ~s; ~s++) {\n", [Tname, Tname, Dim, Tname]), array_encode_dimension_loop(G, N, Fd, Ds, {Str1 ++ "[" ++ Tname ++ "]", Str2}, Type, TDFlag), emit(Fd, " }\n").emit_sizecount(array, G, N, _T, Fd, {_Name, Dim}, Type) -> emit(Fd, " if(*oe_size == 0)\n",[]), AlignName = lists:concat(["*oe_size + ", dim_multiplication(Dim), " * sizeof(", ic_cbe:mk_c_type(G, N, Type),")"]), emit(Fd, " *oe_size = ~s;\n\n",[align(AlignName)]), array_size_dimension_loop(G, N, Fd, Dim, Type), emit(Fd, " *oe_size = ~s;\n\n", [align("*oe_size + oe_malloc_size")]), ic_codegen:nl(Fd);emit_sizecount(sequence_head, G, N, T, Fd, SeqName, ElType) -> ic_cbe:store_tmp_decl(" int oe_seq_len = 0;\n", []), ic_cbe:store_tmp_decl(" int oe_seq_count = 0;\n", []), emit(Fd, " if(*oe_size == 0)\n",[]), emit(Fd, " *oe_size = ~s;\n\n", [align(["*oe_size + sizeof(", SeqName, ")"])]), MaxSize = get_seq_max(T), emit(Fd, " if ((oe_error_code = ei_get_type(oe_env->_inbuf, " "oe_size_count_index, &oe_type, &oe_seq_len)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_get_type", []), emit(Fd, " return oe_error_code;\n }\n"), if MaxSize == infinity -> ok; true -> emit(Fd, " if (oe_seq_len > ~w) {\n", [MaxSize]), emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, " "DATA_CONVERSION, \"Length of sequence `~s' " "out of bound\");\n" " return -1;\n }\n", [SeqName]) end, CType = ic_cbe:mk_c_type(G, N, ElType), emit(Fd, " if ((oe_error_code = ei_decode_list_header(oe_env->_inbuf, " "oe_size_count_index, NULL)) < 0) {\n"), case ictype:isBasicTypeOrEterm(G, N, ElType) of true -> emit(Fd, " if ((oe_error_code = ei_decode_string(oe_env->"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?