Dynamic_link: add demos using stdlibs / intrinsics
[scilab.git] / scilab / modules / dynamic_link / demos / call_c_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 <math.h>";
17     "void bar(double *a,double *b,double *c)";
18     "{ *c = expm1(*a * log1p(*b)); }"  ];
19
20     i=["#include <stdlib.h>"
21     "#include <api_scilab.h>"
22     "#include <Scierror.h>"
23     "#include <localization.h>"
24     ""
25     "extern int bar(double *x, double *y, double *z);"
26     ""
27     "int sci_bar(char *fname, void* pvApiCtx)"
28     "{"
29     "  SciErr sciErr;"
30     ""
31     "  int m1 = 0, n1 = 0;"
32     "  double *pdVarOne = NULL;"
33     "  int *piAddressVarOne = NULL;"
34     "  int m2 = 0, n2 = 0;"
35     "  double *pdVarTwo = NULL;"
36     "  int *piAddressVarTwo = NULL;"
37     "  double *pdblOut = NULL;"
38     ""
39     "  CheckInputArgument(pvApiCtx, 2, 2);"
40     "  CheckOutputArgument(pvApiCtx, 0, 1);"
41     ""
42     "  sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);"
43     "  if(sciErr.iErr)"
44     "  {"
45     "    printError(&sciErr, 0);"
46     "    return 0;"
47     "  }"
48     ""
49     "  sciErr = getMatrixOfDouble(pvApiCtx, piAddressVarOne, &m1, &n1, &pdVarOne);"
50     "  if(sciErr.iErr)"
51     "  {"
52     "    printError(&sciErr, 0);"
53     "    return 0;"
54     "  }"
55     ""
56     "  sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);"
57     "  if(sciErr.iErr)"
58     "  {"
59     "    printError(&sciErr, 0);"
60     "    return 0;"
61     "  }"
62     ""
63     "  sciErr = getMatrixOfDouble(pvApiCtx, piAddressVarTwo, &m2, &n2, &pdVarTwo);"
64     "  if(sciErr.iErr)"
65     "  {"
66     "    printError(&sciErr, 0);"
67     "    return 0;"
68     "  }"
69     ""
70     "  sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, 1, 1, &pdblOut);"
71     "  if (sciErr.iErr)"
72     "  {"
73     "    printError(&sciErr, 0);"
74     "    return 0;"
75     "  }"
76     ""
77     "  bar(pdVarOne, pdVarTwo, pdblOut);"
78     ""
79     "  AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;"
80     "  ReturnArguments(pvApiCtx);"
81     "  return 0;"
82     "}"]
83
84     mprintf("\n");
85     mprintf(gettext("Calling a C function from Scilab.\n"));
86
87     disp(f1);
88
89     if ~c_link("bar") then
90         cur_ilib_verbose = ilib_verbose();
91         ilib_verbose(1);
92         path = pwd();
93         chdir(TMPDIR);
94         mputl(f1,"bar.c");
95         mputl(i,"sci_bar.c");
96
97         mprintf("\n");
98         mprintf(gettext("Calling ilib_for_link to build C function.\n"));
99         lib_ = ilib_for_link(["bar"], "bar.c", [],"c");
100         link(lib_, "bar", "c");
101         ilib_build("gw_bar",["bar" "sci_bar"],"sci_bar.c",basename(lib_));
102         exec loader.sce ;
103         chdir(path);
104         ilib_verbose(cur_ilib_verbose);
105     end
106
107     //Z = X+Y by C function
108     X = 5;
109     Y = 7;
110     mprintf("\n");
111     mprintf(gettext("Calling C function. Z = (1+Y)**X - 1"));
112     mprintf("\n");
113     mprintf(gettext("with X = %d"), X);
114     mprintf("\n");
115     mprintf(gettext("with Y = %d"), Y);
116     mprintf("\n");
117     mprintf("Z = bar(X, Y);");
118     mprintf("\n");
119     Z = bar(X, Y);
120     mprintf(gettext("Result Z = %d"), Z);
121     mprintf("\n");
122
123 end