7a205bebc1f6fc5a80f96e73feaa0f0a60730f80
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_plot2d1.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 /*------------------------------------------------------------------------*/
15 /* file: sci_plot2d1.c                                                    */
16 /* desc : interface for plot2d1, plot2d2, plot2d3 and plot2d4 routines    */
17 /*------------------------------------------------------------------------*/
18
19 #include "gw_graphics.h"
20 #include "stack-c.h"
21 #include "GetCommandArg.h"
22 #include "DefaultCommandArg.h"
23 #include "sciCall.h"
24 #include "localization.h"
25 #include "Scierror.h"
26 /*--------------------------------------------------------------------------*/
27 int sci_plot2d1_1 (char *fname,unsigned long fname_len)
28 {
29   return sci_plot2d1_G("plot2d1",1,fname_len);/* NG */
30 }
31 /*--------------------------------------------------------------------------*/
32 int sci_plot2d1_2 (char *fname,unsigned long fname_len)
33 {
34   return sci_plot2d1_G("plot2d2",2,fname_len); /* NG */
35 }
36 /*--------------------------------------------------------------------------*/
37 int sci_plot2d1_3 (char *fname,unsigned long fname_len)
38 {
39   return sci_plot2d1_G("plot2d3",3,fname_len);/* NG */
40 }
41 /*--------------------------------------------------------------------------*/
42 int sci_plot2d1_4 (char *fname,unsigned long fname_len)
43 {
44   return sci_plot2d1_G("plot2d4",4,fname_len);/* NG */
45 }
46 /*--------------------------------------------------------------------------*/
47 int sci_plot2d1_G( char * fname, int ptype, unsigned long fname_len )
48 {
49   int frame_def=8;
50   int *frame=&frame_def;
51   int axes_def=1;
52   int *axes=&axes_def;
53   int iskip = 0, test  = 0;
54   int m1 = 0,n1 = 0,l1 = 0, m2 = 0, n2 = 0, l2 = 0, lt = 0, i = 0, j = 0;
55
56   static rhs_opts opts[]= { {-1,"axesflag","?",0,0,0},
57                             {-1,"frameflag","?",0,0,0},
58                             {-1,"leg","?",0,0,0},
59                             {-1,"logflag","?",0,0,0},
60                             {-1,"nax","?",0,0,0},
61                             {-1,"rect","?",0,0,0},
62                             {-1,"strf","?",0,0,0},
63                             {-1,"style","?",0,0,0},
64                             {-1,NULL,NULL,0,0}       };
65
66   int    * style    = NULL  ;
67   double * rect     = NULL  ;
68   int    * nax      = NULL  ;
69   BOOL     flagNax  = FALSE ;
70   char   * strf     = NULL  ;
71   char   * legend   = NULL  ;
72   char   * logFlags = NULL  ;
73
74   if (Rhs <= 0) {
75     /* lauch the default routines depending on the name of the calling funtion */
76     sci_demo(fname, fname_len);
77     return 0;
78   }
79   CheckRhs(1,9); /* to allow plot2dxx(y) */
80
81
82   iskip=0;
83   if ( get_optionals(fname,opts) == 0) 
84   {
85           PutLhsVar();
86           return 0;
87   }
88
89   if (GetType(1)==sci_strings) {
90     /* logflags */
91     GetLogflags(fname,1,opts,&logFlags);
92     iskip=1;
93   }
94
95   /* added to support plot2dxx([logflags],y) */
96   if ( Rhs == 1 + iskip )
97   {
98     if ( FirstOpt() <= Rhs)
99     {
100       Scierror(999,_("%s: Misplaced optional argument: #%d must be at position %d.\n"),fname,1, 3+iskip);
101       return(0);
102     }
103
104     GetRhsVar(1+iskip,MATRIX_OF_DOUBLE_DATATYPE, &m2, &n2, &l2);
105     CreateVar(2+iskip,MATRIX_OF_DOUBLE_DATATYPE,  &m2, &n2, &l1);
106     if (m2 == 1 && n2 > 1) { m2 = n2; n2 = 1;}
107     m1 = m2;  n1 = n2;
108     for (i = 0; i < m2 ; ++i) 
109       for (j = 0 ; j < n2 ;  ++j)
110         *stk( l1 + i + m2*j) = (double) i+1;
111   }
112
113
114   if (Rhs >= 2+iskip)
115   {
116     if ( FirstOpt() < 3+iskip) 
117     {
118       Scierror(999,_("%s: Misplaced optional argument: #%d must be at position %d.\n"),
119         fname,1, 3+iskip);
120       return(0);
121     }
122
123
124     /* x */
125     GetRhsVar(1+iskip,MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);
126     if (iskip==1) 
127     {
128       if (logFlags[0]=='e')
129       {
130         m1 = 0 ;
131         n1 = 0 ;
132       }
133     }
134
135     /* y */
136     GetRhsVar(2+iskip,MATRIX_OF_DOUBLE_DATATYPE, &m2, &n2, &l2);
137     /* if (m2 * n2 == 0) { m1 = 0; n1 = 0;}  */
138
139     test = (m1*n1 == 0) /* x = [] */
140       /* x,y vectors of same length */  
141       || ((m1 == 1 || n1 == 1) && (m2 == 1 || n2 ==1) && (m1*n1 == m2*n2))
142       || ((m1 == m2) && (n1 == n2)) /* size(x) == size(y) */
143       /* x vector size(y)==[size(x),.] */
144       || ((m1 == 1 && n1 == m2) || (n1 == 1 && m1 == m2)); 
145
146     CheckDimProp(1+iskip,2+iskip,!test);
147
148     if (m1*n1 == 0) 
149     { /* default x=1:n */
150       CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,  &m2, &n2, &lt);
151       if (m2 == 1 && n2 > 1) { m2 = n2; n2 = 1;}
152       for (i = 0; i < m2 ; ++i)
153       {
154         for (j = 0 ; j < n2 ;  ++j)
155         {
156           *stk( lt + i + m2*j) = (double) i+1;
157         }
158       }
159       m1 = m2;
160       n1 = n2;
161       l1 = lt;
162     }
163     else if ((m1 == 1 || n1 == 1) && (m2 != 1 && n2 != 1) ) {
164       /* a single x vector for mutiple columns for y */
165       CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,  &m2, &n2, &lt);
166       for (i = 0; i < m2 ; ++i)
167       {
168         for (j = 0 ; j < n2 ;  ++j)
169         {
170           *stk( lt + i + m2*j) = *stk(l1 +i);
171         }
172       }
173       m1 = m2;
174       n1 = n2;
175       l1 = lt;
176     }
177     else if ((m1 == 1 && n1 == 1) && (n2 != 1) ) {
178       /* a single y row vector  for a single x */
179       CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,  &m1, &n2, &lt);
180       for (j = 0 ; j < n2 ;  ++j)
181       {
182         *stk( lt + j ) = *stk(l1);
183       }
184       n1 = n2;
185       l1 = lt;
186     }
187     else {
188       if (m2 == 1 && n2 > 1) { m2 = n2; n2 = 1;}
189       if (m1 == 1 && n1 > 1) { m1 = n1; n1 = 1;}
190     }
191   }
192
193   sciGetStyle(fname,3+iskip,n1,opts,&style);
194   GetStrf(fname,4+iskip,opts,&strf);
195   GetLegend(fname,5+iskip,opts,&legend);
196   GetRect(fname,6+iskip,opts,&rect);
197   GetNax(7+iskip,opts,&nax,&flagNax);
198   if (iskip==0) GetLogflags(fname,8,opts,&logFlags);
199
200   if ( isDefStrf( strf ) ) {
201     char strfl[4];
202     strcpy(strfl,DEFSTRFN);
203
204     strf = strfl;
205     if ( !isDefRect( rect ) )
206     {
207       strfl[1]='7';
208     }
209     if ( !isDefLegend( legend ) )
210     {
211       strfl[0]='1';
212     }
213     GetOptionalIntArg(fname,9,"frameflag",&frame,1,opts);
214     if(frame != &frame_def)
215     {
216       strfl[1] = (char)(*frame+48);
217     }
218     GetOptionalIntArg(fname,9,"axesflag",&axes,1,opts);
219     if(axes != &axes_def)
220     {
221       strfl[2] = (char)(*axes+48);
222     }
223   }
224
225   if(ptype == 0) { ptype = 1 ; }
226
227   Objplot2d (ptype,logFlags,stk(l1), stk(l2), &n1, &m1, style, strf,legend,rect, nax, flagNax);
228
229
230   LhsVar(1) = 0;
231   PutLhsVar();
232   return 0;
233 }
234 /*--------------------------------------------------------------------------*/