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