add eigen detection in ilib_compile process
[scilab.git] / scilab / contrib / toolbox_skeleton / sci_gateway / cpp / sci_cpp_find.cxx
1 /* ==================================================================== */
2 /* Template toolbox_skeleton */
3 /* This file is released under the 3-clause BSD license. See COPYING-BSD. */
4 /* ==================================================================== */
5 #include <string>
6 /* ==================================================================== */
7 extern "C" 
8 {
9     /* ==================================================================== */  
10 #include "api_scilab.h"
11 #include "Scierror.h"
12 #include "sci_malloc.h"
13 #include <localization.h>
14
15     /* ==================================================================== */
16     int sci_cpp_find(char *fname, void* pvApiCtx) 
17     {
18         SciErr sciErr;
19
20         int m1 = 0, n1 = 0;
21         int *piAddressVarOne = NULL;
22         char *pStVarOne = NULL;
23         int lenStVarOne = 0;
24         int iType1 = 0;
25
26         int m2 = 0, n2 = 0;
27         int *piAddressVarTwo = NULL;
28         char *pStVarTwo = NULL;
29         int lenStVarTwo = 0;
30         int iType2 = 0;
31
32         /* Check the number of input argument */
33         CheckInputArgument(pvApiCtx, 2,2); 
34
35         /* Check the number of output argument */
36         CheckOutputArgument(pvApiCtx, 1,1);
37
38         /* get Address of inputs */
39         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
40         if(sciErr.iErr)
41         {
42             printError(&sciErr, 0);
43             return 0;
44         }     
45         sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);
46         if(sciErr.iErr)
47         {
48             printError(&sciErr, 0);
49             return 0;
50         } 
51
52         /* checks types */
53         sciErr = getVarType(pvApiCtx, piAddressVarOne, &iType1);
54         if(sciErr.iErr)
55         {
56             printError(&sciErr, 0);
57             return 0;
58         } 
59
60         if ( iType1 != sci_strings )
61         {
62             Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,1);
63             return 0;
64         }
65
66         sciErr = getVarType(pvApiCtx, piAddressVarTwo, &iType2);
67         if(sciErr.iErr)
68         {
69             printError(&sciErr, 0);
70             return 0;
71         } 
72
73         if ( iType2 != sci_strings )
74         {
75             Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,2);
76             return 0;
77         }
78
79         /* get strings */
80
81         sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&m1,&n1,&lenStVarOne,&pStVarOne);
82         if(sciErr.iErr)
83         {
84             printError(&sciErr, 0);
85             return 0;
86         } 
87
88         /* check size */
89         if ( (m1 != n1) && (n1 != 1) ) 
90         {
91             Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,1);
92             return 0;
93         }
94         /* alloc string */
95         pStVarOne = (char*)MALLOC(sizeof(char)*(lenStVarOne + 1));
96         /* get string One */
97         sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&m1,&n1,&lenStVarOne,&pStVarOne);
98         if(sciErr.iErr)
99         {
100             printError(&sciErr, 0);
101             return 0;
102         } 
103
104         sciErr = getMatrixOfString(pvApiCtx, piAddressVarTwo,&m2,&n2,&lenStVarTwo,&pStVarTwo);
105         if(sciErr.iErr)
106         {
107             printError(&sciErr, 0);
108             return 0;
109         } 
110
111         if ( (m2 != n2) && (n2 != 1) ) 
112         {
113             Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,2);
114             return 0;
115         }
116         /* alloc string */
117         pStVarTwo = (char*)MALLOC(sizeof(char)*(lenStVarTwo + 1));
118         /* get string Two */
119         sciErr = getMatrixOfString(pvApiCtx, piAddressVarTwo,&m2,&n2,&lenStVarTwo,&pStVarTwo);
120         if(sciErr.iErr)
121         {
122             printError(&sciErr, 0);
123             return 0;
124         } 
125
126
127         std::string myMessage (pStVarOne);
128         if (pStVarOne)
129         {
130             FREE(pStVarOne); 
131             pStVarOne = NULL;
132         }
133
134         std::string search(pStVarTwo);
135         if (pStVarTwo)
136         {
137             FREE(pStVarTwo);
138             pStVarTwo = NULL;
139         }
140
141         /* Where we will store the position */
142         double dOut = 0.0;
143         if (myMessage.find(search) != std::string::npos) 
144         {
145             /* The actual operation */
146             dOut = myMessage.find(search); 
147         } 
148         else 
149         {
150             dOut = -1; /* Substring not found */
151         }
152
153         /* create result on stack */
154         int m_out = 1;
155         int n_out = 1;
156
157         createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, m_out, n_out, &dOut);
158
159         AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; 
160
161         return 0;
162     }
163     /* ==================================================================== */  
164 } /* extern "C" */
165 /* ==================================================================== */