bd97dbfc5dcabcfe218288b5010757a432e39fab
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_glue.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_glue.h                                                       */
16 /* desc : interface for glue routine                                      */
17 /*------------------------------------------------------------------------*/
18
19 #include "gw_graphics.h"
20 #include "stack-c.h"
21 #include "BuildObjects.h"
22 #include "MALLOC.h"
23 #include "GetProperty.h"
24 #include "elementary_functions.h"
25 #include "CurrentObjectsManagement.h"
26 #include "localization.h"
27 #include "Scierror.h"
28 #include "HandleManagement.h"
29
30 /*--------------------------------------------------------------------------*/
31 int sci_glue( char * fname, unsigned long fname_len )
32 {
33   int numrow,numcol,l1,l2,lind,n,cx1=1,ret ;
34   unsigned long hdl = 0, parenthdl = 0 ;
35   long *handelsvalue = NULL ;
36   int outindex,i;
37   sciPointObj *pobj;
38
39   CheckRhs(1,1);
40   CheckLhs(0,1);
41
42   /*  set or create a graphic window */
43   GetRhsVar(1,GRAPHICAL_HANDLE_DATATYPE,&numrow,&numcol,&l1); /* We get the scalar value if it is ones */
44   n=numrow*numcol;
45   CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,&numrow,&numcol,&l2);
46   CreateVar(Rhs+2,MATRIX_OF_INTEGER_DATATYPE,&numrow,&numcol,&lind);
47   if (n>1) 
48   {
49         C2F(dcopy)(&n, stk(l1), &cx1, stk(l2), &cx1);
50     C2F(dsort)(stk(l2),&n,istk(lind));
51         for (i = 1; i < n;i++) 
52         {
53           long long i1 = (long long)*hstk(l2+i);
54           long long i2 = (long long)*hstk(l2+i-1);
55         
56           if (i1 == i2) 
57           {
58         Scierror(999,_("%s: Each handle should not appear twice.\n"),fname);
59         return 0;
60       }
61     }
62   }
63   /* we must change the pobj to the Compound type */
64   handelsvalue = MALLOC(n*sizeof(long));
65   for (i = 0; i < n;i++)
66   {
67     handelsvalue[i] = (unsigned long) (hstk(l1))[i];
68     pobj = sciGetPointerFromHandle(handelsvalue[i]);
69     if (pobj == NULL) 
70         {
71       Scierror(999,_("%s: The handle is not or no more valid.\n"),fname);
72       return 0;
73     }
74     parenthdl = (unsigned long ) sciGetHandle(sciGetParent (pobj));
75     if (i == 0) hdl = parenthdl;
76
77     if  (parenthdl != hdl)
78     {
79       Scierror(999,_("%s: Objects must have the same parent.\n"),fname);
80       return 0;
81     }
82
83   }
84   ret = CheckForCompound (handelsvalue, n);
85   if (ret>0) 
86   {
87     Scierror(999,_("%s: Handle %d cannot be glued (invalid parent).\n"),fname,ret);
88     return 0;
89   }
90
91   if (ret<0) 
92   {
93     Scierror(999,_("%s: Handle %d cannot be glued (invalid type).\n"),fname,-ret);
94     return 0;
95   }
96
97   sciSetCurrentObj ((sciPointObj *)ConstructCompound (handelsvalue, n));
98
99   numrow = 1;
100   numcol = 1;
101   CreateVar(Rhs+3,GRAPHICAL_HANDLE_DATATYPE,&numrow,&numcol,&outindex);
102   hstk(outindex)[0] = sciGetHandle((sciPointObj *) sciGetCurrentObj());
103   LhsVar(1) = Rhs+3;
104   C2F(putlhsvar)();
105   FREE(handelsvalue);
106   return 0;
107 }
108 /*--------------------------------------------------------------------------*/