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