32
32
%%------------------------------------------------------------
34
34
-import(lists, [foreach/2, foldl/3, foldr/3, map/2]).
35
-import(ic_codegen, [emit/2, emit/3]).
35
-import(ic_codegen, [emit/2, emit/3, emit/4, emit_c_enc_rpt/4, emit_c_dec_rpt/4]).
37
37
-include("icforms.hrl").
38
38
-include("ic.hrl").
166
166
HFd = ic_genobj:hrlfiled(G),
167
167
emit(HFd, "#include <stdlib.h>\n"),
168
case ic_options:get_opt(G, c_report) of
170
emit(HFd, "#ifndef OE_C_REPORT\n"),
171
emit(HFd, "#define OE_C_REPORT\n"),
172
emit(HFd, "#include <stdio.h>\n"),
173
emit(HFd, "#endif\n");
168
177
emit(HFd, "#include \"~s\"\n", [?IC_HEADER]),
169
178
emit(HFd, "#include \"~s\"\n", [?ERL_INTERFACEHEADER]),
170
179
emit(HFd, "#include \"~s\"\n", [?EICONVHEADER]),
596
605
%%------------------------------------------------------------
598
emit_switch(_G, Fd, N, _X) ->
607
emit_switch(G, Fd, N, _X) ->
608
emit(Fd, "#include <string.h>\n"),
609
case ic_options:get_opt(G, c_report) of
611
emit(Fd, "#ifndef OE_C_REPORT\n"),
612
emit(Fd, "#define OE_C_REPORT\n"),
613
emit(Fd, "#include <stdio.h>\n"),
614
emit(Fd, "#endif\n");
600
"#include <string.h>\n"
601
619
"#include \"ic.h\"\n"
602
620
"#include \"erl_interface.h\"\n"
603
621
"#include \"ei.h\"\n"
724
742
emit(Fd, " if (oe_env->_received != ~p) {\n", [length(InTypeAttrArgs)]),
725
743
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, BAD_PARAM, "
726
744
"\"Wrong number of operation parameters\");\n"),
745
emit_c_dec_rpt(Fd, " ", "wrong number of parameters", []),
746
emit_c_dec_rpt(Fd, " ", "server exec ~s\\n====\\n", [Name]),
727
747
emit(Fd, " return -1;\n", []),
728
748
emit(Fd, " }\n"),
729
749
emit(Fd, " else {\n", []),
983
1003
" /* Decode parameters */\n"
984
1004
" if((oe_error_code = ~s(oe_obj, ~s, oe_env)) < 0) {\n",
985
1005
[ParDecName, PLFDC]),
1006
emit_c_dec_rpt(Fd, " ", "parmeters", []),
987
1008
" if(oe_env->_major == CORBA_NO_EXCEPTION)\n"
988
1009
" CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1689
1710
case mk_c_type(G, N, T, evaluate_not) of
1690
1711
"erlang_pid" ->
1691
1712
emit(Fd, " if ((oe_error_code = "
1692
"oe_ei_encode_pid(oe_env, ~s)) < 0)\n",
1713
"oe_ei_encode_pid(oe_env, ~s)) < 0) {\n",
1694
emit(Fd, " return oe_error_code;\n\n");
1715
emit_c_enc_rpt(Fd, " ", "oe_ei_encode_pid", []),
1716
emit(Fd, " return oe_error_code;\n }\n");
1695
1717
"erlang_port" ->
1696
1718
emit(Fd, " if ((oe_error_code = "
1697
"oe_ei_encode_port(oe_env, ~s)) < 0)\n",
1719
"oe_ei_encode_port(oe_env, ~s)) < 0) {\n",
1699
emit(Fd, " return oe_error_code;\n\n");
1721
emit_c_enc_rpt(Fd, " ", "oe_ei_encode_port", []),
1722
emit(Fd, " return oe_error_code;\n }\n");
1700
1723
"erlang_ref" ->
1701
1724
emit(Fd, " if ((oe_error_code = "
1702
"oe_ei_encode_ref(oe_env, ~s)) < 0)\n",
1725
"oe_ei_encode_ref(oe_env, ~s)) < 0) {\n",
1704
emit(Fd, " return oe_error_code;\n\n");
1727
emit_c_enc_rpt(Fd, " ", "oe_ei_encode_ref", []),
1728
emit(Fd, " return oe_error_code;\n }\n");
1706
1730
emit(Fd, " if ((oe_error_code = "
1707
"oe_ei_encode_term(oe_env, ~s)) < 0)\n",
1731
"oe_ei_encode_term(oe_env, ~s)) < 0) {\n",
1709
emit(Fd, " return oe_error_code;\n\n");
1733
emit_c_enc_rpt(Fd, " ", "oe_ei_encode_term", []),
1734
emit(Fd, " return oe_error_code;\n }\n");
1711
1736
emit_encoding_stmt(G, N, X, Fd, FSN, LName);
1713
1738
emit_encoding_stmt(G, N, X, Fd, FSN, LName)
1715
emit_encoding_stmt(G, _N, X, Fd, T, LName) when list(T) ->
1740
emit_encoding_stmt(G, N, X, Fd, T, LName) when list(T) ->
1716
1741
%% Already a fullscoped name
1717
1742
case get_param_tk(LName, X) of
1899
1941
emit(Fd, " if ((oe_error_code = "
1900
1942
"~s~s(oe_env, ~s)) < 0) {\n",
1901
1943
[ic_util:mk_oe_name(G, "encode_"),
1945
?emit_c_enc_rpt(Fd, " ", "enum", []);
1904
1947
emit(Fd, " if ((oe_error_code = "
1905
1948
"~s~s(oe_env, ~s)) < 0) {\n",
1906
1949
[ic_util:mk_oe_name(G, "encode_"),
1951
?emit_c_enc_rpt(Fd, " ", "array", []);
1909
1953
emit(Fd, " if ((oe_error_code = "
1910
1954
"~s~s(oe_env, &~s)) < 0) {\n",
1911
1955
[ic_util:mk_oe_name(G, "encode_"),
1957
?emit_c_enc_rpt(Fd, " ", "", [])
1914
1959
emit(Fd, " CORBA_exc_set(oe_env, "
1915
1960
"CORBA_SYSTEM_EXCEPTION, "
1922
emit_encoding_stmt(_G, _N, _X, Fd, T, LName) when record(T, string) ->
1967
emit_encoding_stmt(G, N, _X, Fd, T, LName) when record(T, string) ->
1923
1968
emit(Fd, " if ((oe_error_code = "
1924
1969
"oe_ei_encode_string(oe_env, (const char*) ~s)) < 0) {\n",
1926
1971
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1927
1972
"BAD_PARAM, \"Cannot encode string\");\n"),
1973
?emit_c_enc_rpt(Fd, " ", "string", []),
1928
1974
emit(Fd, " return oe_error_code;\n }\n\n");
1929
emit_encoding_stmt(_G, _N, _X, Fd, T, LName) when record(T, wstring) ->
1975
emit_encoding_stmt(G, N, _X, Fd, T, LName) when record(T, wstring) ->
1930
1976
emit(Fd, " if ((oe_error_code = "
1931
1977
"oe_ei_encode_wstring(oe_env, ~s)) < 0) {\n",
1979
?emit_c_enc_rpt(Fd, " ", "wstring", []),
1933
1980
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1934
1981
"BAD_PARAM, \"Cannot encode string\");\n"),
1935
1982
emit(Fd, " return oe_error_code;\n }\n\n");
1939
1986
emit(Fd, " if ((oe_error_code = "
1940
1987
"oe_ei_encode_ulong(oe_env, (unsigned long) ~s)) < 0) {\n",
1989
?emit_c_enc_rpt(Fd, " ", "ushort", []),
1942
1990
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1943
1991
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1944
1992
emit(Fd, " return oe_error_code;\n }\n\n");
1946
1994
emit(Fd, " if ((oe_error_code = "
1947
1995
"oe_ei_encode_ulong(oe_env, ~s)) < 0) {\n",
1997
?emit_c_enc_rpt(Fd, " ", "ulong", []),
1949
1998
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1950
1999
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1951
2000
emit(Fd, " return oe_error_code;\n }\n\n");
1953
2002
emit(Fd, " if ((oe_error_code = "
1954
2003
"oe_ei_encode_ulonglong(oe_env, ~s)) < 0) {\n",
2005
?emit_c_enc_rpt(Fd, " ", "ulonglong", []),
1956
2006
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1957
2007
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1958
2008
emit(Fd, " return oe_error_code;\n }\n\n");
1960
2010
emit(Fd, " if ((oe_error_code = "
1961
2011
"oe_ei_encode_long(oe_env, (long) ~s)) < 0) {\n",
2013
?emit_c_enc_rpt(Fd, " ", "short", []),
1963
2014
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1964
2015
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1965
2016
emit(Fd, " return oe_error_code;\n }\n\n");
1967
2018
emit(Fd, " if ((oe_error_code = "
1968
2019
"oe_ei_encode_long(oe_env, ~s)) < 0) {\n",
2021
?emit_c_enc_rpt(Fd, " ", "long", []),
1970
2022
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1971
2023
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1972
2024
emit(Fd, " return oe_error_code;\n }\n\n");
1974
2026
emit(Fd, " if ((oe_error_code = "
1975
2027
"oe_ei_encode_longlong(oe_env, ~s)) < 0) {\n",
2029
?emit_c_enc_rpt(Fd, " ", "longlong", []),
1977
2030
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1978
2031
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1979
2032
emit(Fd, " return oe_error_code;\n }\n\n");
1981
2034
emit(Fd, " if ((oe_error_code = "
1982
2035
"oe_ei_encode_double(oe_env, (double) ~s)) < 0) {\n",
2037
?emit_c_enc_rpt(Fd, " ", "float", []),
1984
2038
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1985
2039
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1986
2040
emit(Fd, " return oe_error_code;\n }\n\n");
1988
2042
emit(Fd, " if ((oe_error_code = "
1989
2043
"oe_ei_encode_double(oe_env, ~s)) < 0) {\n",
2045
?emit_c_enc_rpt(Fd, " ", "double", []),
1991
2046
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
1992
2047
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
1993
2048
emit(Fd, " return oe_error_code;\n }\n\n");
1996
2051
emit(Fd, " case 0 :\n"),
1997
2052
emit(Fd, " if ((oe_error_code = "
1998
2053
"oe_ei_encode_atom(oe_env, \"false\")) < 0) {\n"),
2054
?emit_c_enc_rpt(Fd, " ", "boolean", []),
1999
2055
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2000
2056
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2001
2057
emit(Fd, " return oe_error_code;\n }\n"),
2003
2059
emit(Fd, " case 1 :\n"),
2004
2060
emit(Fd, " if ((oe_error_code = "
2005
2061
"oe_ei_encode_atom(oe_env, \"true\")) < 0) {\n"),
2062
?emit_c_enc_rpt(Fd, " ", "boolean", []),
2006
2063
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2007
2064
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2008
2065
emit(Fd, " return oe_error_code;\n }\n"),
2009
2066
emit(Fd, " break;\n"),
2010
2067
emit(Fd, " default :\n"),
2068
?emit_c_enc_rpt(Fd, " ", "boolean", []),
2011
2069
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2012
2070
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2013
2071
emit(Fd, " return -1;\n"),
2016
2074
emit(Fd, " if ((oe_error_code = "
2017
2075
"oe_ei_encode_char(oe_env, ~s)) < 0) {\n",
2077
?emit_c_enc_rpt(Fd, " ", "char", []),
2019
2078
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2020
2079
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2021
2080
emit(Fd, " return oe_error_code;\n }\n\n");
2023
2082
emit(Fd, " if ((oe_error_code = "
2024
2083
"oe_ei_encode_wchar(oe_env, ~s)) < 0) {\n",
2085
?emit_c_enc_rpt(Fd, " ", "wchar", []),
2026
2086
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2027
2087
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2028
2088
emit(Fd, " return oe_error_code;\n }\n\n");
2030
2090
emit(Fd, " if ((oe_error_code = "
2031
2091
"oe_ei_encode_char(oe_env, ~s)) < 0) {\n",
2093
?emit_c_enc_rpt(Fd, " ", "octet", []),
2033
2094
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2034
2095
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2035
2096
emit(Fd, " return oe_error_code;\n }\n\n");
2037
2098
emit(Fd, " if ((oe_error_code = "
2038
2099
"oe_ei_encode_atom(oe_env, \"void\")) < 0) {\n"),
2100
?emit_c_enc_rpt(Fd, " ", "void", []),
2039
2101
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2040
2102
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2041
2103
emit(Fd, " return oe_error_code;\n }\n\n");
2042
2104
{sequence, _, _} ->
2105
?emit_c_enc_rpt(Fd, " ", "sequence", []),
2043
2106
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2044
2107
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2045
2108
emit(Fd, " return oe_error_code;\n }\n\n");
2047
2110
emit(Fd, " if ((oe_error_code = "
2048
2111
"oe_ei_encode_long(oe_env, ~s)) < 0) {\n",
2113
?emit_c_enc_rpt(Fd, " ", "any", []),
2050
2114
emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "
2051
2115
"BAD_PARAM, \"Bad operation parameter on encode\");\n"),
2052
2116
emit(Fd, " return oe_error_code;\n }\n\n");
2100
2164
"&oe_env->_iin, ~s~s)) < 0) {\n",
2101
2165
[InBuffer, IndOp, LName]),
2102
2166
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2167
?emit_c_dec_rpt(Fd, " ", "", []),
2103
2168
emit(Fd, " return oe_error_code;\n"),
2104
2169
emit(Fd, " }\n\n");
2105
2170
"erlang_port" ->
2107
2172
"&oe_env->_iin, ~s~s)) < 0) {\n",
2108
2173
[InBuffer, IndOp, LName]),
2109
2174
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2175
?emit_c_dec_rpt(Fd, " ", "", []),
2110
2176
emit(Fd, " return oe_error_code;\n"),
2111
2177
emit(Fd, " }\n\n");
2112
2178
"erlang_ref" ->
2114
2180
"&oe_env->_iin, ~s~s)) < 0) {\n",
2115
2181
[InBuffer, IndOp, LName]),
2116
2182
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2183
?emit_c_dec_rpt(Fd, " ", "", []),
2117
2184
emit(Fd, " return oe_error_code;\n"),
2118
2185
emit(Fd, " }\n\n");
2121
2188
"&oe_env->_iin, (void**)~s~s)) < 0) {\n",
2122
2189
[InBuffer, IndOp, LName]),
2123
2190
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2191
?emit_c_dec_rpt(Fd, " ", "", []),
2124
2192
emit(Fd, " return oe_error_code;\n"),
2125
2193
emit(Fd, " }\n\n");
2130
2198
emit_decoding_stmt(G, N, Fd, FSN, LName, IndOp,
2131
2199
InBuffer, Align, NextPos, DecType, AllocedPars)
2133
emit_decoding_stmt(G, _N, Fd, T, LName, IndOp, InBuffer, _Align, NextPos,
2201
emit_decoding_stmt(G, N, Fd, T, LName, IndOp, InBuffer, _Align, NextPos,
2134
2202
DecType, AllocedPars) when list(T) ->
2135
2203
%% Already a fullscoped name
2136
2204
Type = ictype:name2type(G, T),
2157
2225
[ic_util:mk_oe_name(G, "decode_"),
2158
2226
T, NextPos, LName]),
2159
2227
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2228
?emit_c_dec_rpt(Fd, " ", "", []),
2160
2229
emit(Fd, " return oe_error_code;\n"),
2161
2230
emit(Fd, " }\n"),
2162
2231
emit(Fd, " }\n")
2164
emit_decoding_stmt(_G, _N, Fd, T, LName, IndOp, InBuffer, _Align, _NextPos,
2233
emit_decoding_stmt(G, N, Fd, T, LName, IndOp, InBuffer, _Align, _NextPos,
2165
2234
_DecType, AllocedPars) when record(T, string) ->
2166
2235
emit(Fd, " if ((oe_error_code = ei_decode_string(~s, "
2167
2236
"&oe_env->_iin, ~s~s)) < 0) {\n",
2168
2237
[InBuffer, IndOp, LName]),
2169
2238
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2239
?emit_c_dec_rpt(Fd, " ", "", []),
2170
2240
emit(Fd, " return oe_error_code;\n"),
2171
2241
emit(Fd, " }\n");
2172
emit_decoding_stmt(_G, _N, Fd, T, LName, IndOp, InBuffer, _Align, _NextPos,
2242
emit_decoding_stmt(G, N, Fd, T, LName, IndOp, InBuffer, _Align, _NextPos,
2173
2243
_DecType, AllocedPars) when record(T, wstring) ->
2175
2245
emit(Fd, " if ((oe_error_code = "
2177
2247
"&oe_env->_iin, ~s~s)) < 0) {\n",
2178
2248
[InBuffer, IndOp, LName]),
2179
2249
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2250
?emit_c_dec_rpt(Fd, " ", "", []),
2180
2251
emit(Fd, " return oe_error_code;\n\n"),
2181
2252
emit(Fd, " }\n");
2182
2253
emit_decoding_stmt(G, N, Fd, T, LName, IndOp, InBuffer, _Align, _NextPos,
2193
2264
"&oe_env->_iin, 0)) < 0) {\n",
2195
2266
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2267
?emit_c_dec_rpt(Fd, " ", "", []),
2196
2268
emit(Fd, " return oe_error_code;\n"),
2197
2269
emit(Fd, " }\n");
2198
2270
{sequence, _, _} ->
2199
2271
%% XXX XXX Why?
2272
?emit_c_dec_rpt(Fd, " ", "", []),
2200
2273
emit(Fd, " return oe_error_code;\n\n");
2201
2274
{any, _} -> %% Fix for any type
2204
2277
"&oe_env->_iin, ~s~s)) < 0) {\n",
2205
2278
[InBuffer, IndOp, LName]),
2206
2279
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2280
?emit_c_dec_rpt(Fd, " ", "", []),
2207
2281
emit(Fd, " return oe_error_code;\n\n"),
2208
2282
emit(Fd, " }\n");
2243
2317
emit(Fd, " if ((oe_error_code = ei_decode_ulong(~s, "
2244
2318
"&oe_env->_iin, &oe_ulong)) < 0) {\n", [InBuffer]),
2245
2319
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2320
emit_c_dec_rpt(Fd, " ", "ushort", []),
2246
2321
emit(Fd, " return oe_error_code;\n"),
2247
2322
emit(Fd, " }\n"),
2248
2323
emit(Fd, " *~s = (unsigned short) oe_ulong;\n", [LName]),
2253
2328
emit(Fd, " if ((oe_error_code = ei_decode_long(~s, "
2254
2329
"&oe_env->_iin, &oe_long)) < 0) {\n", [InBuffer]),
2255
2330
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2331
emit_c_dec_rpt(Fd, " ", "short", []),
2256
2332
emit(Fd, " return oe_error_code;\n"),
2257
2333
emit(Fd, " }\n"),
2258
2334
emit(Fd, " *~s = (short) oe_long;\n", [LName]),
2263
2339
emit(Fd, " if ((oe_error_code = ei_decode_double(~s, "
2264
2340
"&oe_env->_iin, &oe_double)) < 0) {\n", [InBuffer]),
2265
2341
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2342
emit_c_dec_rpt(Fd, " ", "float", []),
2266
2343
emit(Fd, " return oe_error_code;\n"),
2267
2344
emit(Fd, " }\n"),
2268
2345
emit(Fd, " *~s = (float) oe_double;\n", [LName]),
2273
2350
emit(Fd, " if ((oe_error_code = ei_decode_atom(~s, "
2274
2351
"&oe_env->_iin, oe_bool)) < 0) {\n", [InBuffer]),
2275
2352
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2353
emit_c_dec_rpt(Fd, " ", "boolean", []),
2276
2354
emit(Fd, " return oe_error_code;\n"),
2277
2355
emit(Fd, " }\n"),
2278
2356
emit(Fd, " if (strcmp(oe_bool, \"false\") == 0) {\n"),
2282
2360
emit(Fd, " *(~s) = 1;\n", [LName]),
2283
2361
emit(Fd, " } else {\n"),
2284
2362
ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars),
2363
emit_c_dec_rpt(Fd, " ", "boolean", []),
2285
2364
emit(Fd, " return -1;\n"),
2286
2365
emit(Fd, " }\n"),
2287
2366
emit(Fd, " }\n\n");