Added some missing headers reported by /usr/lib/build/checks-data/check_gcc_output
[scilab.git] / scilab / modules / graphics / src / c / get_ticks_utils.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  * Copyright (C) 2009 - INRIA - Pierre Lando
7  * 
8  * This file must be used under the terms of the CeCILL.
9  * This source file is licensed as described in the file COPYING, which
10  * you should have received as part of this distribution.  The terms
11  * are also available at    
12  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
13  *
14  */
15
16 /*------------------------------------------------------------------------*/
17 /* file: get_ticks_utils.c                                                */
18 /* desc : a set of functions used to return ticks tlist in scilab         */
19 /*------------------------------------------------------------------------*/
20
21 #include <stdio.h>
22 #include <string.h>
23 #include "get_ticks_utils.h"
24 #include "returnPropertyList.h"
25 #include "MALLOC.h"
26 #include "localization.h"
27 #include "Scierror.h"
28 #include "Format.h"
29 #include "SetProperty.h"
30 /*--------------------------------------------------------------------------------*/
31 static char ** AllocAndSetUserLabels(char ** u_xlabels, double * u_xgrads, int u_nxgrads, char logflag);
32 /*--------------------------------------------------------------------------------*/
33 int buildTListForTicks( const double * locations, char * labels[], int nbTics )
34 {
35   char * variable_tlist[] = {"ticks","locations","labels"};
36
37   returnedList * tList = createReturnedList( 2, variable_tlist ) ;
38
39   if (nbTics == 0)
40   {
41     // two empty matrices
42     addColVectorToReturnedList( tList, NULL, 0 ) ;
43     addColVectorToReturnedList( tList, NULL, 0 ) ;
44   }
45   else
46   {
47     addColVectorToReturnedList( tList, locations, nbTics ) ;
48     addStringColVectorToReturnedList( tList, labels, nbTics ) ;
49   }
50   
51   destroyReturnedList( tList ) ;
52
53   return 0;
54 }
55 /*--------------------------------------------------------------------------------*/
56 double * FreeUserGrads(double * u_xgrads)
57 {
58   FREE(u_xgrads); u_xgrads = NULL;
59   return u_xgrads;
60 }
61 /*--------------------------------------------------------------------------------*/
62 int CreatePrettyGradsFromNax(sciPointObj * psubwin,int * Nax)
63 {
64   double xmin = 0, xmax = 0;
65   double ymin = 0, ymax = 0;
66   int nbtics_x = Nax[1];
67   int nbtics_y = Nax[3];
68   int nbsubtics_x = Nax[0];
69   int nbsubtics_y = Nax[2];
70   BOOL autoTicks[3];
71
72   sciSubWindow * ppsubwin = pSUBWIN_FEATURE (psubwin);
73   
74   if(sciGetZooming(psubwin) == TRUE) {
75     xmin= ppsubwin->FRect[0]; 
76     ymin= ppsubwin->FRect[1]; 
77     xmax= ppsubwin->FRect[2];
78     ymax= ppsubwin->FRect[3];
79   }
80   else {
81     xmin = ppsubwin->SRect[0];
82     ymin = ppsubwin->SRect[2];
83     xmax = ppsubwin->SRect[1];
84     ymax = ppsubwin->SRect[3];
85   }
86   
87   /* x graduations */
88   if(nbtics_x == -1.0)
89   {
90     // if nbtics_x == -1.0 the user whant autoticks
91     sciGetAutoTicks(psubwin, autoTicks);
92     sciSetAutoTicks(psubwin, TRUE, autoTicks[1], autoTicks[2]);
93   }
94   else
95   {
96     ppsubwin->axes.u_xgrads  = FreeUserGrads (ppsubwin->axes.u_xgrads);
97     ppsubwin->axes.u_xlabels = FreeUserLabels(ppsubwin->axes.u_xlabels, &ppsubwin->axes.u_nxgrads);
98     
99     ppsubwin->axes.u_nxgrads = nbtics_x;
100     ppsubwin->axes.u_xgrads = AllocUserGrads(ppsubwin->axes.u_xgrads, nbtics_x);
101     
102     GraduateWithNax(ppsubwin,&xmin,&xmax,nbtics_x,ppsubwin->axes.u_xgrads);
103
104     ppsubwin->axes.u_xlabels = AllocAndSetUserLabels(ppsubwin->axes.u_xlabels, 
105                                                      ppsubwin->axes.u_xgrads, 
106                                                      ppsubwin->axes.u_nxgrads, 
107                                                      ppsubwin->logflags[0]);
108   }
109
110   /* y graduations */
111   if(nbtics_y == -1.0)
112   {
113     // if nbtics_y == -1.0 the user whant autoticks
114     sciGetAutoTicks(psubwin, autoTicks);
115     sciSetAutoTicks(psubwin, autoTicks[0], TRUE, autoTicks[2]);
116   }
117   else
118   {
119     ppsubwin->axes.u_ygrads  = FreeUserGrads (ppsubwin->axes.u_ygrads);
120     ppsubwin->axes.u_ylabels = FreeUserLabels(ppsubwin->axes.u_ylabels,
121                                               &ppsubwin->axes.u_nygrads);
122     
123     ppsubwin->axes.u_nygrads = nbtics_y;
124     ppsubwin->axes.u_ygrads = AllocUserGrads(ppsubwin->axes.u_ygrads, nbtics_y);
125     
126     GraduateWithNax(ppsubwin,&ymin,&ymax,nbtics_y,ppsubwin->axes.u_ygrads);
127     
128     ppsubwin->axes.u_ylabels = AllocAndSetUserLabels(ppsubwin->axes.u_ylabels, 
129                                                      ppsubwin->axes.u_ygrads, 
130                                                      ppsubwin->axes.u_nygrads, 
131                                                      ppsubwin->logflags[1]);
132   }
133     
134   /* Subtics storage here */
135   ppsubwin->axes.nbsubtics[0] = nbsubtics_x;
136   ppsubwin->axes.nbsubtics[1] = nbsubtics_y;
137
138   return 0;
139 }
140 /*--------------------------------------------------------------------------------*/
141 int GraduateWithNax(sciSubWindow * ppsubwin,double *min,double *max,int nbtics, double * grads)
142 {
143   int i;
144   double pas;
145   
146   if(nbtics == 1){
147     pas = 0.;
148     grads[0] = (*min);
149   }
150   else{
151     pas = (*max - *min) / (nbtics -1);
152     
153     for(i=0;i<nbtics;i++) 
154       grads[i] = (*min) + pas*i;
155   }
156
157   return 0;
158 }
159 /*--------------------------------------------------------------------------------*/
160 static char ** AllocAndSetUserLabels(char ** u_xlabels, double * u_xgrads, int u_nxgrads, char logflag)
161 {
162   int i;
163   char c_format[5]; 
164   int nbtics = u_nxgrads;
165
166   if(u_xgrads == NULL)
167     return (char **) NULL;
168   
169   if(u_xlabels != NULL)
170     {
171       Scierror(999, _("Impossible: %s must be freed before re-allocating"),"u_xlabels");
172       return (char **) NULL;
173     }
174   
175
176   if((u_xlabels=(char **)MALLOC(u_nxgrads*sizeof(char *)))==NULL){
177           Scierror(999, _("%s: No more memory.\n"), "AllocAndSetUserLabels");
178           return (char **) NULL;
179   }
180
181   ChooseGoodFormat(c_format,logflag,u_xgrads,u_nxgrads);
182   
183   for(i=0;i<nbtics;i++)
184     {  
185       char foo[100];
186       
187       sprintf(foo,c_format, u_xgrads[i]);
188       
189       if((u_xlabels[i]=(char *)MALLOC((strlen(foo)+1)*sizeof(char )))==NULL){
190                   Scierror(999, _("%s: No more memory.\n"), "AllocAndSetUserLabels");
191                   return (char **) NULL;
192       }
193       
194       strcpy(u_xlabels[i],foo);
195     }
196   
197   return u_xlabels;
198 }
199 /*--------------------------------------------------------------------------------*/
200 char ** AllocAndSetUserLabelsFromMdl(char ** u_xlabels, char ** u_xlabels_MDL, int u_nxgrads)
201 {
202   int i;
203   int nbtics = u_nxgrads;
204
205   if(u_nxgrads == 0)
206     return (char **) NULL;
207   
208   if(u_xlabels != NULL)
209     {
210       Scierror(999, _("Impossible: %s must be freed before re-allocating"),"u_xlabels");
211       return (char **) NULL;
212     }
213   
214   if((u_xlabels=(char **)MALLOC(u_nxgrads*sizeof(char *)))==NULL){
215           Scierror(999, _("%s: No more memory.\n"), "AllocAndSetUserLabelsFromMdl");
216           return (char **) NULL;
217   }
218
219   
220   for(i=0;i<nbtics;i++)
221     {  
222                 if((u_xlabels[i]=(char *)MALLOC((strlen(u_xlabels_MDL[i])+1)*sizeof(char )))==NULL){
223                         Scierror(999, _("%s: No more memory.\n"), "AllocAndSetUserLabelsFromMdl");
224                         return (char **) NULL;
225       }
226       
227       strcpy(u_xlabels[i],u_xlabels_MDL[i]);
228     }
229   
230   return u_xlabels;
231 }
232 /*--------------------------------------------------------------------------------*/
233 char ** FreeUserLabels(char ** u_xlabels, int *u_nxgrads)
234 {
235   int i;
236   
237   if(u_xlabels != NULL){
238     for(i=0;i<(*u_nxgrads);i++)
239       {FREE(u_xlabels[i]); u_xlabels[i] = (char *) NULL;}
240   }
241   
242   u_xlabels = (char **) NULL;
243     
244   *u_nxgrads = 0;
245   
246   return u_xlabels;
247 }
248 /*--------------------------------------------------------------------------------*/
249 double * AllocUserGrads(double * u_xgrads, int nb)
250 {
251   
252   if(nb == 0)
253     return (double *) NULL;
254   
255   if(u_xgrads != NULL)
256     {
257       Scierror(999, _("Impossible: %s must be freed before re-allocating"),"u_xgrads");
258       return (double *) NULL;
259     }
260   
261   if((u_xgrads=(double *)MALLOC(nb*sizeof(double)))==NULL){
262           Scierror(999, _("%s: No more memory.\n"),"AllocUserGrads");
263           return (double *) NULL;
264   }
265     
266   return u_xgrads;
267
268 }
269 /*--------------------------------------------------------------------------------*/
270 int CopyUserGrads(double *u_xgrad_SRC, double *u_xgrad_DEST, int dim)
271 {
272   int i;
273
274   if(u_xgrad_SRC == NULL)
275     return 0;
276
277   for(i=0;i<dim;i++)
278     u_xgrad_DEST[i] = u_xgrad_SRC[i];
279   
280   return 0;
281 }
282 /*--------------------------------------------------------------------------------*/