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