Dynamic_link: add demos using stdlibs / intrinsics
[scilab.git] / scilab / modules / dynamic_link / demos / call_cxx.sce
1 //
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2018 - ESI Group - Clement DAVID
4 //
5 // This file is distributed under the same license as the Scilab package.
6 //
7
8 //           CALLING EXTERNAL C FUNCTION
9
10 if haveacompiler() then
11
12
13     // we use TMPDIR for compilation
14
15     f1=["extern ""C"""
16     "void fooxx(double *a,double *b,double *c)";
17     "{ *c = *a + *b; }"  ];
18
19     i=["#include <stdlib.h>"
20     "#include <api_scilab.h>"
21     "#include <Scierror.h>"
22     "#include <localization.h>"
23     ""
24     "extern int fooxx(double *x, double *y, double *z);"
25     ""
26     "int sci_fooxx(char *fname, void* pvApiCtx)"
27     "{"
28     "  SciErr sciErr;"
29     ""
30     "  int m1 = 0, n1 = 0;"
31     "  double *pdVarOne = NULL;"
32     "  int *piAddressVarOne = NULL;"
33     "  int m2 = 0, n2 = 0;"
34     "  double *pdVarTwo = NULL;"
35     "  int *piAddressVarTwo = NULL;"
36     "  double *pdblOut = NULL;"
37     ""
38     "  CheckInputArgument(pvApiCtx, 2, 2);"
39     "  CheckOutputArgument(pvApiCtx, 0, 1);"
40     ""
41     "  sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);"
42     "  if(sciErr.iErr)"
43     "  {"
44     "    printError(&sciErr, 0);"
45     "    return 0;"
46     "  }"
47     ""
48     "  sciErr = getMatrixOfDouble(pvApiCtx, piAddressVarOne, &m1, &n1, &pdVarOne);"
49     "  if(sciErr.iErr)"
50     "  {"
51     "    printError(&sciErr, 0);"
52     "    return 0;"
53     "  }"
54     ""
55     "  sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);"
56     "  if(sciErr.iErr)"
57     "  {"
58     "    printError(&sciErr, 0);"
59     "    return 0;"
60     "  }"
61     ""
62     "  sciErr = getMatrixOfDouble(pvApiCtx, piAddressVarTwo, &m2, &n2, &pdVarTwo);"
63     "  if(sciErr.iErr)"
64     "  {"
65     "    printError(&sciErr, 0);"
66     "    return 0;"
67     "  }"
68     ""
69     "  sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, 1, 1, &pdblOut);"
70     "  if (sciErr.iErr)"
71     "  {"
72     "    printError(&sciErr, 0);"
73     "    return 0;"
74     "  }"
75     ""
76     "  fooxx(pdVarOne, pdVarTwo, pdblOut);"
77     ""
78     "  AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;"
79     "  ReturnArguments(pvApiCtx);"
80     "  return 0;"
81     "}"]
82
83     mprintf("\n");
84     mprintf(gettext("Calling a C++ function from Scilab.\n"));
85
86     disp(f1);
87
88     if ~c_link("fooxx") then
89         cur_ilib_verbose = ilib_verbose();
90         ilib_verbose(1);
91         path = pwd();
92         chdir(TMPDIR);
93         mputl(f1,"fooxx.cxx");
94         mputl(i,"sci_fooxx.c");
95
96         mprintf("\n");
97         mprintf(gettext("Calling ilib_for_link to build C++ function.\n"));
98         lib_ = ilib_for_link(["fooxx"], "fooxx.cxx", [],"c");
99         link(lib_, "fooxx", "c");
100         ilib_build("gw_fooxx",["fooxx" "sci_fooxx"],"sci_fooxx.c",basename(lib_));
101         exec loader.sce ;
102         chdir(path);
103         ilib_verbose(cur_ilib_verbose);
104     end
105
106     //Z = X+Y by C function
107     X = 5;
108     Y = 7;
109     mprintf("\n");
110     mprintf(gettext("Calling C++ function. Z = X+Y"));
111     mprintf("\n");
112     mprintf(gettext("with X = %d"), X);
113     mprintf("\n");
114     mprintf(gettext("with Y = %d"), Y);
115     mprintf("\n");
116     mprintf("Z = fooxx(X, Y);");
117     mprintf("\n");
118     Z = fooxx(X, Y);
119     mprintf(gettext("Result Z = %d"), Z);
120     mprintf("\n");
121
122 end