Added some missing headers reported by /usr/lib/build/checks-data/check_gcc_output
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_log_flags_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Allan Cornet
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
6  * 
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at    
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 /*------------------------------------------------------------------------*/
16 /* file: set_log_flags_property.c                                         */
17 /* desc : function to modify in Scilab the log_flags field of             */
18 /*        a handle                                                        */
19 /*------------------------------------------------------------------------*/
20 #include <string.h>
21 #include "setHandleProperty.h"
22 #include "SetProperty.h"
23 #include "getPropertyAssignedValue.h"
24 #include "SetPropertyStatus.h"
25 #include "GetProperty.h"
26 #include "Scierror.h"
27 #include "sciprint.h"
28 #include "localization.h"
29 #include "MALLOC.h"
30 #include "freeArrayOfString.h"
31
32 /*--------------------------------------------------------------------------*/
33 char ** ReBuildUserTicks( char old_logflag, char new_logflag, double * u_xgrads, int *u_nxgrads, char ** u_xlabels);
34 /*--------------------------------------------------------------------------*/
35 char ** CaseLogflagN2L(int * u_nxgrads, double *u_xgrads, char ** u_xlabels);
36 /*--------------------------------------------------------------------------*/
37 /* Remove negative graduations when switching from N (linear) to L (logarithmic) scale */
38 char ** CaseLogflagN2L(int * u_nxgrads, double *u_xgrads, char ** u_xlabels)
39 {
40   int nbtics = *u_nxgrads;
41   int i;
42   char ** ticklabel = (char **) NULL;
43   int cmpteur = 0, cmpteur2 = 0, offset = 0;
44
45
46   for(i=0;i<nbtics;i++) 
47   {
48     if(u_xgrads[i]<=0){
49       sciprint("Warning: graduation number %d is ignored : when switching to logarithmic scale, we must have strictly positive graduations!\n",i);
50     }
51     else
52     {
53       u_xgrads[cmpteur] = log10(u_xgrads[i]);
54       cmpteur++;
55     }
56   }
57
58   if(cmpteur != nbtics)
59   {
60     if((ticklabel=(char **)MALLOC(cmpteur*sizeof(char *)))==NULL){
61       Scierror(999, _("%s: No more memory.\n"),"CaseLogflagN");
62                         return NULL;
63     }
64
65     cmpteur2 = 0;
66     offset = nbtics - cmpteur;
67     for(i=0;i<cmpteur;i++){
68       if((ticklabel[cmpteur2]=(char *)MALLOC((strlen(u_xlabels[i+offset])+1)*sizeof(char )))==NULL){
69                                 Scierror(999, _("%s: No more memory.\n"),"CaseLogflagN");
70       }
71       strcpy(ticklabel[cmpteur2],u_xlabels[i+offset]);
72       cmpteur2++;
73     }
74
75         freeArrayOfString(u_xlabels, nbtics);
76     u_xlabels = ticklabel;
77   }
78
79   *u_nxgrads = cmpteur;
80   cmpteur = 0;
81   cmpteur2 = 0;
82
83   return u_xlabels;
84 }
85 /*--------------------------------------------------------------------------*/
86 /* Called by a.log_flags='nn','ln','nl', or 'll'*/
87 /* For the moment, z has no logflag F.Leray 05.10.04 */
88 char ** ReBuildUserTicks( char old_logflag, char new_logflag, double * u_xgrads, int *u_nxgrads, char ** u_xlabels)
89 {
90
91   if(old_logflag==new_logflag) { return u_xlabels; } /* nothing to do l->l or n->n */
92
93   if(u_xgrads!=NULL)
94   {
95     if(old_logflag=='n' && new_logflag=='l') /* n->l */ /* 10-> 1, 100->2 ...*/
96     {
97
98       u_xlabels=CaseLogflagN2L(u_nxgrads,u_xgrads,u_xlabels);
99
100     }
101     else if(old_logflag=='l' && new_logflag=='n')
102     {
103       int nbtics = *u_nxgrads;
104       int i;
105
106       for(i=0;i<nbtics;i++) u_xgrads[i] = exp10(u_xgrads[i]);
107
108     }
109   }
110
111   return  u_xlabels;
112 }
113 /*------------------------------------------------------------------------*/
114 int set_log_flags_property( sciPointObj * pobj, size_t stackPointer, int valueType, int nbRow, int nbCol )
115 {
116   char * flags;
117   sciSubWindow * ppSubWin = NULL ;
118   char curLogFlags[4] = "nnn";
119
120   if ( !isParameterStringMatrix( valueType ) )
121   {
122     Scierror(999, _("Wrong type for '%s' property: String expected.\n"), "log_flags");
123     return SET_PROPERTY_ERROR ;
124   }
125
126   if (sciGetEntityType (pobj) != SCI_SUBWIN)
127   {
128     Scierror(999, _("'%s' property does not exist for this handle.\n"),"log_flags") ;
129     return SET_PROPERTY_ERROR ;
130   }
131   
132   if ( nbRow * nbCol != 2 && nbRow * nbCol != 3 )
133   {
134     Scierror(999, _("Wrong size for '%s' property: Must be %s or %s.\n"), "log_flags", "2", "3");
135     return SET_PROPERTY_ERROR ;
136   }
137
138   flags = getStringFromStack(stackPointer);
139
140   /* flags must be 'n' or 'l' */
141   if (   (flags[0] != 'n' && flags[0] != 'l')
142       || (flags[1] != 'n' && flags[1] != 'l'))
143   {
144     Scierror(999, _("%s: Wrong value for argument: '%s' or '%s' expected.\n"),"flags","n","l");
145     return SET_PROPERTY_ERROR ;
146   }
147
148   ppSubWin = pSUBWIN_FEATURE (pobj) ;
149
150   // get a copy of current log flags
151   sciGetLogFlags(pobj, curLogFlags);
152
153
154   /* X axes */
155   if( ( ppSubWin->SRect[0] <= 0. || ppSubWin->SRect[1] <= 0.) && flags[0] == 'l' )
156   {
157     Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"),"x");
158     return SET_PROPERTY_ERROR ;
159   }
160   ppSubWin->axes.u_xlabels = ReBuildUserTicks( curLogFlags[0], flags[0],
161                                                ppSubWin->axes.u_xgrads, 
162                                                &ppSubWin->axes.u_nxgrads, 
163                                                ppSubWin->axes.u_xlabels   );
164
165
166   curLogFlags[0] = flags[0];
167
168   /* Y axes */
169   if( ( ppSubWin->SRect[2] <= 0. || ppSubWin->SRect[3] <= 0. ) && flags[1] == 'l' )
170   { 
171       Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"),"y");
172       return SET_PROPERTY_ERROR ;
173   }
174   ppSubWin->axes.u_ylabels = ReBuildUserTicks( curLogFlags[1], flags[1],  
175                                                ppSubWin->axes.u_ygrads, 
176                                                &ppSubWin->axes.u_nygrads, 
177                                                ppSubWin->axes.u_ylabels  ) ;
178
179   curLogFlags[1] = flags[1];
180
181
182   if ( nbRow * nbCol == 3 )
183   {
184     if ( flags[2] != 'n' && flags[2] != 'l' )
185     {
186       Scierror(999, "flags must be 'n' or 'l'.\n") ;
187       return SET_PROPERTY_ERROR ;
188     }
189
190     if ( ( ppSubWin->SRect[4] <= 0. || ppSubWin->SRect[5] <= 0. ) && flags[2] == 'l' )
191     {
192       Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"),"z");
193       return SET_PROPERTY_ERROR ;
194     }
195
196     ppSubWin->axes.u_zlabels = ReBuildUserTicks( curLogFlags[2], flags[2],  
197                                                  ppSubWin->axes.u_zgrads, 
198                                                  &ppSubWin->axes.u_nzgrads, 
199                                                  ppSubWin->axes.u_zlabels) ;
200     curLogFlags[2] = flags[2];
201
202   }
203
204   sciSetLogFlags(pobj, curLogFlags);
205
206
207   return SET_PROPERTY_SUCCEED ;
208
209
210 }
211 /*------------------------------------------------------------------------*/