helptools module enable within YaSp
[scilab.git] / scilab / modules / string / sci_gateway / c / sci_convstr.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA - Cong WU
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 /* desc : converts the matrix of strings  str-matrix  into lower case (for*/  
14 /*          "l"  ;default value) or upper case (for  "u" ).               */
15 /*        [y]=convstr(str-matrix, ["flag"])                               */
16 /*              str-matrix, y : matrices of strings                       */
17 /*              "flag"  : string ( "u"  for upper or  "l"  for lower      */
18 /*                        (default value))                                */
19 /*------------------------------------------------------------------------*/
20 #include <string.h>
21 #include <stdio.h>
22 #include "gw_string.h"
23 #include "stack-c.h"
24 #include "MALLOC.h"
25 #include "convstr.h"
26 #include "localization.h"
27 #include "Scierror.h"
28 #include "freeArrayOfString.h"
29 /*----------------------------------------------------------------------------*/
30 int sci_convstr(char *fname,unsigned long fname_len)
31 {
32         char **Input_Matrix = NULL;
33         char **Output_Matrix = NULL;
34         char typ = LOW;
35         int numRow = 0;
36         int numCol = 0;
37         int Row_Num_One = 0;
38         int Col_Num_One = 0;
39         int mn = 0; /* Row_Num_One * Col_Num_One */
40         int i = 0;
41         
42         int Type_One = 0;
43         
44         CheckRhs(1,2);
45         CheckLhs(1,1);
46         
47         Type_One = VarType(1);
48         
49         if (Rhs == 2) 
50         {
51                 int Type_Two = VarType(2);
52                 
53                 if (Type_Two == sci_strings) 
54                 {
55                         int Row_Num_Two = 0,Col_Num_Two = 0,Stack_Pos=0;
56                         
57                         GetRhsVar(2,STRING_DATATYPE,&Row_Num_Two,&Col_Num_Two,&Stack_Pos);
58                         if ( (Row_Num_Two*Col_Num_Two) == 1 )
59                         {
60                                 /* To put "flag" into typ; whether "u" or "l" */
61                                 typ = cstk(Stack_Pos)[0];
62                                 if ( (typ != UPPER) && (typ != LOW) && (typ != UPPER_B) && (typ != LOW_B) ) 
63                                 {
64                                         Scierror(999,_("%s: Wrong value for input argument #%d: 'u' (Upper) or 'l' (Lower) expected.\n"),fname,2);
65                                         return 0;
66                                 }
67                         }
68                         else
69                         {
70                                 Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,2);
71                                 return 0;
72                         }
73                 }
74                 else
75                 {
76                         Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,2);
77                         return 0;
78                 }
79         }
80         
81         switch (Type_One) 
82         {
83                 case sci_strings :
84                 {
85                         GetRhsVar(1,MATRIX_OF_STRING_DATATYPE,&Row_Num_One,&Col_Num_One,&Input_Matrix);     /* To input the string matrix */
86                         mn = Row_Num_One * Col_Num_One; 
87                 }
88                 break;
89                 case sci_matrix :
90                 {
91                         GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&Row_Num_One,&Col_Num_One,&Input_Matrix);
92             if ( (Row_Num_One == 0) && (Col_Num_One == 0) )
93                         {
94                                 int l =0;
95                                 CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,&Row_Num_One,&Col_Num_One,&l);
96                                 LhsVar(1) = Rhs+1 ;
97                                 C2F(putlhsvar)();
98                                 return 0;
99                         }
100                         else 
101                         {
102                                 Scierror(999,_("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"),fname,1);
103                                 return 0;
104                         }
105                 }
106                 break;
107                 default :
108                         Scierror(999,_("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"),fname,1);
109                         return 0;
110                 break;
111         }
112         
113         Output_Matrix = (char**)MALLOC(sizeof(char*)*(mn));
114         if (Output_Matrix == NULL)
115         {
116                 Scierror(999,_("%s: No more memory.\n"),fname);
117                 return 0;
118         }
119         
120         for (i = 0;i < mn;i++)
121         {
122                 Output_Matrix[i] = (char*)MALLOC( sizeof(char*) * (strlen(Input_Matrix[i])+1) );
123                 if (Output_Matrix[i] == NULL)
124                 {
125                         freeArrayOfString(Output_Matrix,i);
126                         Scierror(999,("%s: No more memory.\n"),fname);
127                         return 0;
128                 }
129         }
130         
131         /* convstr algorithm */
132         convstr(Input_Matrix,Output_Matrix,typ,mn); 
133         freeArrayOfString(Input_Matrix,mn);
134         
135         /* put on scilab stack */
136         numRow   = Row_Num_One; 
137         numCol   = Col_Num_One ;
138         CreateVarFromPtr( Rhs+1,MATRIX_OF_STRING_DATATYPE, &numRow, &numCol, Output_Matrix );
139         LhsVar(1) = Rhs+1 ;
140         C2F(putlhsvar)();
141         
142         /* free pointers used */
143         freeArrayOfString(Output_Matrix,mn);
144         return 0;
145 }
146 /*--------------------------------------------------------------------------*/