%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 1998-2009. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% %CopyrightEnd% %% %% -module(icunion). -import(ic_codegen, [emit/2, emit/3, emit/4, emit_c_enc_rpt/4, emit_c_dec_rpt/4]). -import(ic_cbe, [mk_c_type/3, mk_c_type/4]). -include("icforms.hrl"). -include("ic.hrl"). %%----------------------------------------------------------------- %% External exports %%----------------------------------------------------------------- -export([union_gen/4]). %%----------------------------------------------------------------- %% Internal exports %%----------------------------------------------------------------- -export([]). union_gen(G, N, X, c) when is_record(X, union) -> emit_c_union(G, N, X); union_gen(_G, _N, _X, _L) -> ok. %% Emits the union emit_c_union(G, N, X) -> %%io:format("Rec = ~p\n",[X]), case ic_genobj:is_hrlfile_open(G) of true -> %% Sort Union Default = put it last in case list NewX = #union{ id = X#union.id, type = X#union.type, body = mvDefaultToTail(X#union.body), tk = X#union.tk }, UnionScope = [ic_forms:get_id2(NewX) | N], case ic_pragma:is_local(G,UnionScope) of true -> HFd = ic_genobj:hrlfiled(G), emit_c_union_values(G, N, NewX, HFd), UnionName = ic_util:to_undersc(UnionScope), emit(HFd, "\n#ifndef __~s__\n",[ictype:to_uppercase(UnionName)]), emit(HFd, "#define __~s__\n",[ictype:to_uppercase(UnionName)]), ic_codegen:mcomment_light(HFd, [io_lib:format("Union definition: ~s", [UnionName])], c), emit(HFd, "typedef struct {\n"), emit(HFd, " ~s _d;\n", [get_c_union_discriminator(G, N, NewX)]), emit(HFd, " union {\n"), emit_c_union_values_decl(G, N, NewX, HFd), emit(HFd, " } _u;\n"), emit(HFd, "} ~s;\n\n", [UnionName]), emit(HFd, "int ~s~s(CORBA_Environment *oe_env, int*, int*);\n", [ic_util:mk_oe_name(G, "sizecalc_"), UnionName]), emit(HFd, "int ~s~s(CORBA_Environment *oe_env, ~s*);\n", [ic_util:mk_oe_name(G, "encode_"), UnionName, UnionName]), emit(HFd, "int ~s~s(CORBA_Environment *oe_env, char *, int*, ~s*);\n", [ic_util:mk_oe_name(G, "decode_"), UnionName, UnionName]), emit(HFd, "\n#endif\n\n"), create_c_union_file(G, N, NewX, UnionName); false -> %% Do not generate included types att all. ok end; false -> ok end. %% Loops over union members and creates members typedefs emit_c_union_values(G, N, X, Fd) -> emit_c_union_values_loop(G, N, X, Fd, X#union.body). emit_c_union_values_loop(G, N, X, Fd, [CU]) -> case CU of {case_dcl,_,Id,Type} -> case Id of {array, _AID, _SZ} -> % Check for arrays mk_array_file(G,N,X,Id,Type,Fd); _ -> % Elementary types or seq/struct ok end; _ -> error end; emit_c_union_values_loop(G, N, X, Fd, [CU |CUs]) -> case CU of {case_dcl,_,Id,Type} -> case Id of {array, _AID, _SZ} -> % Check for arrays mk_array_file(G,N,X,Id,Type,Fd); _ -> % Elementary types or seq/struct emit_c_union_values_loop(G, N, X, Fd, CUs) end; _ -> error end. %% Loops over union members and declares members inside union structure emit_c_union_values_decl(G, N, X, Fd) -> emit_c_union_values_decl_loop(G, N, X, Fd, X#union.body). emit_c_union_values_decl_loop(G, N, X, Fd, [CU]) -> case CU of {case_dcl,_,Id,Type} -> case Id of {array, _AID, _SZ} -> % Check for arrays mk_array_decl(G,N,X,Id,Type,Fd); _ -> % Elementary types or seq/struct mk_union_member_decl(G,N,X,Id,Type,Fd), ok end; _ -> error end; emit_c_union_values_decl_loop(G, N, X, Fd, [CU |CUs]) -> case CU of {case_dcl,_,Id,Type} -> case Id of {array, _AID, _SZ} -> % Check for arrays mk_array_decl(G,N,X,Id,Type,Fd), emit_c_union_values_decl_loop(G, N, X, Fd, CUs); _ -> % Elementary types or seq/struct mk_union_member_decl(G,N,X,Id,Type,Fd), emit_c_union_values_decl_loop(G, N, X, Fd, CUs) end; _ -> error end. %% Makes the declaration for the array in union mk_array_decl(G,N,X,Id,Type,Fd) -> emit(Fd, " ~s ~s;\n", [getCaseTypeStr(G,N,X,Id,Type), mk_array_name(Id)]). mk_array_name({array,Id,D}) -> ic_forms:get_id2(Id) ++ mk_array_dim(D). mk_array_dim([]) -> ""; mk_array_dim([{_,_,Dim}|Dims]) -> "[" ++ Dim ++ "]" ++ mk_array_dim(Dims). %% Creates the array file mk_array_file(G,N,X,{array,AID,SZ},Type,HFd) -> ArrayName = ic_util:to_undersc([ic_forms:get_id2(AID),ic_forms:get_id2(X) | N]), ArrayDim = extract_array_dim(SZ), emit(HFd, "\n#ifndef __~s__\n",[ictype:to_uppercase(ArrayName)]), emit(HFd, "#define __~s__\n\n",[ictype:to_uppercase(ArrayName)]), icstruct:create_c_array_coding_file(G, N, {ArrayName,ArrayDim}, Type, no_typedef), emit(HFd, "\n#endif\n\n"). extract_array_dim([{_,_,Dim}]) -> [Dim]; extract_array_dim([{_,_,Dim}|Dims]) -> [Dim | extract_array_dim(Dims)]. %% Makes the declaration for the member in union mk_union_member_decl(G,N,X,Id,Type,Fd) -> emit(Fd, " ~s ~s;\n", [getCaseTypeStr(G,N,X,Id,Type), ic_forms:get_id2(Id)]). %% File utilities create_c_union_file(G, N, X, UnionName) -> {Fd , SName} = open_c_coding_file(G, UnionName), _HFd = ic_genobj:hrlfiled(G), %% Write on stubfile header HrlFName = filename:basename(ic_genobj:include_file(G)), ic_codegen:emit_stub_head(G, Fd, SName, c), emit(Fd, "#include \"~s\"\n\n",[HrlFName]), %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Fd = ic_genobj:stubfiled(G), %% Write on stubfile %% HFd = ic_genobj:hrlfiled(G), %% Write on stubfile header %% HrlFName = filename:basename(ic_genobj:include_file(G)), %% emit(Fd, "#include \"~s\"\n\n",[HrlFName]), %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% put(op_variable_count, 0), put(tmp_declarations, []), %% Write generated code on file emit_union_sizecount(G, N, X, Fd, UnionName), emit_union_encode(G, N, X, Fd, UnionName), emit_union_decode(G, N, X, Fd, UnionName), file:close(Fd). open_c_coding_file(G, Name) -> SName = string:concat(ic_util:mk_oe_name(G, "code_"), Name), FName = ic_file:join(ic_options:get_opt(G, stubdir),ic_file:add_dot_c(SName)), case file:open(FName, [write]) of {ok, Fd} -> {Fd, SName}; Other -> exit(Other) end. get_c_union_discriminator(G, N, X) -> case getDiscrStr(G, N, X#union.type) of error -> ic_error:fatal_error(G, {illegal_typecode_for_c, X#union.type, N}); DiscrStr -> case ic_code:get_basetype(G, DiscrStr) of {short, _} -> "CORBA_short"; {unsigned,{short, _}} -> "CORBA_unsigned_short"; {long, _} -> "CORBA_long"; {unsigned,{long, _}} -> "CORBA_unsigned_long"; {boolean,_} -> "CORBA_boolean"; {char,_} -> "CORBA_char"; {enum, EnumType} -> EnumType; _ -> DiscrStr end end. getDiscrStr(G, N, S) when element(1, S) == scoped_id -> case ic_symtab:get_full_scoped_name(G, N, S) of {FSN, _, tk_short, _} -> ic_util:to_undersc(FSN); {FSN, _, tk_ushort, _} -> ic_util:to_undersc(FSN); {FSN, _, tk_long, _} -> ic_util:to_undersc(FSN); {FSN, _, tk_ulong, _} -> ic_util:to_undersc(FSN); {FSN, _, tk_boolean, _} -> ic_util:to_undersc(FSN); {FSN, _, tk_char, _} -> ic_util:to_undersc(FSN); {FSN, _, {tk_enum,_,_,_}, _} -> ic_util:to_undersc(FSN); _ -> error end; getDiscrStr(_G, N, X) -> case X of {short,_} -> "CORBA_short"; {unsigned,{short,_}} -> "CORBA_unsigned_short"; {long, _} -> "CORBA_long"; {unsigned,{long,_}} -> "CORBA_unsigned_long"; {boolean,_} -> "CORBA_boolean"; {char,_} -> "CORBA_char"; {enum,TID,_,_} -> ic_util:to_undersc([ic_forms:get_id2(TID) | N]); _ -> error end. getCaseTypeStr(G, N, X, I, T) when element(1, T) == scoped_id -> case catch ic_symtab:get_full_scoped_name(G, N, T) of {FSN, _, _, _} -> BT = ic_code:get_basetype(G, ic_util:to_undersc(FSN)), case isList(BT) of true -> BT; false -> case BT of {short,_} -> "CORBA_short"; {unsigned,{short,_}} -> "CORBA_unsigned_short"; {long, _} -> "CORBA_long"; {unsigned,{long,_}} -> "CORBA_unsigned_long"; {float,_} -> "CORBA_float"; {double,_} -> "CORBA_double"; {boolean,_} -> "CORBA_boolean"; {char,_} -> "CORBA_char"; {wchar,_} -> "CORBA_wchar"; {octet,_} -> "CORBA_octet"; {string,_} -> "CORBA_char*"; {wstring,_} -> "CORBA_wchar*"; {sequence,_,_} -> ic_util:to_undersc([ic_forms:get_id2(I), ic_forms:get_id2(X) | N]); {struct,SID,_,_} -> ic_util:to_undersc([ic_forms:get_id2(SID), ic_forms:get_id2(X) | N]); {enum,EID} -> EID; {any, _} -> %% Fix for any type "CORBA_long"; _ -> %%io:format("BT = ~p~n",[BT]), error end end end; getCaseTypeStr(_G, N, X, I, T) -> case T of {short,_} -> "CORBA_short"; {unsigned,{short,_}} -> "CORBA_unsigned_short"; {long, _} -> "CORBA_long"; {unsigned,{long,_}} -> "CORBA_unsigned_long"; {float,_} -> "CORBA_float"; {double,_} -> "CORBA_double"; {boolean,_} -> "CORBA_boolean"; {char,_} -> "CORBA_char"; {wchar,_} -> "CORBA_wchar"; {octet,_} -> "CORBA_octet"; {string,_} -> "CORBA_char*"; {wstring,_} -> "CORBA_wchar*"; {sequence,_,_} -> ic_util:to_undersc([ic_forms:get_id2(I), ic_forms:get_id2(X) | N]); {struct,SID,_,_} -> ic_util:to_undersc([ic_forms:get_id2(SID), ic_forms:get_id2(X) | N]); {union,UID,_,_,_} -> ic_util:to_undersc([ic_forms:get_id2(UID), ic_forms:get_id2(X) | N]); {any, _} -> %% Fix for any type "CORBA_long"; _ -> error end. isList(L) when is_list(L) -> true; isList(_) -> false. %% %% Sizecount facilities %% emit_union_sizecount(G, N, X, Fd, UnionName) -> emit(Fd, "int ~s~s(CORBA_Environment *oe_env, int* oe_size_count_index, int* oe_size) {\n\n", [ic_util:mk_oe_name(G, "sizecalc_"), UnionName]), emit(Fd, " int oe_malloc_size = 0;\n"), emit(Fd, " int oe_error_code = 0;\n"), emit(Fd, " int oe_type = 0;\n"), emit(Fd, " int oe_tmp = 0;\n"), emit_union_discr_var_decl(G, N, X, Fd), ic_codegen:nl(Fd), emit(Fd, " if(*oe_size == 0)\n",[]), AlignName = lists:concat(["*oe_size + sizeof(",UnionName,")"]), emit(Fd, " *oe_size = ~s;\n\n", [ic_util:mk_align(AlignName)]), emit(Fd, " if ((oe_error_code = ei_get_type(oe_env->_inbuf, oe_size_count_index, &oe_type, &oe_tmp)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_get_type", []), emit(Fd, " return oe_error_code;\n }\n"), %%emit(Fd, " if (oe_tmp != 3)\n"), %%emit(Fd, " return -1;\n\n"), emit(Fd, " if ((oe_error_code = ei_decode_tuple_header(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_tuple_header", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n", []), emit_c_dec_rpt(Fd, " ", "ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit_c_union_discr_sizecount(G, N, X, Fd), emit(Fd, " /* Calculate union size */\n"), emit(Fd, " switch(oe_discr) {\n"), emit_c_union_loop(G, N, X, Fd, X#union.body, sizecalc), emit(Fd, " }\n\n"), emit(Fd, " *oe_size = ~s;\n",[ic_util:mk_align("*oe_size+oe_malloc_size")]), emit(Fd, " return 0;\n"), emit(Fd, "}\n\n\n"). emit_union_discr_var_decl(G, N, X, Fd) -> UD = get_c_union_discriminator(G, N, X), case UD of "CORBA_short" -> emit(Fd, " long oe_discr = 0;\n"); "CORBA_unsigned_short" -> emit(Fd, " unsigned long oe_discr = 0;\n"); "CORBA_long" -> emit(Fd, " long oe_discr = 0;\n"); "CORBA_unsigned_long" -> emit(Fd, " unsigned long oe_discr = 0;\n"); "CORBA_boolean" -> emit(Fd, " int oe_discr = 0;\n"), emit(Fd, " char oe_bool[256];\n"); "CORBA_char" -> emit(Fd, " char oe_discr = 0;\n"); _T -> emit(Fd, " int oe_dummy = 0;\n"), emit(Fd, " ~s oe_discr = 0;\n",[UD]) end. emit_c_union_discr_sizecount(G, N, X, Fd) -> emit(Fd, " /* Calculate discriminator size */\n"), UD = get_c_union_discriminator(G, N, X), case UD of "CORBA_short" -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, &oe_discr)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_unsigned_short" -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, oe_size_count_index, &oe_discr)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_long" -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, &oe_discr)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_unsigned_long" -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, oe_size_count_index, &oe_discr)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_boolean" -> emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, oe_size_count_index, oe_bool)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if (strcmp(oe_bool, \"false\") == 0) {\n"), emit(Fd, " oe_discr = 0;\n"), emit(Fd, " }\n"), emit(Fd, " else if (strcmp(oe_bool, \"true\") == 0) {\n"), emit(Fd, " oe_discr = 1;\n"), emit(Fd, " }\n"), emit(Fd, " else {\n"), emit_c_dec_rpt(Fd, " ", "not boolean", []), emit(Fd, " return -1;\n }\n"); "CORBA_char" -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, oe_size_count_index, &oe_discr)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); T -> emit(Fd, " oe_tmp = *oe_size_count_index;\n"), emit(Fd, " if ((oe_error_code = oe_sizecalc_~s(oe_env, oe_size_count_index, &oe_malloc_size)) < 0) {\n", [T]), ?emit_c_dec_rpt(Fd, " ", "oe_size_calc_~s", [T]), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " *oe_size_count_index = oe_tmp;\n"), emit(Fd, " oe_tmp = oe_env->_iin;\n"), emit(Fd, " oe_env->_iin = *oe_size_count_index;\n"), emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, NULL, &oe_dummy, &oe_discr)) < 0) {\n", [T]), ?emit_c_dec_rpt(Fd, " ", "oe_decode_~s", [T]), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " *oe_size_count_index = oe_env->_iin;\n"), emit(Fd, " oe_env->_iin = oe_tmp;\n\n") end. emit_c_union_loop(G, N, X, Fd, CaseList, Case) -> emit_c_union_loop(G, N, X, Fd, CaseList, false, Case). emit_c_union_loop(G, N, X, Fd, [], GotDefaultCase, Case) -> case GotDefaultCase of false -> emit_c_union_valueless_discriminator(G, N, X, Fd, Case) end; emit_c_union_loop(G, N, X, Fd, [CU|CUs], GotDefaultCase, Case) -> case CU of {case_dcl,CaseList,I,T} -> GotDefaultCase = emit_c_union_case(G, N, X, Fd, I, T, CaseList, Case), emit_c_union_loop(G, N, X, Fd, CUs, GotDefaultCase, Case); _ -> error end. emit_c_union_valueless_discriminator(_G, _N, _X, Fd, Case) -> emit(Fd, " default:\n"), case Case of sizecalc -> emit(Fd, " {\n"), emit(Fd, " char oe_undefined[15];\n\n"), emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, " "oe_size_count_index, oe_undefined)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " }\n"); encode -> emit(Fd, " if ((oe_error_code = oe_ei_encode_atom(oe_env, \"undefined\")) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " break;\n"); decode -> emit(Fd, " {\n"), emit(Fd, " char oe_undefined[15];\n\n"), emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, &oe_env->_iin, " "oe_undefined)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if (strcmp(oe_undefined, \"undefined\") != 0) {\n"), emit_c_dec_rpt(Fd, " ", "undefined", []), emit(Fd, " return -1;\n }\n"), emit(Fd, " }\n") end. emit_c_union_case(G, N, X, Fd, I, T, [{default,_}], Case) -> emit(Fd, " default:\n"), case Case of sizecalc -> getCaseTypeSizecalc(G, N, X, Fd, I, T); encode -> getCaseTypeEncode(G, N, X, Fd, I, T); decode -> getCaseTypeDecode(G, N, X, Fd, I, T) end, true; emit_c_union_case(G, N, X, Fd, I, T, [{Bool,_}], Case) -> %% Boolean discriminator case Bool of 'TRUE' -> emit(Fd, " case 1:\n"); 'FALSE' -> emit(Fd, " case 0:\n") end, case Case of sizecalc -> getCaseTypeSizecalc(G, N, X, Fd, I, T); encode -> getCaseTypeEncode(G, N, X, Fd, I, T); decode -> getCaseTypeDecode(G, N, X, Fd, I, T) end, emit(Fd, " break;\n\n"), false; emit_c_union_case(G, N, X, Fd, I, T, [{Bool,_}|Rest], Case) -> %% Boolean discriminator case Bool of 'TRUE' -> emit(Fd, " case 1:\n"); 'FALSE' -> emit(Fd, " case 0:\n") end, emit_c_union_case(G, N, X, Fd, I, T, Rest, Case), false; emit_c_union_case(G, N, X, Fd, I, T, [{_,_,NrStr}], Case) -> %% Integer type discriminator case get_c_union_discriminator(G, N, X) of "CORBA_char" -> emit(Fd, " case \'~s\':\n",[NrStr]); _ -> emit(Fd, " case ~s:\n",[NrStr]) end, case Case of sizecalc -> getCaseTypeSizecalc(G, N, X, Fd, I, T); encode -> getCaseTypeEncode(G, N, X, Fd, I, T); decode -> getCaseTypeDecode(G, N, X, Fd, I, T) end, emit(Fd, " break;\n\n"), false; emit_c_union_case(G, N, X, Fd, I, T, [{_,_,NrStr}|Rest], Case) -> %% Integer type discriminator emit(Fd, " case ~s:\n",[NrStr]), emit_c_union_case(G, N, X, Fd, I, T, Rest, Case), false; emit_c_union_case(G, N, X, Fd, I, T, [{scoped_id,_,_,[EID]}], Case) -> %% Enumerant type discriminator SID = ic_util:to_undersc([EID|get_c_union_discriminator_scope(G, N, X)]), %%io:format("SID = ~p~n",[SID]), emit(Fd, " case ~s:\n",[SID]), case Case of sizecalc -> getCaseTypeSizecalc(G, N, X, Fd, I, T); encode -> getCaseTypeEncode(G, N, X, Fd, I, T); decode -> getCaseTypeDecode(G, N, X, Fd, I, T) end, emit(Fd, " break;\n\n"), false; emit_c_union_case(G, N, X, Fd, I, T, [{scoped_id,_,_,[EID]}|Rest], Case) -> %% Enumerant type discriminator SID = ic_util:to_undersc([EID|get_c_union_discriminator_scope(G, N, X)]), %%io:format("SID = ~p~n",[SID]), emit(Fd, " case ~s:\n",[SID]), emit_c_union_case(G, N, X, Fd, I, T, Rest, Case), false. %% %% Returns the enumerant discriminator scope %% get_c_union_discriminator_scope(G, N, X) -> {FullScopedName, _, _TK, _} = ic_symtab:get_full_scoped_name(G, N, X#union.type), BT = case ic_code:get_basetype(G, ic_util:to_undersc(FullScopedName)) of {enum,ST} -> ST; Other -> Other end, tl(lists:reverse(string:tokens(BT,"_"))). %% Ugly work arround getCaseTypeSizecalc(G, N, X, Fd, I, T) when element(1, T) == scoped_id -> case ic_fetch:member2type(G,X,I) of ushort -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ushort:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); ulong -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ulong:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); short -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "short:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); long -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "long:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); float -> emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "float:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }\n"); double -> emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "double:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }\n"); boolean -> emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "boolean:ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"); char -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "char:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); octet -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "octet:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); string -> emit(Fd, " if ((oe_error_code = ei_get_type(oe_env->_inbuf, oe_size_count_index, &oe_type, &oe_tmp)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ei_get_type", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if ((oe_error_code = ei_decode_string(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ei_decode_string", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_malloc_size = ~s;\n",[ic_util:mk_align("oe_malloc_size+oe_tmp+1")]); any -> %% Fix for any type emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); _ -> case getCaseTypeStr(G, N, X, I, T) of "erlang_pid" -> emit(Fd, " if ((oe_error_code = ei_decode_pid(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n", []), ?emit_c_dec_rpt(Fd, " ", "ei_decode_pid", []), emit(Fd, " return oe_error_code;\n }\n"); "erlang_port" -> emit(Fd, " if ((oe_error_code = ei_decode_port(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n", []), ?emit_c_dec_rpt(Fd, " ", "ei_decode_port", []), emit(Fd, " return oe_error_code;\n }\n"); "erlang_ref" -> emit(Fd, " if ((oe_error_code = ei_decode_ref(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n", []), ?emit_c_dec_rpt(Fd, " ", "ei_decode_ref", []), emit(Fd, " return oe_error_code;\n }\n"); "erlang_term" -> emit(Fd, " if ((oe_error_code = ei_decode_term(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n", []), ?emit_c_dec_rpt(Fd, " ", "ei_deoce_term", []), emit(Fd, " return oe_error_code;\n }\n"); Other -> emit(Fd, " if ((oe_error_code = oe_sizecalc_~s(oe_env, oe_size_count_index, &oe_malloc_size)) < 0) {\n", [Other]), ?emit_c_dec_rpt(Fd, " ", "oe_sizecalc_~s", [Other]), emit(Fd, " return oe_error_code;\n }\n") end end; getCaseTypeSizecalc(G, N, X, Fd, I, T) -> case I of {array,_,_} -> ArrayName = ic_util:to_undersc([ic_forms:get_id2(I),ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_sizecalc_~s(oe_env, oe_size_count_index, &oe_malloc_size)) < 0) {\n", [ArrayName]), ?emit_c_dec_rpt(Fd, " ", "oe_sizecalc_~s", [ArrayName]), emit(Fd, " return oe_error_code;\n }\n"); _ -> case T of {short,_} -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "short:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); {unsigned,{short,_}} -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ushort:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); {long, _} -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "long:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); {unsigned,{long,_}} -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ulong:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); {float,_} -> emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "float:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }"); {double,_} -> emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "double:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }\n"); {boolean,_} -> emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "boolean:ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"); {char,_} -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "char:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); {octet,_} -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "octet:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); {string,_} -> emit(Fd, " if ((oe_error_code = ei_get_type(oe_env->_inbuf, oe_size_count_index, &oe_type, &oe_tmp)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ei_get_type", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if ((oe_error_code = ei_decode_string(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ei_decode_string", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_malloc_size = ~s;\n",[ic_util:mk_align("oe_malloc_size+oe_tmp+1")]); {sequence,_,_} -> SeqName = ic_util:to_undersc([ic_forms:get_id2(I), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_sizecalc_~s(oe_env, oe_size_count_index, &oe_malloc_size)) < 0) {\n", [SeqName]), ?emit_c_dec_rpt(Fd, " ", "sequence:oe_sizecalc_~s", [SeqName]), emit(Fd, " return oe_error_code;\n }\n"); {struct,SID,_,_} -> StructName = ic_util:to_undersc([ic_forms:get_id2(SID), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_sizecalc_~s(oe_env, oe_size_count_index, &oe_malloc_size)) < 0) {\n", [StructName]), ?emit_c_dec_rpt(Fd, " ", "struct:oe_sizecalc_~s", [StructName]), emit(Fd, " return oe_error_code;\n }\n"); {union,UID,_,_,_} -> UnionName = ic_util:to_undersc([ic_forms:get_id2(UID), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_sizecalc_~s(oe_env, oe_size_count_index, &oe_malloc_size)) < 0) {\n", [UnionName]), ?emit_c_dec_rpt(Fd, " ", "union:oe_sizecalce_~s", [UnionName]), emit(Fd, " return oe_error_code;\n }\n"); {any, _} -> %% Fix for any type emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, oe_size_count_index, 0)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "any:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); _ -> ic_error:fatal_error(G, {illegal_typecode_for_c, T, N}) end end. %% %% Encode facilities %% emit_union_encode(G, N, X, Fd, UnionName) -> emit(Fd, "int ~s~s(CORBA_Environment *oe_env, ~s* oe_rec) {\n\n", [ic_util:mk_oe_name(G, "encode_"), UnionName, UnionName]), emit(Fd, " int oe_error_code = 0;\n\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_tuple_header(oe_env, 3)) < 0) {\n"), 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, \"~s\")) < 0) {\n", [UnionName]), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit_c_union_discr_encode(G, N, X, Fd), emit(Fd, " /* Encode union */\n"), emit(Fd, " switch(oe_rec->_d) {\n"), emit_c_union_loop(G, N, X, Fd, X#union.body, encode), emit(Fd, " }\n\n"), emit(Fd, " return 0;\n"), emit(Fd, "}\n\n\n"). emit_c_union_discr_encode(G, N, X, Fd) -> emit(Fd, " /* Encode descriminator */\n"), UD = get_c_union_discriminator(G, N, X), case UD of "CORBA_short" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_long(oe_env, oe_rec->_d)) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_long", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_unsigned_short" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_ulong(oe_env, oe_rec->_d)) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_long" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_long(oe_env, oe_rec->_d)) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_long", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_unsigned_long" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_ulong(oe_env, oe_rec->_d)) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_boolean" -> emit(Fd, " switch(oe_rec->_d) {\n"), emit(Fd, " case 0:\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_atom(oe_env, \"false\")) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " break;\n"), emit(Fd, " case 1:\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_atom(oe_env, \"true\")) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " break;\n"), emit(Fd, " default:\n"), emit_c_enc_rpt(Fd, " ", "boolean failure", []), emit(Fd, " return -1;\n"), emit(Fd, " }\n\n"); "CORBA_char" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_char(oe_env, oe_rec->_d)) < 0) {\n"), emit_c_enc_rpt(Fd, " ", "oe_ei_encode_char", []), emit(Fd, " return oe_error_code;\n }\n"); T -> emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, oe_rec->_d)) < 0) {\n", [T]), ?emit_c_enc_rpt(Fd, " ", "oe_encode_~s", [T]), emit(Fd, " return oe_error_code;\n }\n") end. getCaseTypeEncode(G, N, X, Fd, I, T) when element(1, T) == scoped_id -> case ic_fetch:member2type(G,X,I) of ushort -> emit(Fd, " if ((oe_error_code = oe_ei_encode_ulong(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "ushort:oe_ei_encode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); ulong -> emit(Fd, " if ((oe_error_code = oe_ei_encode_ulong(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "ulong:oe_ei_encode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); short -> emit(Fd, " if ((oe_error_code = oe_ei_encode_long(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "short:oe_ei_encode_long", []), emit(Fd, " return oe_error_code;\n }\n"); long -> emit(Fd, " if ((oe_error_code = oe_ei_encode_long(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "long:oe_ei_encode_long", []), emit(Fd, " return oe_error_code;\n }\n"); float -> emit(Fd, " if ((oe_error_code = oe_ei_encode_double(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "float:oe_ei_encode_double", []), emit(Fd, " return oe_error_code;\n }\n"); double -> emit(Fd, " if ((oe_error_code = oe_ei_encode_double(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "double:oe_ei_encode_double", []), emit(Fd, " return oe_error_code;\n }\n"); boolean -> emit(Fd, " switch(oe_rec->_u.~s) {\n",[ic_forms:get_id2(I)]), emit(Fd, " case 0:\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_atom(oe_env, \"false\")) < 0) {\n"), ?emit_c_enc_rpt(Fd, " ", "boolean:oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " break;\n"), emit(Fd, " case 1:\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_atom(oe_env, \"true\")) < 0) {\n"), ?emit_c_enc_rpt(Fd, " ", "boolean:oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " break;\n"), emit(Fd, " default:\n"), ?emit_c_enc_rpt(Fd, " ", "boolean failure", []), emit(Fd, " return -1;\n"), emit(Fd, " }\n"); char -> emit(Fd, " if ((oe_error_code = oe_ei_encode_char(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "char:oe_ei_encode_char", []), emit(Fd, " return oe_error_code;\n }\n"); octet -> emit(Fd, " if ((oe_error_code = oe_ei_encode_char(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "octet:oe_ei_encode_char", []), emit(Fd, " return oe_error_code;\n }\n"); string -> emit(Fd, " if ((oe_error_code = oe_ei_encode_string(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "oe_ei_encode_string", []), emit(Fd, " return oe_error_code;\n }\n"); struct -> case ic_cbe:mk_c_type(G, N, T, evaluate_not) of "erlang_pid" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_pid(oe_env, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "oe_ei_encode_pid", []), emit(Fd, " return oe_error_code;\n }\n"); "erlang_port" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_port(oe_env, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "oe_ei_encode_port", []), emit(Fd, " return oe_error_code;\n }\n"); "erlang_ref" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_ref(oe_env, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "oe_ei_encode_ref", []), emit(Fd, " return oe_error_code;\n }\n"); "ETERM*" -> emit(Fd, " if ((oe_error_code = oe_ei_encode_term(oe_env, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "oe_ei_encode_term", []), emit(Fd, " return oe_error_code;\n }\n"); _ -> emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, &oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T), ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "oe_encode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n") end; sequence -> emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, &oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "sequence:oe_encode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); array -> emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "array:oe_encode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); union -> emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, &oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "union:oe_encode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); enum -> emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "enum:oe_encode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); any -> %% Fix for any type emit(Fd, " if ((oe_error_code = oe_ei_encode_long(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "enum:oe_ei_encodelong", []), emit(Fd, " return oe_error_code;\n }\n"); _ -> ic_error:fatal_error(G, {illegal_typecode_for_c, T, N}) end; getCaseTypeEncode(G, N, X, Fd, I, T) -> case I of {array,AID,_} -> ArrayName = ic_util:to_undersc([ic_forms:get_id2(AID),ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, oe_rec->_u.~s)) < 0) {\n", [ArrayName,ic_forms:get_id2(AID)]), ?emit_c_enc_rpt(Fd, " ", "array:oe_encode_~s", [ArrayName]), emit(Fd, " return oe_error_code;\n }\n"); _ -> case T of {short,_} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_long(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "short:oe_ei_encode_long", []), emit(Fd, " return oe_error_code;\n }\n"); {unsigned,{short,_}} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_ulong(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "ushort:oe_ei_encode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); {long, _} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_long(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "long:oe_ei_encode_long", []), emit(Fd, " return oe_error_code;\n }\n"); {unsigned,{long,_}} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_ulong(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "ulong:oe_ei_encode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); {float,_} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_double(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "float:oe_ei_encode_double", []), emit(Fd, " return oe_error_code;\n }\n"); {double,_} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_double(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "double:oe_ei_encode_double", []), emit(Fd, " return oe_error_code;\n }\n"); {boolean,_} -> emit(Fd, " switch(oe_rec->_u.~s) {\n",[ic_forms:get_id2(I)]), emit(Fd, " case 0:\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_atom(oe_env, \"false\")) < 0) {\n"), ?emit_c_enc_rpt(Fd, " ", "boolean:oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " break;\n"), emit(Fd, " case 1:\n"), emit(Fd, " if ((oe_error_code = oe_ei_encode_atom(oe_env, \"true\")) < 0) {\n"), ?emit_c_enc_rpt(Fd, " ", "boolean:oe_ei_encode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " break;\n"), emit(Fd, " default:\n"), ?emit_c_enc_rpt(Fd, " ", "boolean failure", []), emit(Fd, " return -1;\n"), emit(Fd, " }\n"); {char,_} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_char(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "char:oe_ei_encode_char", []), emit(Fd, " return oe_error_code;\n }\n"); {octet,_} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_char(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "octet:oe_ei_encode_char", []), emit(Fd, " return oe_error_code;\n }\n"); {string,_} -> emit(Fd, " if ((oe_error_code = oe_ei_encode_string(oe_env, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "oe_ei_encode_string", []), emit(Fd, " return oe_error_code;\n }\n"); {sequence,_,_} -> SeqName = ic_util:to_undersc([ic_forms:get_id2(I), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, &oe_rec->_u.~s)) < 0) {\n", [SeqName,ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "sequence:oe_encode_~s", [SeqName]), emit(Fd, " return oe_error_code;\n }\n"); {struct,SID,_,_} -> StructName = ic_util:to_undersc([ic_forms:get_id2(SID), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, &oe_rec->_u.~s)) < 0) {\n", [StructName,ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "struct:oe_encode_~s", [StructName]), emit(Fd, " return oe_error_code;\n }\n"); {union,UID,_,_,_} -> UnionName = ic_util:to_undersc([ic_forms:get_id2(UID), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_encode_~s(oe_env, &oe_rec->_u.~s)) < 0) {\n", [UnionName,ic_forms:get_id2(I)]), ?emit_c_enc_rpt(Fd, " ", "union:oe_encode_~s", [UnionName]), emit(Fd, " return oe_error_code;\n }\n"); _ -> ic_error:fatal_error(G, {illegal_typecode_for_c, T, N}) end end. %% %% Decode facilities %% emit_union_decode(G, N, X, Fd, UnionName) -> emit(Fd, "int ~s~s(CORBA_Environment *oe_env, char *oe_first, int* oe_index, ~s* oe_rec) {\n\n", [ic_util:mk_oe_name(G, "decode_"), UnionName, UnionName]), emit(Fd, " int oe_error_code = 0;\n"), emit(Fd, " int oe_tmp = 0;\n"), emit(Fd, " char oe_union_name[256];\n\n"), emit(Fd, " if((char*) oe_rec == oe_first)\n",[]), AlignName = lists:concat(["*oe_index + sizeof(",UnionName,")"]), emit(Fd, " *oe_index = ~s;\n\n", [ic_util:mk_align(AlignName)]), emit(Fd, " if ((oe_error_code = ei_decode_tuple_header(oe_env->_inbuf, &oe_env->_iin, &oe_tmp)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_tuple_header", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, &oe_env->_iin, oe_union_name)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit_c_union_discr_decode(G, N, X, Fd), emit(Fd, " /* Decode union */\n"), emit(Fd, " switch(oe_rec->_d) {\n"), emit_c_union_loop(G, N, X, Fd, X#union.body, decode), emit(Fd, " }\n\n"), emit(Fd, " *oe_index = ~s;\n", [ic_util:mk_align("*oe_index")]), emit(Fd, " return 0;\n"), emit(Fd, "}\n\n\n"). emit_c_union_discr_decode(G, N, X, Fd) -> emit(Fd, " /* Decode descriminator */\n"), UD = get_c_union_discriminator(G, N, X), case UD of "CORBA_short" -> emit(Fd, " {\n"), emit(Fd, " long oe_long;\n"), emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, &oe_env->_iin, &oe_long)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "short:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_d = (short) oe_long;\n\n"), emit(Fd, " if (oe_rec->_d != oe_long)\n return -1;\n"), emit(Fd, " }\n\n"); "CORBA_unsigned_short" -> emit(Fd, " {\n"), emit(Fd, " unsigned long oe_ulong;\n"), emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, &oe_env->_iin, &oe_ulong)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "unshort:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_d = (unsigned short) oe_ulong;\n\n"), emit(Fd, " if (oe_rec->_d != oe_ulong)\n return -1;\n"), emit(Fd, " }\n\n"); "CORBA_long" -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_d)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "long:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_unsigned_long" -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_d)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "ulong:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); "CORBA_boolean" -> emit(Fd, " {\n"), emit(Fd, " char oe_bool[25];\n\n"), emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, &oe_env->_iin, oe_bool)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "boolean:ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if (strcmp(oe_bool, \"false\") == 0) {\n"), emit(Fd, " oe_rec->_d = 0;\n"), emit(Fd, " }else if (strcmp(oe_bool, \"true\") == 0) {\n"), emit(Fd, " oe_rec->_d = 1;\n"), emit(Fd, " } else {\n"), emit_c_dec_rpt(Fd, " ", "boolean failure", []), emit(Fd, " return -1;\n }\n"), emit(Fd, " }\n\n"); "CORBA_char" -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_d)) < 0) {\n"), emit_c_dec_rpt(Fd, " ", "char:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); T -> emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_d)) < 0) {\n", [T]), ?emit_c_dec_rpt(Fd, " ", "oe_decode_~s", [T]), emit(Fd, " return oe_error_code;\n }\n") end. getCaseTypeDecode(G, N, X, Fd, I, T) when element(1, T) == scoped_id -> case ic_fetch:member2type(G,X,I) of ushort -> emit(Fd, " {\n"), emit(Fd, " unsigned long oe_ulong;\n"), emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, &oe_env->_iin, &oe_ulong)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ushort:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_u.~s = (unsigned short) oe_ulong;\n\n",[ic_forms:get_id2(I)]), emit(Fd, " if (oe_rec->_u.~s != oe_ulong)\n return -1;\n",[ic_forms:get_id2(I)]), emit(Fd, " }\n"); ulong -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ulong:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); short -> emit(Fd, " {\n"), emit(Fd, " long oe_long;\n"), emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, &oe_env->_iin, &oe_long)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "short:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_u.~s = (short) oe_long;\n\n",[ic_forms:get_id2(I)]), emit(Fd, " if (oe_rec->_u.~s != oe_long)\n return -1;\n",[ic_forms:get_id2(I)]), emit(Fd, " }\n"); long -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "long:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); float -> emit(Fd, " {\n"), emit(Fd, " double oe_double;\n"), emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, &oe_env->_iin, &oe_double)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "float:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_u.~s = (float) oe_double;\n",[ic_forms:get_id2(I)]), emit(Fd, " }\n"); double -> emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "double:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }\n"); boolean -> emit(Fd, " {\n"), emit(Fd, " char oe_bool[25];\n\n"), emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, &oe_env->_iin, oe_bool)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "boolean:ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if (strcmp(oe_bool, \"false\") == 0) {\n"), emit(Fd, " oe_rec->_u.~s = 0;\n",[ic_forms:get_id2(I)]), emit(Fd, " } else if (strcmp(oe_bool, \"true\") == 0) {\n"), emit(Fd, " oe_rec->_u.~s = 1;\n",[ic_forms:get_id2(I)]), emit(Fd, " } else {\n"), ?emit_c_dec_rpt(Fd, " ", "boolean failure", []), emit(Fd, " return -1;\n }\n"), emit(Fd, " }\n"); char -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "char:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); octet -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "octet:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); string -> emit(Fd, " {\n"), emit(Fd, " int oe_type = 0;\n"), emit(Fd, " int oe_string_ctr = 0;\n\n"), emit(Fd, " (int) ei_get_type(oe_env->_inbuf, &oe_env->_iin, &oe_type, &oe_string_ctr);\n\n"), emit(Fd, " oe_rec->_u.~s = (void *) (oe_first + *oe_index);\n\n",[ic_forms:get_id2(I)]), emit(Fd, " if ((oe_error_code = ei_decode_string(oe_env->_inbuf, &oe_env->_iin, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ei_decode_string", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " *oe_index = ~s;\n",[ic_util:mk_align("*oe_index+oe_string_ctr+1")]), emit(Fd, " }\n"); struct -> case ic_cbe:mk_c_type(G, N, T, evaluate_not) of "erlang_pid" -> emit(Fd, " if ((oe_error_code = ei_decode_pid(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ei_decode_pid", []), emit(Fd, " return oe_error_code;\n }\n"); "erlang_port" -> emit(Fd, " if ((oe_error_code = ei_decode_port(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ei_decode_port", []), emit(Fd, " return oe_error_code;\n }\n"); "erlang_ref" -> emit(Fd, " if ((oe_error_code = ei_decode_ref(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ei_decode_ref", []), emit(Fd, " return oe_error_code;\n }\n"); "ETERM*" -> emit(Fd, " if ((oe_error_code = ei_decode_term(oe_env->_inbuf, &oe_env->_iin, (void **)&oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ei_decode_term", []), emit(Fd, " return oe_error_code;\n }\n"); _ -> emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "oe_decode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n") end; sequence -> emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "sequence:oe_decode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); array -> emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "array:oe_decode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); union -> emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "union:oe_decode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); enum -> emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_u.~s)) < 0) {\n", [getCaseTypeStr(G, N, X, I, T),ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "enum:oe_decode_~s", [getCaseTypeStr(G, N, X, I, T)]), emit(Fd, " return oe_error_code;\n }\n"); any -> %% Fix for any type emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "any:ei_decodelong", []), emit(Fd, " return oe_error_code;\n }\n"); _ -> ic_error:fatal_error(G, {illegal_typecode_for_c, T, N}) end; getCaseTypeDecode(G, N, X, Fd, I, T) -> case I of {array,AID,_} -> ArrayName = ic_util:to_undersc([ic_forms:get_id2(AID),ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, oe_rec->_u.~s)) < 0) {\n", [ArrayName,ic_forms:get_id2(AID)]), ?emit_c_dec_rpt(Fd, " ", "array:oe_decode_~s", [ArrayName]), emit(Fd, " return oe_error_code;\n }\n"); _ -> case T of {short,_} -> emit(Fd, " {\n"), emit(Fd, " long oe_long;\n"), emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, &oe_env->_iin, &oe_long)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "short:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_u.~s = (short) oe_long;\n\n",[ic_forms:get_id2(I)]), emit(Fd, " if (oe_rec->_u.~s != oe_long)\n return -1;\n",[ic_forms:get_id2(I)]), emit(Fd, " }\n"); {unsigned,{short,_}} -> emit(Fd, " {\n"), emit(Fd, " unsigned long oe_ulong;\n"), emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, &oe_env->_iin, &oe_ulong)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "ushort:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_u.~s = (unsigned short) oe_ulong;\n\n",[ic_forms:get_id2(I)]), emit(Fd, " if (oe_rec->_u.~s != oe_ulong)\n return -1;\n",[ic_forms:get_id2(I)]), emit(Fd, " }\n"); {long, _} -> emit(Fd, " if ((oe_error_code = ei_decode_long(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "long:ei_decode_long", []), emit(Fd, " return oe_error_code;\n }\n"); {unsigned,{long,_}} -> emit(Fd, " if ((oe_error_code = ei_decode_ulong(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ulong:ei_decode_ulong", []), emit(Fd, " return oe_error_code;\n }\n"); {float,_} -> emit(Fd, " {\n"), emit(Fd, " double oe_double;\n"), emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, &oe_env->_iin, &oe_double)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "float:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " oe_rec->_u.~s = (float) oe_double;\n",[ic_forms:get_id2(I)]), emit(Fd, " }\n"); {double,_} -> emit(Fd, " if ((oe_error_code = ei_decode_double(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "dobule:ei_decode_double", []), emit(Fd, " return oe_error_code;\n }\n"); {boolean,_} -> emit(Fd, " {\n"), emit(Fd, " char oe_bool[25];\n\n"), emit(Fd, " if ((oe_error_code = ei_decode_atom(oe_env->_inbuf, &oe_env->_iin, oe_bool)) < 0) {\n"), ?emit_c_dec_rpt(Fd, " ", "boolean:ei_decode_atom", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " if (strcmp(oe_bool, \"false\") == 0) {\n"), emit(Fd, " oe_rec->_u.~s = 0;\n",[ic_forms:get_id2(I)]), emit(Fd, " } else if (strcmp(oe_bool, \"true\") == 0) {\n"), emit(Fd, " oe_rec->_u.~s = 1;\n",[ic_forms:get_id2(I)]), emit(Fd, " } else {\n"), ?emit_c_dec_rpt(Fd, " ", "boolean failure", []), emit(Fd, " return -1;\n }\n"), emit(Fd, " }\n"); {char,_} -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "char:ei_decode_char", []), emit(Fd, " return oe_error_code;\n }\n"); {octet,_} -> emit(Fd, " if ((oe_error_code = ei_decode_char(oe_env->_inbuf, &oe_env->_iin, &oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), emit(Fd, " return oe_error_code;\n }\n"); {string,_} -> emit(Fd, " {\n"), emit(Fd, " int oe_type = 0;\n"), emit(Fd, " int oe_string_ctr = 0;\n\n"), emit(Fd, " (int) ei_get_type(oe_env->_inbuf, &oe_env->_iin, &oe_type, &oe_string_ctr);\n\n"), emit(Fd, " oe_rec->_u.~s = (void *) (oe_first + *oe_index);\n\n",[ic_forms:get_id2(I)]), emit(Fd, " if ((oe_error_code = ei_decode_string(oe_env->_inbuf, &oe_env->_iin, oe_rec->_u.~s)) < 0) {\n", [ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "ei_decode_string", []), emit(Fd, " return oe_error_code;\n }\n"), emit(Fd, " *oe_index = ~s;\n",[ic_util:mk_align("*oe_index+oe_string_ctr+1")]), emit(Fd, " }\n"); {sequence,_,_} -> SeqName = ic_util:to_undersc([ic_forms:get_id2(I), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_u.~s)) < 0) {\n", [SeqName,ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "sequence:oe_decode_~s", [SeqName]), emit(Fd, " return oe_error_code;\n }\n"); {struct,SID,_,_} -> StructName = ic_util:to_undersc([ic_forms:get_id2(SID), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_u.~s)) < 0) {\n", [StructName,ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "struct:oe_decode_~s", [StructName]), emit(Fd, " return oe_error_code;\n }\n"); {union,UID,_,_,_} -> UnionName = ic_util:to_undersc([ic_forms:get_id2(UID), ic_forms:get_id2(X) | N]), emit(Fd, " if ((oe_error_code = oe_decode_~s(oe_env, oe_first, oe_index, &oe_rec->_u.~s)) < 0) {\n", [UnionName,ic_forms:get_id2(I)]), ?emit_c_dec_rpt(Fd, " ", "union:oe_decode_~s", [UnionName]), emit(Fd, " return oe_error_code;\n }"); _ -> ic_error:fatal_error(G, {illegal_typecode_for_c, T, N}) end end. mvDefaultToTail(CDclL) -> mvDefaultToTail(CDclL,[],[]). mvDefaultToTail([], F, FD) -> lists:reverse(F) ++ FD; mvDefaultToTail([{case_dcl,CaseList,I,T}|Rest], Found, FoundDefault) -> case lists:keysearch(default, 1, CaseList) of {value,Default} -> NewCaseList = lists:delete(Default, CaseList) ++ [Default], mvDefaultToTail(Rest, Found, [{case_dcl,NewCaseList,I,T}|FoundDefault]); false -> mvDefaultToTail(Rest, [{case_dcl,CaseList,I,T}|Found], FoundDefault) end.