stack1.c

Go to the documentation of this file.
00001 /*------------------------------------------------------------------------
00002  *    Copyright (C) 1998-2000 Enpc/Inria 
00003  *    jpc@cereve.enpc.fr 
00004  --------------------------------------------------------------------------*/
00005 /*------------------------------------------
00006  * Scilab stack 
00007  *------------------------------------------*/
00008 #include <string.h>
00009 #include "stack-c.h"
00010 #include "stack1.h"
00011 #include "stack2.h"
00012 #include "sciprint.h"
00013 /* Table of constant values */
00014 
00015 static integer cx0 = 0;
00016 static integer cx1 = 1;
00017 static integer cx4 = 4;
00018 static int c_true = TRUE_;
00019 static int c_false = FALSE_;
00020 
00021 
00022 static int C2F(getwsmati) __PARAMS((char * fname, integer *topk, integer * spos,integer * lw,integer * m, integer *n,integer * ilr,integer * ilrd ,int * inlistx,integer* nel,unsigned long fname_len));
00023 
00024 int C2F(getrsparse)(char *fname, integer *topk, integer *lw, integer *m, integer *n,  integer *nel, integer *mnel, integer *icol, integer *lr,unsigned long fname_len);
00025 int C2F(getlistsmat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *m,integer *n,integer *ix,integer *j,integer *lr,integer *nlr,unsigned long fname_len);
00026 int cre_smat_from_str_i(char *fname, integer *lw, integer *m, integer *n, char *Str[],unsigned long fname_len, integer *rep);
00027 int cre_sparse_from_ptr_i(char *fname, integer *lw, integer *m, integer *n, SciSparse *S, unsigned long fname_len,  integer *rep);
00028 int crelist_G(integer *slw,integer *ilen,integer *lw,integer type);
00029 /**********************************************************************
00030  * MATRICES 
00031  **********************************************************************/
00032 
00033 /*------------------------------------------------------------------ 
00034  * getlistmat : 
00035  *    checks that spos object is a list 
00036  *    checks that lnum-element of the list exists and is a matrix 
00037  *    extracts matrix information(it,m,n,lr,lc) 
00038  *     In  : 
00039  *       fname : name of calling function for error message 
00040  *       topk  : stack ref for error message 
00041  *       lw    : stack position 
00042  *     Out : 
00043  *       [it,m,n] matrix dimensions 
00044  *       lr : stk(lr+i-1)= real(a(i)) 
00045  *       lc : stk(lc+i-1)= imag(a(i)) exists only if it==1 
00046  *------------------------------------------------------------------ */
00047 
00048 int C2F(getlistmat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
00049 {
00050   integer nv, ili;
00051 
00052   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_)
00053     return FALSE_;
00054 
00055   if (*lnum > nv) {
00056     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
00057              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
00058     return FALSE_;
00059   }
00060   return C2F(getmati)(fname, topk, spos, &ili, it, m, n, lr, lc, &c_true, lnum, fname_len);
00061 } 
00062 
00063 /*------------------------------------------------------------------- 
00064  * getmat :
00065  *     check that object at position lw is a matrix 
00066  *     In  : 
00067  *       fname : name of calling function for error message 
00068  *       topk  : stack ref for error message 
00069  *       lw    : stack position ( ``in the top sense'' )
00070  *     Out : 
00071  *       [it,m,n] matrix dimensions 
00072  *       lr : stk(lr+i-1)= real(a(i)) 
00073  *       lc : stk(lc+i-1)= imag(a(i)) exists only if it==1 
00074  *------------------------------------------------------------------- */
00075 
00076 int C2F(getmat)(char *fname,integer *topk,integer *lw,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
00077 {
00078   return C2F(getmati)(fname, topk, lw,Lstk(*lw), it, m, n, lr, lc, &c_false, &cx0, fname_len);
00079 }
00080 
00081 /*------------------------------------------------------------------
00082  * getrmat like getmat but we check for a real matrix 
00083  *------------------------------------------------------------------ */
00084 
00085 int C2F(getrmat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
00086 {
00087   integer lc, it;
00088 
00089   if ( C2F(getmat)(fname, topk, lw, &it, m, n, lr, &lc, fname_len) == FALSE_ )
00090     return FALSE_;
00091 
00092   if (it != 0) {
00093     Scierror(202,"%s: Argument %d: wrong type argument expecting a real matrix\r\n",
00094              get_fname(fname,fname_len), Rhs + (*lw - *topk));
00095     return FALSE_;
00096   }
00097   return TRUE_;
00098 }
00099 /* ------------------------------------------------------------------
00100  * getcmat like getmat but we check for a complex matrix
00101  *------------------------------------------------------------------ */
00102 
00103 int C2F(getcmat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
00104 {
00105   integer lc, it;
00106 
00107   if ( C2F(getmat)(fname, topk, lw, &it, m, n, lr, &lc, fname_len) == FALSE_ )
00108     return FALSE_;
00109 
00110   if (it != 1) {
00111     Scierror(202,"%s: Argument %d: wrong type argument expecting a complex matrix\r\n",
00112            get_fname(fname,fname_len), Rhs + (*lw - *topk));
00113     return FALSE_;
00114   }
00115   return TRUE_;
00116 }
00117 
00118 /*------------------------------------------------------------------ 
00119  * matsize :
00120  *    like getmat but here m,n are given on entry 
00121  *    and we check that matrix is of size (m,n) 
00122  *------------------------------------------------------------------ */
00123 
00124 int C2F(matsize)(char *fname,integer *topk,integer *lw,integer *m,integer *n,unsigned long fname_len)
00125 {
00126   integer m1, n1, lc, it, lr;
00127   
00128   if (  C2F(getmat)(fname, topk, lw, &it, &m1, &n1, &lr, &lc, fname_len)  == FALSE_)
00129     return FALSE_;
00130   if (*m != m1 || *n != n1) {
00131     Scierror(205,"%s: Argument %d: wrong matrix size (%d,%d) expected \r\n",
00132              get_fname(fname,fname_len), Rhs + (*lw - *topk), *m,*n);
00133     return FALSE_;
00134   }
00135   return  TRUE_;
00136 }
00137 
00138 /*------------------------------------------------------------------- 
00139  * For internal use 
00140  *------------------------------------------------------------------- */
00141 
00142 int C2F(getmati)(char *fname,integer *topk,integer *spos,integer *lw,integer *it,integer *m,integer *n,integer *lr,integer *lc,int *inlistx,integer *nel,unsigned long fname_len)
00143 {
00144   integer il;
00145   il = iadr(*lw);
00146   if (*istk(il ) < 0) il = iadr(*istk(il +1));
00147   if (*istk(il ) != 1) {
00148     if (*inlistx) 
00149       Scierror(999,"%s: argument %d >(%d) should be a real or complex matrix\r\n",
00150                get_fname(fname,fname_len), Rhs + (*spos - *topk), *nel);
00151     else 
00152       Scierror(201,"%s: argument %d should be a real or complex matrix\r\n",get_fname(fname,fname_len),
00153                Rhs + (*spos - *topk));
00154     return  FALSE_;
00155   }
00156   *m = *istk(il + 1);
00157   *n = *istk(il + 2);
00158   *it = *istk(il + 3);
00159   *lr = sadr(il+4);
00160   if (*it == 1)  *lc = *lr + *m * *n;
00161   return TRUE_;
00162 } 
00163 
00164 
00165 /*---------------------------------------------------------- 
00166  *  listcremat(top,numero,lw,....) 
00167  *      le numero ieme element de la liste en top doit etre un matrice 
00168  *      stockee a partir de Lstk(lw) 
00169  *      doit mettre a jour les pointeurs de la liste 
00170  *      ainsi que stk(top+1) 
00171  *      si l'element a creer est le dernier 
00172  *      lw est aussi mis a jour 
00173  *---------------------------------------------------------- */
00174 
00175 int C2F(listcremat)(char *fname,integer *lw,integer *numi,integer *stlw,integer *it,integer *m,integer *n,integer *lrs,integer *lcs,unsigned long fname_len)
00176 {
00177   integer ix1,il ;
00178     
00179   if (C2F(cremati)(fname, stlw, it, m, n, lrs, lcs, &c_true, fname_len)==FALSE_)
00180     return FALSE_ ;
00181 
00182   *stlw = *lrs + *m * *n * (*it + 1);
00183   il = iadr(*Lstk(*lw ));
00184   ix1 = il + *istk(il +1) + 3;
00185   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
00186   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
00187   return TRUE_;
00188 } 
00189 
00190 /*---------------------------------------------------------- 
00191  *  cremat :
00192  *   checks that a matrix [it,m,n] can be stored at position  lw 
00193  *   <<pointers>> to real and imaginary part are returned on success
00194  *   In : 
00195  *     lw : position (entier) 
00196  *     it : type 0 ou 1 
00197  *     m, n dimensions 
00198  *   Out : 
00199  *     lr : stk(lr+i-1)= real(a(i)) 
00200  *     lc : stk(lc+i-1)= imag(a(i)) exists only if it==1 
00201  *   Side effect : if matrix creation is possible 
00202  *     [it,m,n] are stored in Scilab stack 
00203  *     and lr and lc are returned 
00204  *     but stk(lr+..) and stk(lc+..) are unchanged 
00205  *---------------------------------------------------------- */
00206 
00207 int C2F(cremat)(char *fname,integer *lw,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
00208 {
00209 
00210   if (*lw + 1 >= Bot) {
00211     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
00212     return FALSE_;
00213   }
00214   if ( C2F(cremati)(fname, Lstk(*lw ), it, m, n, lr, lc, &c_true, fname_len) == FALSE_)
00215     return FALSE_ ;
00216   *Lstk(*lw +1) = *lr + *m * *n * (*it + 1);
00217   return TRUE_;
00218 } 
00219 
00220 /*-------------------------------------------------
00221  * Similar to cremat but we only check for space 
00222  * no data is stored 
00223  *-------------------------------------------------*/
00224 
00225 int C2F(fakecremat)(integer *lw,integer *it,integer *m,integer *n,integer *lr,integer *lc)
00226 {
00227   if (*lw + 1 >= Bot) return FALSE_;
00228   if (C2F(cremati)("cremat", Lstk(*lw ), it, m, n, lr, lc, &c_false, 6L) == FALSE_) 
00229     return FALSE_;
00230   *Lstk(*lw +1) = *lr + *m * *n * (*it + 1);
00231   return TRUE_;
00232 } 
00233 
00234 
00235 /*--------------------------------------------------------- 
00236  * internal function used by cremat and listcremat 
00237  *---------------------------------------------------------- */
00238 int C2F(cremati)(char *fname,integer *stlw,integer *it,integer *m,integer *n,integer *lr,integer *lc,int *flagx,unsigned long fname_len)
00239 {
00240   integer ix1;
00241   integer il;
00242   double size = ((double) *m) * ((double) *n) * ((double) (*it + 1));
00243   il = iadr(*stlw);
00244   ix1 = il + 4;
00245   Err = sadr(ix1) - *Lstk(Bot );
00246   if ( (double) Err > -size ) {
00247     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
00248     return FALSE_;
00249   };
00250   if (*flagx) {
00251     *istk(il ) = 1;
00252     /* if m*n=0 then both dimensions are to be set to zero */
00253     *istk(il + 1) = Min(*m , *m * *n);
00254     *istk(il + 2) = Min(*n ,*m * *n);
00255     *istk(il + 3) = *it;
00256   }
00257   ix1 = il + 4;
00258   *lr = sadr(ix1);
00259   *lc = *lr + *m * *n;
00260   return TRUE_;
00261 } 
00262 
00263 /*--------------------------------------------------------- 
00264 *     same as cremat, but without test ( we are below bot)
00265 *     and adding a call to putid 
00266 *     cree une variable de type matrice 
00267 *     de nom id 
00268 *     en lw : sans verification de place 
00269 *     internal function
00270 *---------------------------------------------------------- */
00271 int C2F(crematvar)(integer *id, integer *lw, integer *it, integer *m, integer *n, double *rtab, double *itab)
00272 {
00273         extern int C2F(unsfdcopy)(integer *, double *, integer *, double *, integer *);
00274         extern int C2F(putid)(integer *, integer *);
00275 
00276         /* Local variables */
00277         integer i__1;
00278         static integer lc, il, lr;
00279         static integer c__1 = 1;
00280 
00281         /* Parameter adjustments */
00282         --itab;
00283         --rtab;
00284         --id;
00285 
00286         /* Function Body */
00287         C2F(putid)(&C2F(vstk).idstk[*lw * 6 - 6], &id[1]);
00288         il = C2F(vstk).lstk[*lw - 1] + C2F(vstk).lstk[*lw - 1] - 1;
00289         ((integer *)&C2F(stack))[il - 1] = 1;
00290         ((integer *)&C2F(stack))[il] = *m;
00291         ((integer *)&C2F(stack))[il + 1] = *n;
00292         ((integer *)&C2F(stack))[il + 2] = *it;
00293         i__1 = il + 4;
00294         lr = i__1 / 2 + 1;
00295         lc = lr + *m * *n;
00296         if (*lw < C2F(vstk).isiz) 
00297         {
00298                 i__1 = il + 4;
00299                 C2F(vstk).lstk[*lw] = i__1 / 2 + 1 + *m * *n * (*it + 1);
00300         }
00301         i__1 = *m * *n;
00302         C2F(unsfdcopy)(&i__1, &rtab[1], &c__1, &C2F(stack).Stk[lr - 1], &c__1);
00303         if (*it == 1) 
00304         {
00305                 i__1 = *m * *n;
00306                 C2F(unsfdcopy)(&i__1, &itab[1], &c__1, &C2F(stack).Stk[lc - 1], &c__1);
00307         }
00308         return 0;
00309 } 
00310 
00311 
00312 /*--------------------------------------------------------- 
00313 *     crebmat without check and call to putid 
00314 *     internal function
00315 *---------------------------------------------------------- */
00316 int C2F(crebmatvar)(integer *id, integer *lw, integer *m, integer *n, integer *val)
00317 {
00318         extern int C2F(icopy)(integer *, integer *, integer *, integer *, integer *);
00319         extern int C2F(putid)(integer *, integer *);
00320 
00321         /* Local variables */
00322         static integer il, lr;
00323         integer i__1;
00324         static integer c__1 = 1;
00325 
00326         /* Parameter adjustments */
00327         --val;
00328         --id;
00329 
00330         C2F(putid)(&C2F(vstk).idstk[*lw * 6 - 6], &id[1]);
00331         il = C2F(vstk).lstk[*lw - 1] + C2F(vstk).lstk[*lw - 1] - 1;
00332         ((integer *)&C2F(stack))[il - 1] = 4;
00333         ((integer *)&C2F(stack))[il] = *m;
00334         ((integer *)&C2F(stack))[il + 1] = *n;
00335         lr = il + 3;
00336         i__1 = il + 3 + *m * *n + 2;
00337         C2F(vstk).lstk[*lw] = i__1 / 2 + 1;
00338         i__1 = *m * *n;
00339         C2F(icopy)(&i__1, &val[1], &c__1, &((integer *)&C2F(stack))[lr - 1], &c__1);
00340         return 0;
00341 } 
00342 /*--------------------------------------------------------- 
00343 *     cresmatvar without check and call to putid 
00344 *     internal function
00345 *---------------------------------------------------------- */
00346 int C2F(cresmatvar)(integer *id, integer *lw, char *str, integer *lstr, unsigned long str_len)
00347 {
00348         extern int C2F(putid)(integer *, integer *);
00349         extern int C2F(cvstr)(integer *, integer *, char *, integer *, unsigned long );
00350 
00351         static integer il, mn, lr1, ix1, ilp;
00352         static integer ilast;
00353         static integer c__0 = 0;
00354 
00355         /* Parameter adjustments */
00356         --id;
00357 
00358         C2F(putid)(&C2F(vstk).idstk[*lw * 6 - 6], &id[1]);
00359         il = C2F(vstk).lstk[*lw - 1] + C2F(vstk).lstk[*lw - 1] - 1;
00360         mn = 1;
00361         ix1 = il + 4 + (*lstr + 1) + (mn + 1);
00362         ((integer *)&C2F(stack))[il - 1] = 10;
00363         ((integer *)&C2F(stack))[il] = 1;
00364         ((integer *)&C2F(stack))[il + 1] = 1;
00365         ((integer *)&C2F(stack))[il + 2] = 0;
00366         ilp = il + 4;
00367         ((integer *)&C2F(stack))[ilp - 1] = 1;
00368         ((integer *)&C2F(stack))[ilp] = ((integer *)&C2F(stack))[ilp - 1] + *lstr;
00369         ilast = ilp + mn;
00370         lr1 = ilast + ((integer *)&C2F(stack))[ilp - 1];
00371         C2F(cvstr)(lstr, &((integer *)&C2F(stack))[lr1 - 1], str, &c__0, str_len);
00372         ix1 = ilast + ((integer *)&C2F(stack))[ilast - 1];
00373         C2F(vstk).lstk[*lw] = ix1 / 2 + 1;
00374         return 0;
00375 }
00376 
00377 /**********************************************************************
00378  * INT MATRICES 
00379  **********************************************************************/
00380 
00381 /* compute requested memory in number of ints */
00382 
00383 #define memused(it,mn) ((((mn)*( it % 10))/sizeof(int))+1)
00384 
00385 
00386 /*------------------------------------------------------------------ 
00387  * getilistmat : 
00388  *    checks that spos object is a list 
00389  *    checks that lnum-element of the list exists and is an int matrix 
00390  *    extracts matrix information(it,m,n,lr) 
00391  *     In  : 
00392  *       fname : name of calling function for error message 
00393  *       topk  : stack ref for error message 
00394  *       lw    : stack position 
00395  *     Out : 
00396  *       [it,m,n] matrix dimensions 
00397  *       it : 1,2,4,11,12,14 
00398  *       lr : istk(lr+i-1)   : matrix data must be properly cast 
00399  *                             according to it value 
00400  *------------------------------------------------------------------ */
00401 
00402 int C2F(getlistimat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *it,integer *m,integer *n,integer *lr,unsigned long fname_len)
00403 {
00404   integer nv, ili;
00405 
00406   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_)
00407     return FALSE_;
00408 
00409   if (*lnum > nv) {
00410     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
00411              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
00412     return FALSE_;
00413   }
00414   return C2F(getimati)(fname, topk, spos, &ili,it, m, n, lr,  &c_true, lnum, fname_len);
00415 } 
00416 
00417 /*------------------------------------------------------------------- 
00418  * getimat :
00419  *     check that object at position lw is an int matrix 
00420  *     In  : 
00421  *       fname : name of calling function for error message 
00422  *       topk  : stack ref for error message 
00423  *       lw    : stack position ( ``in the top sense'' )
00424  *     Out : 
00425  *       [it,m,n] matrix dimensions 
00426  *       lr : istk(lr+i-1)= a(i)
00427  *------------------------------------------------------------------- */
00428 
00429 int C2F(getimat)(char *fname,integer *topk,integer *lw,integer *it,integer *m,integer *n,integer *lr,unsigned long fname_len)
00430 {
00431   return C2F(getimati)(fname, topk, lw,Lstk(*lw),it,m, n, lr,&c_false, &cx0, fname_len);
00432 }
00433 
00434 /*------------------------------------------------------------------- 
00435  * For internal use 
00436  *------------------------------------------------------------------- */
00437 
00438 int C2F(getimati)(char *fname,integer *topk,integer *spos,integer *lw,integer *it,integer *m,integer *n,integer *lr,int *inlistx,integer *nel,unsigned long fname_len)
00439 {
00440   integer il;
00441   il = iadr(*lw);
00442   if (*istk(il ) < 0) il = iadr(*istk(il +1));
00443   if (*istk(il ) != 8 ) {
00444     if (*inlistx) 
00445       Scierror(999,"%s: argument %d >(%d) should be an int matrix\r\n",
00446                get_fname(fname,fname_len), Rhs + (*spos - *topk), *nel);
00447     else 
00448       Scierror(201,"%s: argument %d should be a real or complex matrix\r\n",get_fname(fname,fname_len),
00449                Rhs + (*spos - *topk));
00450     return  FALSE_;
00451   }
00452   *m = *istk(il + 1);
00453   *n = *istk(il + 2);
00454   *it = *istk(il + 3);
00455   *lr = il+4;
00456   return TRUE_;
00457 } 
00458 
00459 
00460 /*---------------------------------------------------------- 
00461  *  listcreimat(top,numero,lw,....) 
00462  *      le numero ieme element de la liste en top doit etre un matrice 
00463  *      stockee a partir de Lstk(lw) 
00464  *      doit mettre a jour les pointeurs de la liste 
00465  *      ainsi que stk(top+1) 
00466  *      si l'element a creer est le dernier 
00467  *      lw est aussi mis a jour 
00468  *---------------------------------------------------------- */
00469 
00470 int C2F(listcreimat)(char *fname,integer *lw,integer *numi,integer *stlw,integer *it,integer *m,integer *n,integer *lrs,unsigned long fname_len)
00471 {
00472   integer ix1,il ;
00473     
00474   if (C2F(creimati)(fname, stlw,it, m, n, lrs, &c_true, fname_len)==FALSE_)
00475     return FALSE_ ;
00476   *stlw = sadr(*lrs + memused(*it,*m * *n));
00477   il = iadr(*Lstk(*lw ));
00478   ix1 = il + *istk(il +1) + 3;
00479   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
00480   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
00481   return TRUE_;
00482 } 
00483 
00484 /*---------------------------------------------------------- 
00485  *  creimat :
00486  *   checks that an int matrix [it,m,n] can be stored at position  lw 
00487  *   <<pointers>> to real and imaginary part are returned on success
00488  *   In : 
00489  *     lw : position (entier) 
00490  *     it : type 1,2,4,11,12,14 
00491  *     m, n dimensions 
00492  *   Out : 
00493  *     lr : istk(lr+i-1)=> a(i)   
00494  *   Side effect : if matrix creation is possible 
00495  *     [it,m,n] are stored in Scilab stack 
00496  *     and lr is returned 
00497  *     but stk(lr+..) are unchanged 
00498  *---------------------------------------------------------- */
00499 
00500 int C2F(creimat)(char *fname,integer *lw,integer *it,integer *m,integer *n,integer *lr,unsigned long fname_len)
00501 {
00502 
00503   if (*lw + 1 >= Bot) {
00504     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
00505     return FALSE_;
00506   }
00507   if ( C2F(creimati)(fname, Lstk(*lw ), it, m, n, lr,&c_true, fname_len) == FALSE_)
00508     return FALSE_ ;
00509   *Lstk(*lw +1) = sadr(*lr + memused(*it,*m * *n));
00510   return TRUE_;
00511 } 
00512 
00513 /*--------------------------------------------------------- 
00514  * internal function used by cremat and listcremat 
00515  *---------------------------------------------------------- */
00516 
00517 int C2F(creimati)(char *fname,integer *stlw,integer *it,integer *m,integer *n,integer *lr,int *flagx,unsigned long fname_len)
00518 {
00519   integer ix1;
00520   integer il;
00521   double size =  memused(*it,((double)*m)*((double) *n));
00522   il = iadr(*stlw);
00523   ix1 = il + 4;
00524   Err = sadr(ix1) - *Lstk(Bot );
00525   if (Err > -size ) {
00526     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
00527     return FALSE_;
00528   };
00529   if (*flagx) {
00530     *istk(il ) = 8;
00531     /* if m*n=0 then both dimensions are to be set to zero */
00532     *istk(il + 1) = Min(*m , *m * *n);
00533     *istk(il + 2) = Min(*n ,*m * *n);
00534     *istk(il + 3) = *it;
00535   }
00536   ix1 = il + 4;
00537   *lr = ix1;
00538   return TRUE_;
00539 } 
00540 
00541 
00542 /**********************************************************************
00543  * BOOLEAN MATRICES 
00544  **********************************************************************/
00545 
00546 /*------------------------------------------------------------------ 
00547  * getlistbmat : 
00548  *    checks that spos object is a list 
00549  *    checks that lnum-element of the list exists and is a boolean matrix 
00550  *    extracts matrix information(m,n,lr) 
00551  *------------------------------------------------------------------ */
00552 
00553 int C2F(getlistbmat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *m,integer *n,integer *lr,unsigned long fname_len)
00554 {
00555   integer nv;
00556   integer ili;
00557 
00558   if (C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len)== FALSE_)
00559     return FALSE_ ;
00560 
00561   if (*lnum > nv) {
00562     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
00563              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
00564     return FALSE_ ;
00565   }
00566   
00567   return C2F(getbmati)(fname, topk, spos, &ili, m, n, lr, &c_true, lnum, fname_len);
00568 } 
00569 
00570 /*------------------------------------------------------------------- 
00571  * getbmat :
00572  *     check that object at position lw is a boolean matrix 
00573  *     In  : 
00574  *       fname : name of calling function for error message 
00575  *       lw    : stack position 
00576  *     Out : 
00577  *       [m,n] matrix dimensions 
00578  *       lr : istk(lr+i-1)= a(i)
00579  *------------------------------------------------------------------- */
00580 
00581 int C2F(getbmat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
00582 {
00583   return C2F(getbmati)(fname, topk, lw, Lstk(*lw ), m, n, lr, &c_false, &cx0, fname_len);
00584 }
00585 
00586 /*------------------------------------------------------------------ 
00587  * matbsize :
00588  *    like getbmat but here m,n are given on entry 
00589  *    and we check that matrix is of size (m,n) 
00590  *------------------------------------------------------------------ */
00591 
00592 int C2F(matbsize)(char *fname,integer *topk,integer *lw,integer *m,integer *n,unsigned long fname_len)
00593 {
00594   integer m1, n1, lr;
00595   if ( C2F(getbmat)(fname, topk, lw, &m1, &n1, &lr, fname_len) == FALSE_)
00596     return FALSE_;
00597   if (*m != m1 || *n != n1) {
00598     Scierror(205,"%s: Argument %d, wrong matrix size (%d,%d) expected\r\n",
00599              get_fname(fname,fname_len),Rhs + (*lw - *topk),*m,*n);
00600     return FALSE_;
00601   }
00602   return TRUE_;
00603 } 
00604 
00605 /*------------------------------------------------------------------- 
00606  * For internal use 
00607  *------------------------------------------------------------------- */
00608 
00609 int C2F(getbmati)(char *fname,integer *topk,integer *spos,integer *lw,integer *m,integer *n,integer *lr,int *inlistx,integer *nel,unsigned long fname_len)
00610 {
00611   integer il;
00612 
00613   il = iadr(*lw);
00614   if (*istk(il ) < 0)    il = iadr(*istk(il +1));
00615 
00616   if (*istk(il ) != 4) {
00617     if (*inlistx) 
00618       Scierror(999,"%s: argument %d >(%d) should be a boolean matrix\r\n",
00619                get_fname(fname,fname_len), Rhs + (*spos - *topk), *nel);
00620     else 
00621       Scierror(208,"%s: argument %d should be a boolean matrix\r\n",get_fname(fname,fname_len),
00622                Rhs + (*spos - *topk));
00623     return FALSE_;
00624   };
00625   *m = *istk(il +1);
00626   *n = *istk(il +2);
00627   *lr = il + 3;
00628   return  TRUE_;
00629 } 
00630 
00631 /*------------------------------------------------== 
00632  *      listcrebmat(top,numero,lw,....) 
00633  *      le numero ieme element de la liste en top doit etre un bmatrice 
00634  *      stockee a partir de Lstk(lw) 
00635  *      doit mettre a jour les pointeurs de la liste 
00636  *      ainsi que stk(top+1) 
00637  *      si l'element a creer est le dernier 
00638  *      lw est aussi mis a jour 
00639  *---------------------------------------------------------- */
00640 
00641 int C2F(listcrebmat)(char *fname,integer *lw,integer *numi,integer *stlw,integer *m,integer *n,integer *lrs,unsigned long fname_len)
00642 {
00643   integer ix1;
00644   integer il;
00645 
00646   if ( C2F(crebmati)(fname, stlw, m, n, lrs, &c_true, fname_len)== FALSE_) 
00647     return FALSE_;
00648 
00649   ix1 = *lrs + *m * *n + 2;
00650   *stlw = sadr(ix1);
00651   il = iadr(*Lstk(*lw ));
00652   ix1 = il + *istk(il +1) + 3;
00653   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
00654   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
00655   return TRUE_;
00656 }
00657 
00658 /*---------------------------------------------------------- 
00659  *  crebmat :
00660  *   checks that a boolean matrix [m,n] can be stored at position  lw 
00661  *   <<pointers>> to data is returned on success
00662  *   In : 
00663  *     lw : position (entier) 
00664  *     m, n dimensions 
00665  *   Out : 
00666  *     lr : istk(lr+i-1)= a(i) 
00667  *   Side effect : if matrix creation is possible 
00668  *     [m,n] are stored in Scilab stack 
00669  *     and lr is  returned 
00670  *     but istk(lr+..) is unchanged 
00671  *---------------------------------------------------------- */
00672 
00673 int C2F(crebmat)(char *fname,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
00674 {
00675   integer ix1;
00676   
00677   if (*lw + 1 >= Bot) {
00678     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
00679     return FALSE_ ;
00680   }
00681 
00682   if ( C2F(crebmati)(fname, Lstk(*lw ), m, n, lr, &c_true, fname_len)== FALSE_)
00683     return FALSE_ ;
00684 
00685   ix1 = *lr + *m * *n + 2;
00686   *Lstk(*lw +1) = sadr(ix1);
00687   return TRUE_;
00688 } 
00689 
00690 /*-------------------------------------------------
00691  * Similar to crebmat but we only check for space 
00692  * no data is stored 
00693  *-------------------------------------------------*/
00694 
00695 int C2F(fakecrebmat)(integer *lw,integer *m,integer *n,integer *lr) 
00696 {
00697   if (*lw + 1 >= Bot) {
00698     Scierror(18,"fakecrebmat: too many names\r\n");
00699     return FALSE_;
00700   }
00701   if ( C2F(crebmati)("crebmat", Lstk(*lw ), m, n, lr, &c_false, 7L)== FALSE_)
00702     return FALSE_ ;
00703   *Lstk(*lw +1) = sadr( *lr + *m * *n + 2);
00704   return TRUE_;
00705 } 
00706 
00707 /*--------------------------------------------------------- 
00708  * internal function used by crebmat and listcrebmat 
00709  *---------------------------------------------------------- */
00710 
00711 int C2F(crebmati)(char *fname,integer *stlw,integer *m,integer *n,integer *lr,int *flagx,unsigned long fname_len)
00712 {
00713   double size = ((double) *m) * ((double) *n) ;
00714   integer il;
00715   il = iadr(*stlw);
00716   Err = il + 3  - iadr(*Lstk(Bot ));
00717   if (Err > -size ) {
00718     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
00719     return FALSE_;
00720   }
00721   if (*flagx) {
00722     *istk(il ) = 4;
00723     /*     si m*n=0 les deux dimensions sont mises a zero. */
00724     *istk(il + 1) = Min(*m , *m * *n);
00725     *istk(il + 2) = Min(*n,*m * *n);
00726   }
00727   *lr = il + 3;
00728   return TRUE_;
00729 }
00730 
00731 /**********************************************************************
00732  * SPARSE MATRICES 
00733  *       [it,m,n,nel,mnel,icol,lr,lc] 
00734  *       nel : number of non nul elements 
00735  *       istk(mnel+i-1), i=1,m : number of non nul elements of row i 
00736  *       non nul elements are stored in row order as follows:
00737  *       istk(icol+j-1) ,j=1,nel, column of the j-th non null element 
00738  *       stk(lr + j-1)  ,j=1,nel, real value of the j-th non null element 
00739  *       stk(lc + j-1)  ,j=1,nel, imag. value of the j-th non null element 
00740  *       lc is to be used only if matrix is complex (it==1)
00741  **********************************************************************/
00742 
00743 /*------------------------------------------------------------------ 
00744  * getlistsparse : 
00745  *    checks that spos object is a list 
00746  *    checks that lnum-element of the list exists and is a sparse matrix 
00747  *    extracts matrix information(it,m,n,nel,mnel,icol,lr,lc) 
00748  *------------------------------------------------------------------ */
00749 
00750 int C2F(getlistsparse)(char *fname,integer *topk,integer *spos,integer *lnum,integer *it,integer *m,integer *n,integer *nel,integer *mnel,integer *icol,integer *lr,integer *lc,unsigned long fname_len)
00751 {
00752   integer  nv;
00753   integer ili;
00754 
00755   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_) 
00756     return FALSE_ ;
00757   
00758   if (*lnum > nv) {
00759     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
00760              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
00761     return FALSE_;
00762   }
00763 
00764   return C2F(getsparsei)(fname, topk, spos, &ili, it, m, n, nel, mnel, icol, lr, lc, &c_true, lnum, fname_len);
00765 
00766 } 
00767 
00768 /*------------------------------------------------------------------- 
00769  * getsparse :
00770  *     check that object at position lw is a sparse matrix 
00771  *     In  : 
00772  *       fname : name of calling function for error message 
00773  *       lw    : stack position 
00774  *     Out : 
00775  *       [it,m,n,nel,mnel,icol,lr,lc] matrix dimensions 
00776  *------------------------------------------------------------------- */
00777 
00778 int C2F(getsparse)(char *fname,integer *topk,integer *lw,integer *it,integer *m,integer *n,integer *nel,integer *mnel,integer *icol,integer *lr,integer *lc,unsigned long fname_len)
00779 {
00780   return C2F(getsparsei)(fname, topk, lw, Lstk(*lw ), it, m, n, nel, mnel, icol, lr, lc, &c_false, &cx0, fname_len);
00781 }
00782 
00783 /*------------------------------------------------------------------- 
00784  * getrsparse : lie getsparse but we check for a real matrix  
00785  *------------------------------------------------------------------- */
00786 
00787 int C2F(getrsparse)(char *fname, integer *topk, integer *lw, integer *m, integer *n,  integer *nel, integer *mnel, integer *icol, integer *lr,unsigned long fname_len)
00788 {
00789   integer lc, it;  
00790   if ( C2F(getsparse)(fname, topk, lw, &it, m, n, nel, mnel, icol, lr, &lc, fname_len) == FALSE_ ) 
00791     return FALSE_;
00792 
00793   if (it != 0) {
00794     Scierror(202,"%s: Argument %d: wrong type argument expecting a real matrix\r\n",
00795              get_fname(fname,fname_len), Rhs + (*lw - *topk));
00796     return FALSE_;
00797   }
00798   return TRUE_;
00799 }
00800 
00801 /*--------------------------------------- 
00802  * internal function for getmat and listgetmat 
00803  *--------------------------------------- */
00804 
00805 int C2F(getsparsei)(char *fname,integer *topk,integer *spos,integer *lw,integer *it,integer *m,integer *n,integer *nel,integer *mnel,integer *icol,integer *lr,integer *lc,int *inlistx,integer *nellist,unsigned long fname_len)
00806 {
00807   integer il;
00808 
00809   il = iadr(*lw);
00810   if (*istk(il ) < 0)   il = iadr(*istk(il +1));
00811 
00812   if (*istk(il ) != 5) {
00813     if (*inlistx) 
00814       Scierror(999,"%s: argument %d >(%d) should be a sparse matrix\r\n",
00815                get_fname(fname,fname_len), Rhs + (*spos - *topk), *nellist);
00816     else 
00817       Scierror(999,"%s: argument %d should be a sparse matrix\r\n",
00818                get_fname(fname,fname_len), Rhs + (*spos - *topk));
00819     return FALSE_;
00820   }
00821   *m   = *istk(il + 1);
00822   *n   = *istk(il + 2);
00823   *it  = *istk(il + 3);
00824   *nel = *istk(il + 4);
00825   *mnel = il + 5;
00826   *icol = il + 5 + *m;
00827   *lr = sadr(il + 5 + *m + *nel);
00828   if (*it == 1)  *lc = *lr + *nel;
00829   return TRUE_;
00830 } 
00831 
00832 /*---------------------------------------------------------- 
00833  *      le numero ieme element de la liste en top doit etre une matrice 
00834  *      sparse stockee a partir de Lstk(lw) 
00835  *      doit mettre a jour les pointeurs de la liste 
00836  *      ainsi que stk(top+1) 
00837  *      si l'element a creer est le dernier 
00838  *      lw est aussi mis a jour 
00839  * 
00840  *---------------------------------------------------------- */
00841 
00842 
00843 int C2F(listcresparse)(char *fname,integer *lw,integer *numi,integer *stlw,integer *it,integer *m,integer *n,integer *nel,integer *mnel,integer *icol,integer *lrs,integer *lcs,unsigned long fname_len)
00844 {
00845   integer ix1,il;
00846 
00847   if (C2F(cresparsei)(fname, stlw, it, m, n, nel, mnel, icol, lrs, lcs, fname_len)== FALSE_) 
00848     return FALSE_ ;
00849 
00850   *stlw = *lrs + *nel * (*it + 1);
00851   il = iadr(*Lstk(*lw ));
00852   ix1 = il + *istk(il +1) + 3;
00853   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
00854   if (*numi == *istk(il +1)) {
00855     *Lstk(*lw +1) = *stlw;
00856   }
00857   return TRUE_;
00858 } 
00859 
00860 /*---------------------------------------------------------- 
00861  *  cresparse :
00862  *   checks that a sparse matrix [it,m,n,nel,mnel,icol] can be stored at position  lw 
00863  *   <<pointers>> to real and imaginary part are returned on success
00864  *   In : 
00865  *     lw : position (entier) 
00866  *     it : type 0 ou 1 
00867  *     m, n,nel  dimensions 
00868  *   Out : 
00869  *     mnel,icol,lr,lc 
00870  *   Side effect : if matrix creation is possible 
00871  *     [it,m,n,nel] are stored in Scilab stack 
00872  *     and mnel,icol,lr and lc are returned 
00873  *     but data is unchanged 
00874  *---------------------------------------------------------- */
00875 
00876 int C2F(cresparse)(char *fname,integer *lw,integer *it,integer *m,integer *n,integer *nel,integer *mnel,integer *icol,integer *lr,integer *lc,unsigned long fname_len)
00877 {
00878   if (*lw + 1 >= Bot) {
00879     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
00880     return FALSE_ ;
00881   }
00882   
00883   if ( C2F(cresparsei)(fname, Lstk(*lw ), it, m, n, nel, mnel, icol, lr, lc, fname_len)
00884        == FALSE_) 
00885     return FALSE_ ;
00886   *Lstk(*lw +1) = *lr + *nel * (*it + 1);
00887   return TRUE_;
00888 } 
00889 
00890 
00891 /*--------------------------------------------------------- 
00892  * internal function used by cremat and listcremat 
00893  *---------------------------------------------------------- */
00894 
00895 int C2F(cresparsei)(char *fname,integer *stlw,integer *it,integer *m,integer *n,integer *nel,integer *mnel,integer *icol,integer *lr,integer *lc,unsigned long fname_len)
00896 {
00897   integer il,ix1;
00898 
00899   il = iadr(*stlw);
00900   ix1 = il + 5 + *m + *nel;
00901   Err = sadr(ix1) + *nel * (*it + 1) - *Lstk(Bot );
00902   if (Err > 0) {
00903     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
00904     return FALSE_;
00905   };
00906   *istk(il ) = 5;
00907   /*   if m*n=0 the 2 dims are set to zero */
00908   if ( *m == 0  ||  *n == 0 )  /* use this new test in place of the product m * n (bruno) */
00909     {
00910       *istk(il + 1) = 0; *istk(il + 2) = 0;
00911     }
00912   else
00913     {
00914       *istk(il + 1) = *m; *istk(il + 2) = *n;
00915     }
00916   *istk(il + 3) = *it;
00917   *istk(il + 4) = *nel;
00918   *mnel = il + 5;
00919   *icol = il + 5 + *m;
00920   ix1 = il + 5 + *m + *nel;
00921   *lr = sadr(ix1);
00922   *lc = *lr + *nel;
00923   return TRUE_;
00924 } 
00925 
00926 /**********************************************************************
00927  * VECTORS  
00928  **********************************************************************/
00929 
00930 /*------------------------------------------------------------------ 
00931  * getlistvect : 
00932  *    checks that spos object is a list 
00933  *    checks that lnum-element of the list exists and is a vector 
00934  *    extracts vector information(it,m,n,lr,lc) 
00935  *------------------------------------------------------------------ */
00936 
00937 int C2F(getlistvect)(char *fname,integer *topk,integer *spos,integer *lnum,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
00938 {
00939   if (C2F(getlistmat)(fname, topk, spos, lnum, it, m, n, lr, lc, fname_len)== FALSE_) 
00940     return FALSE_;
00941 
00942   if (*m != 1 && *n != 1) {
00943     Scierror(999,"%s: argument %d >(%d) should be a vector \r\n",
00944              get_fname(fname,fname_len),Rhs + (*spos - *topk), *lnum);
00945     return  FALSE_;
00946   }
00947   return TRUE_;
00948 } 
00949 
00950 /*------------------------------------------------------------------- 
00951  * getvect :
00952  *     check that object at position lw is a vector 
00953  *     In  : 
00954  *       fname : name of calling function for error message 
00955  *       lw    : stack position 
00956  *     Out : 
00957  *       [it,m,n] matrix dimensions 
00958  *       lr : stk(lr+i-1)= real(a(i)) 
00959  *       lc : stk(lc+i-1)= imag(a(i)) exists only if it==1 
00960  *------------------------------------------------------------------- */
00961 
00962 int C2F(getvect)(char *fname,integer *topk,integer *lw,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
00963 {
00964   if ( C2F(getmat)(fname, topk, lw, it, m, n, lr, lc, fname_len) == FALSE_) 
00965     return FALSE_;
00966 
00967   if (*m != 1 && *n != 1) {
00968     Scierror(214,"%s: Argument %d: wrong type argument expecting a vector\r\n",
00969              get_fname(fname,fname_len), Rhs + (*lw - *topk));
00970     return FALSE_;
00971   };
00972   return  TRUE_;
00973 }
00974 
00975 
00976 /*------------------------------------------------------------------ 
00977  * getrvect : like getvect but we expect a real vector 
00978  *------------------------------------------------------------------ */
00979 
00980 int C2F(getrvect)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
00981 {
00982   if ( C2F(getrmat)(fname, topk, lw, m, n, lr, fname_len)  == FALSE_)
00983     return FALSE_;
00984 
00985   if (*m != 1 && *n != 1) {
00986     Scierror(203,"%s: Argument %d: wrong type argument expecting a real vector\r\n",
00987              get_fname(fname,fname_len), Rhs + (*lw - *topk));
00988     return FALSE_;
00989   }
00990   return TRUE_ ;
00991 }
00992 
00993 /*------------------------------------------------------------------ 
00994  * vectsize :
00995  *    like getvect but here n is given on entry 
00996  *    and we check that vector is of size (n) 
00997  *------------------------------------------------------------------ */
00998 
00999 int C2F(vectsize)(char *fname,integer *topk,integer *lw,integer *n,unsigned long fname_len)
01000 {
01001   integer m1, n1, lc, lr, it1;
01002 
01003   if ( C2F(getvect)(fname, topk, lw, &it1, &m1, &n1, &lr, &lc, fname_len) == FALSE_) 
01004     return FALSE_;
01005 
01006   if (*n != m1 * n1) {
01007     Scierror(206,"%s: Argument %d wrong vector size (%d) expected\r\n",
01008              get_fname(fname,fname_len), Rhs + (*lw - *topk), *n);
01009     return FALSE_;
01010   }
01011   return TRUE_;
01012 } 
01013 
01014 /**********************************************************************
01015  * SCALAR   
01016  **********************************************************************/
01017 
01018 /*------------------------------------------------------------------ 
01019  *     getlistscalar : recupere un scalaire 
01020  *------------------------------------------------------------------ */
01021 
01022 int C2F(getlistscalar)(char *fname,integer *topk,integer *spos,integer *lnum,integer *lr,unsigned long fname_len)
01023 {
01024   integer m, n;
01025   integer lc, it, nv;
01026   integer ili;
01027   
01028   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_)
01029     return FALSE_;
01030 
01031   if (*lnum > nv) {
01032     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
01033              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
01034     return FALSE_;
01035   }
01036   
01037   if ( C2F(getmati)(fname, topk, spos, &ili, &it, &m, &n, lr, &lc, &c_true, lnum, fname_len)
01038        == FALSE_)
01039     return FALSE_;
01040 
01041   if (m * n != 1) {
01042     Scierror(999,"%s: argument %d > (%d) should be a scalar\r\n",
01043              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
01044     return FALSE_;
01045   }
01046   return TRUE_;
01047 }
01048 
01049 /*------------------------------------------------------------------ 
01050  * getscalar :
01051  *     check that object at position lw is a scalar 
01052  *     In  : 
01053  *       fname : name of calling function for error message 
01054  *       lw    : stack position 
01055  *     Out : 
01056  *       lr : stk(lr)= scalar_value 
01057  *------------------------------------------------------------------ */
01058 
01059 int C2F(getscalar)(char *fname,integer *topk,integer *lw,integer *lr,unsigned long fname_len)
01060 {
01061   integer m, n;
01062 
01063   if ( C2F(getrmat)(fname, topk, lw, &m, &n, lr, fname_len) == FALSE_) 
01064     return  FALSE_;
01065 
01066   if (m * n != 1) {
01067     Scierror(204,"%s: Argument %d: wrong wrong type argument expecting a scalar\r\n",
01068              get_fname(fname,fname_len),Rhs + (*lw - *topk));
01069     return FALSE_ ; 
01070   };
01071   return TRUE_;
01072 } 
01073 
01074 /**********************************************************************
01075  * STRING and string Matrices 
01076  **********************************************************************/
01077 
01078 /*------------------------------------------------------------------ 
01079  * getlistsmat : 
01080  *    checks that spos object is a list 
01081  *    checks that lnum-element of the list exists and is a string matrix 
01082  *    extracts string matrix information in m,n and (ix,j)-th string in lr nlr
01083  *     In  : 
01084  *       fname : name of calling function for error message 
01085  *       topk  : stack ref for error message 
01086  *       spos  : stack position 
01087  *       lnum  : element position in the list
01088  *       ix,j  : indices of the requested element 
01089  *     Out : 
01090  *       [m,n] : lnum smatrix dimensions 
01091  *       lr  : istk(lr+i-1) gives string(ix,j) interbal codes 
01092  *       nlr : length of (ix,j)-th string 
01093  *------------------------------------------------------------------ */
01094 
01095 int C2F(getlistsmat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *m,integer *n,integer *ix,integer *j,integer *lr,integer *nlr,unsigned long fname_len)
01096 {
01097   integer nv, ili;
01098 
01099   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_)
01100     return FALSE_;
01101 
01102   if (*lnum > nv) {
01103     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
01104              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
01105     return FALSE_;
01106   }
01107   return C2F(getsmati)(fname, topk, spos, &ili,  m, n, ix,j, lr, nlr, &c_true, lnum, fname_len);
01108 } 
01109 
01110 /*------------------------------------------------------------------- 
01111  * getsmat :
01112  *     check that object at position lw is a string matrix 
01113  *     In  : 
01114  *       fname : name of calling function for error message 
01115  *       lw    : stack position 
01116  *       (ix,j): indices of the string element requested 
01117  *     Out : 
01118  *       [m,n] matrix dimensions 
01119  *       lr  : istk(lr+i-1) gives string(ix,j) internal codes 
01120  *       nlr : length of (ix,j)-th string 
01121  * Note : getsmat can be used to get a(1,1) and check that a is a string matrix 
01122  *        then other elements can be accessed through getsimat 
01123  *------------------------------------------------------------------- */
01124 
01125 int C2F(getsmat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *ix,integer *j,integer *lr,integer *nlr,unsigned long fname_len)
01126 {
01127   return C2F(getsmati)(fname, topk, lw, Lstk(*lw), m, n, ix,j , lr ,nlr,  &c_false, &cx0, fname_len);
01128 }
01129 
01130 /*------------------------------------------------------------------ 
01131  * getsimat :
01132  *     In  : 
01133  *       fname : name of calling function for error message 
01134  *       lw    : stack position 
01135  *       (ix,j): indices of the string element requested 
01136  *     Out : 
01137  *       [m,n] matrix dimensions 
01138  *       lr  : istk(lr+i-1) gives string(ix,j) internal codes 
01139  *       nlr : length of (ix,j)-th string 
01140  * Note : like getsmat but do not check that object is a string matrix 
01141  *------------------------------------------------------------------- */
01142 
01143 int C2F(getsimat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *ix,integer *j,integer *lr,integer *nlr,unsigned long fname_len)
01144 {
01145   return C2F(getsimati)(fname, topk, lw, Lstk(*lw), m, n, ix,j , lr ,nlr,  &c_false, &cx0, fname_len);
01146 }
01147 
01148 /*--------------------------------------------------------------------------
01149  * getlistwsmat : 
01150  *    similar to getlistsmat but returned values are different 
01151  *       ilr  : 
01152  *       ilrd : 
01153  *    ilr and ilrd : internal coded versions of the strings 
01154  *    which can be converted to C with ScilabMStr2CM (see stack2.c)
01155  *------------------------------------------------------------------ */
01156 
01157 int C2F(getlistwsmat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *m,integer *n,integer *ilr,integer *ilrd,unsigned long fname_len)
01158 {
01159   integer nv, ili;
01160 
01161   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_)
01162     return FALSE_;
01163 
01164   if (*lnum > nv) {
01165     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
01166              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
01167     return FALSE_;
01168   }
01169   return C2F(getwsmati)(fname, topk, spos, &ili, m, n, ilr, ilrd, &c_true, lnum, fname_len);
01170 } 
01171 
01172 /*--------------------------------------------------------------------------
01173  * getwsmat : checks for a mxn string matrix 
01174  *    similar to getsmat but returned values are different 
01175  *    ilr and ilrd : internal coded versions of the strings 
01176  *    which can be converted to C with ScilabMStr2CM (see stack2.c)
01177  *--------------------------------------------------------------------------*/
01178 
01179 int C2F(getwsmat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *ilr,integer *ilrd,unsigned long fname_len)
01180 {
01181   return C2F(getwsmati)(fname, topk, lw,Lstk(*lw), m, n, ilr, ilrd, &c_false, &cx0, fname_len);
01182 }
01183 
01184 /*------------------------------------------------------------------- 
01185  * For internal use 
01186  *------------------------------------------------------------------- */
01187 
01188 static int C2F(getwsmati)(char *fname,integer *topk,integer *spos,integer *lw,integer *m,integer *n,integer *ilr,integer *ilrd ,int *inlistx,integer *nel,unsigned long fname_len)
01189 {
01190     integer il;
01191     il = iadr(*lw);
01192     if (*istk(il ) < 0) il = iadr(*istk(il +1));
01193     if (*istk(il ) != 10) {
01194       if (*inlistx)
01195         Scierror(999,"%s: argument %d >(%d) should be a matrix of strings\r\n",
01196                  get_fname(fname,fname_len), Rhs + (*spos - *topk), *nel);
01197       else 
01198         Scierror(207,"%s: Argument %d : wrong type argument, expecting a matrix of strings\r\n",
01199                  get_fname(fname,fname_len), Rhs + (*spos - *topk));
01200       return FALSE_;
01201     }
01202     *m = *istk(il + 1);
01203     *n = *istk(il + 2);
01204     *ilrd = il + 4;
01205     *ilr =  il + 5 + *m * *n;
01206     return TRUE_;
01207 } 
01208 
01209 /*------------------------------------------------------------------- 
01210  * For internal use 
01211  *------------------------------------------------------------------- */
01212 
01213 int C2F(getsmati)(char *fname,integer *topk,integer *spos,integer *lw,integer *m,integer *n,integer *ix,integer *j,integer *lr,integer *nlr,int *inlistx,int *nel,unsigned long fname_len)
01214 {
01215   integer il = iadr(*lw);
01216   if (*istk(il ) < 0) il = iadr(*istk(il +1));
01217   if (*istk(il ) != 10 ) {
01218     if (*inlistx) 
01219       Scierror(999,"%s: argument %d >(%d) should be a  string  matrix\r\n",
01220                get_fname(fname,fname_len), Rhs + (*spos - *topk), *nel);
01221     else 
01222       Scierror(201,"%s: argument %d should be a string matrix\r\n",get_fname(fname,fname_len),
01223                Rhs + (*spos - *topk));
01224     return  FALSE_;
01225   }
01226   C2F(getsimati)(fname, topk, spos, lw, m, n, ix,j , lr ,nlr, inlistx, nel, fname_len);
01227   return TRUE_;
01228 } 
01229 
01230 int C2F(getsimati)(char *fname,integer *topk,integer *spos,integer *lw,integer *m,integer *n,integer *ix,integer *j ,integer *lr ,integer *nlr,int *inlistx,integer *nel,unsigned long fname_len)
01231 {
01232   integer k, il =  iadr(*lw);
01233   if (*istk(il ) < 0) il = iadr(*istk(il +1)); 
01234   *m = *istk(il + 1);
01235   *n = *istk(il + 2);
01236   k = *ix - 1 + (*j - 1) * *m;
01237   *lr = il + 4 + *m * *n + *istk(il + 4 + k );
01238   *nlr = *istk(il + 4 + k +1) - *istk(il + 4 + k );
01239   return 0;
01240 }
01241 
01242 /*---------------------------------------------------------- 
01243  *     listcresmat(top,numero,lw,....) 
01244  *     le  ieme element de la liste en top doit etre une 
01245  *     matrice stockee a partir de Lstk(lw) 
01246  *     doit mettre a jour les pointeurs de la liste 
01247  *     ainsi que Lstk(top+1) si l'element a creer est le dernier 
01248  *     lw est aussi mis a jour 
01249  *     job==1: nchar est la taille de chaque chaine de la  matrice 
01250  *     job==2: nchar est le vecteur des tailles des chaines de la 
01251  *             matrice 
01252  *     job==3: nchar est le vecteur des pointeurs sur les chaines 
01253  *             de la matrice 
01254  *---------------------------------------------------------- */
01255 
01256 int C2F(listcresmat)(char *fname,integer *lw,integer *numi,integer *stlw,integer *m,integer *n,integer *nchar,integer *job,integer *ilrs,unsigned long fname_len)
01257 {
01258   integer ix1;
01259   integer il, sz;
01260 
01261   if ( C2F(cresmati)(fname, stlw, m, n, nchar, job, ilrs, &sz, fname_len) == FALSE_ )
01262     return FALSE_;
01263   ix1 = *ilrs + sz;
01264   *stlw = sadr(ix1);
01265   il = iadr(*Lstk(*lw ));
01266   ix1 = il + *istk(il +1) + 3;
01267   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
01268   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
01269   return TRUE_;
01270 } 
01271 
01272 /*---------------------------------------------------------- 
01273  * cresmat :
01274  *   checks that a string matrix [m,n] of strings 
01275  *   (each string is of length nchar)
01276  *   can be stored at position  lw on the stack 
01277  * Note that each string can be filled with getsimat 
01278  *---------------------------------------------------------- */
01279 
01280 int C2F(cresmat)(char *fname,integer *lw,integer *m,integer *n,integer *nchar,unsigned long fname_len)
01281 {
01282   int job = 1;
01283   integer ix1, ilast, sz,lr ;
01284   if (*lw + 1 >= Bot) {
01285     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01286     return  FALSE_;
01287   }
01288   if ( C2F(cresmati)(fname,Lstk(*lw), m, n, nchar, &job, &lr, &sz, fname_len) == FALSE_ )
01289     return FALSE_ ;
01290   ilast = lr - 1;
01291   ix1 = ilast + *istk(ilast );
01292   *Lstk(*lw +1) = sadr(ix1);
01293   /* empty strings */
01294   if ( *nchar == 0)   *Lstk(*lw +1) += 1;
01295   return TRUE_;
01296 }
01297 
01298 /*------------------------------------------------------------------ 
01299  *  cresmat1 :
01300  *   checks that a string matrix [m,1] of string of length nchar[i]
01301  *   can be stored at position  lw on the stack 
01302  *   nchar : array of length m giving each string length 
01303  *  Note that each string can be filled with getsimat 
01304  *------------------------------------------------------------------ */
01305 
01306 int C2F(cresmat1)(char *fname,integer *lw,integer *m,integer *nchar,unsigned long fname_len)
01307 {
01308   int job = 2, n=1;
01309   integer ix1, ilast, sz,lr ;
01310   if (*lw + 1 >= Bot) {
01311     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01312     return  FALSE_;
01313   }
01314   if ( C2F(cresmati)(fname,Lstk(*lw), m, &n, nchar, &job, &lr, &sz, fname_len) == FALSE_ )
01315     return FALSE_ ;
01316   ilast = lr - 1;
01317   ix1 = ilast + *istk(ilast );
01318   *Lstk(*lw +1) = sadr(ix1);
01319   return TRUE_;
01320 }
01321 
01322 /*------------------------------------------------------------------ 
01323  *  cresmat2 :
01324  *   checks that a string of length nchar can be stored at position  lw 
01325  *  Out : 
01326  *     lr : istk(lr+i) give access to the internal array 
01327  *          allocated for string code 
01328  *------------------------------------------------------------------ */
01329 
01330 int C2F(cresmat2)(char *fname,integer *lw,integer *nchar,integer *lr,unsigned long fname_len)
01331 {
01332   int job = 1, n=1,m=1;
01333   integer ix1, ilast, sz ;
01334   if (*lw + 1 >= Bot) {
01335     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01336     return  FALSE_;
01337   }
01338   if ( C2F(cresmati)(fname,Lstk(*lw), &m, &n, nchar, &job, lr, &sz, fname_len) == FALSE_ )
01339     return FALSE_ ;
01340 
01341   ilast = *lr - 1;
01342   ix1 = ilast + *istk(ilast );
01343   *Lstk(*lw +1) = sadr(ix1);
01344   /* empty strings */
01345   if ( *nchar == 0)   *Lstk(*lw +1) += 1;
01346   *lr = ilast + *istk(ilast - 1);
01347   return TRUE_;
01348 } 
01349 
01350 /*------------------------------------------------------------------ 
01351  * cresmat3 :
01352  *   Try to create a string matrix S of size mxn 
01353  *     - nchar: array of size mxn giving the length of string S(i,j)
01354  *     - buffer : a character array wich contains the concatenation 
01355  *             of all the strings 
01356  *     - lw  : stack position for string creation 
01357  *------------------------------------------------------------------ */
01358 
01359 int C2F(cresmat3)(char *fname,integer *lw,integer *m,integer *n,integer *nchar,char *buffer,unsigned long fname_len,unsigned long buffer_len)
01360 {
01361   int job = 2;
01362   integer ix1, ilast, sz,lr,lr1 ;
01363   if (*lw + 1 >= Bot) {
01364     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01365     return  FALSE_;
01366   }
01367   if ( C2F(cresmati)(fname,Lstk(*lw), m, n, nchar, &job, &lr, &sz, fname_len) == FALSE_ )
01368     return FALSE_ ;
01369   ilast = lr - 1;
01370   ix1 = ilast + *istk(ilast );
01371   *Lstk(*lw +1) = sadr(ix1);
01372 
01373   lr1 = ilast + *istk(ilast - (*m)*(*n) );
01374   C2F(cvstr)(&sz, istk(lr1), buffer, &cx0, buffer_len);
01375   return TRUE_;
01376 } 
01377 
01378 /*------------------------------------------------------------------ 
01379  *     checks that an [m,1] string matrix can be stored in the 
01380  *     stack. 
01381  *     All chains have the same length nchar 
01382  *     istk(lr) --- beginning of chains 
01383  *------------------------------------------------------------------ */
01384 
01385 int C2F(cresmat4)(char *fname,integer *lw,integer *m,integer *nchar,integer *lr,unsigned long fname_len)
01386 {
01387   integer ix1,ix, ilast, il, nnchar, kij, ilp;
01388   if (*lw + 1 >= Bot) {
01389     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01390     return FALSE_;
01391   }
01392   nnchar = 0;
01393   ix1 = *m;
01394   for (ix = 1; ix <= ix1; ++ix) nnchar += *nchar;
01395   il = iadr(*Lstk(*lw ));
01396   ix1 = il + 4 + (nnchar + 1) * *m;
01397   Err = sadr(ix1) - *Lstk(Bot );
01398   if (Err > 0) {
01399     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
01400     return FALSE_;
01401   } 
01402   *istk(il ) = 10;
01403   *istk(il + 1) = *m;
01404   *istk(il + 2) = 1;
01405   *istk(il + 3) = 0;
01406   ilp = il + 4;
01407   *istk(ilp ) = 1;
01408   ix1 = ilp + *m;
01409   for (kij = ilp + 1; kij <= ix1; ++kij) {
01410     *istk(kij ) = *istk(kij - 1) + *nchar;
01411   }
01412   ilast = ilp + *m;
01413   ix1 = ilast + *istk(ilast );
01414   *Lstk(*lw +1) = sadr(ix1);
01415   *lr = ilast + 1;
01416   return TRUE_;
01417 }
01418 
01419 /*--------------------------------------------------------- 
01420  * internal function used by cresmat cresmat1 and listcresmat 
01421  * job : 
01422  *   case 1: all string are of same length (nchar) in the matrix 
01423  *   case 2: nchar is a vector which gives string lengthes 
01424  *   case 3: ? 
01425  *---------------------------------------------------------- */
01426 
01427 int C2F(cresmati)(char *fname,integer *stlw,integer *m,integer *n,integer *nchar,integer *job,integer *lr,integer *sz,unsigned long fname_len)
01428 {
01429   integer ix1, ix, il, kij, ilp, mn= (*m)*(*n);
01430   il = iadr(*stlw);
01431  
01432  /* compute the size of chains */ 
01433   *sz = 0;
01434   switch ( *job ) 
01435     {
01436     case 1 : *sz = mn * nchar[0];   break;
01437     case 2 : for (ix = 0 ; ix < mn ; ++ix) *sz += nchar[ix];  break;
01438     case 3 : *sz = nchar[mn] - 1;  break;
01439     }
01440   /* check the stack for space */
01441   ix1 = il + 4 + mn + 1 + *sz;
01442   Err = sadr(ix1) - *Lstk(Bot );
01443   if (Err > 0) {
01444     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",
01445              get_fname(fname,fname_len));
01446     return FALSE_;
01447   };
01448   
01449   *istk(il ) = 10;
01450   *istk(il + 1) = *m;
01451   *istk(il + 2) = *n;
01452   *istk(il + 3) = 0;
01453   ilp = il + 4;
01454   *istk(ilp ) = 1;
01455   switch ( *job ) 
01456     {
01457     case 1 :
01458       ix1 = mn  + ilp;
01459       for (kij = ilp + 1; kij <= ix1; ++kij) {
01460         *istk(kij) = *istk(kij - 1) + nchar[0];
01461       }
01462       break;
01463     case 2 :
01464       ix = 0;
01465       ix1 = mn + ilp;
01466       for (kij = ilp + 1; kij <= ix1; ++kij) {
01467         *istk(kij ) = *istk(kij - 2 +1) + nchar[ix]; 
01468         ++ix;
01469       }
01470       break;
01471     case 3 :
01472       {
01473         ix1 = mn + 1;
01474         C2F(icopy)(&ix1, nchar, &cx1, istk(ilp ), &cx1);
01475       }
01476     }
01477   *lr = ilp + mn + 1;
01478   return TRUE_;
01479 }
01480 
01481 /*------------------------------------------------------------------ 
01482  * Try to create a string matrix S of size mxn 
01483  *     - m is the number of rows of Matrix S 
01484  *     - n is the number of colums of Matrix S 
01485  *     - Str : a null terminated array of strings char **Str assumed 
01486  *             to contain at least m*n strings 
01487  *     - lw  : where to create the matrix on the stack 
01488  *------------------------------------------------------------------ */
01489 
01490 int cre_smat_from_str_i(char *fname, integer *lw, integer *m, integer *n, char *Str[],unsigned long fname_len, integer *rep)
01491 {
01492   integer ix1, ix, ilast, il, nnchar, lr1, kij, ilp;
01493   integer *pos;
01494 
01495   nnchar = 0;
01496   for (ix = 0 ; ix < (*m)*(*n) ; ++ix) nnchar += strlen(Str[ix]);
01497   
01498   il = iadr(*lw);
01499   ix1 = il + 4 + (nnchar + 1) + (*m * *n + 1);
01500   Err = sadr(ix1) - *Lstk(Bot );
01501   if (Err > 0) {
01502     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",
01503              get_fname(fname,fname_len));
01504     return  FALSE_;
01505   } ;
01506   *istk(il ) = 10;
01507   *istk(il + 1) = *m;
01508   *istk(il + 2) = *n;
01509   *istk(il + 3) = 0;
01510   ilp = il + 4;
01511   *istk(ilp ) = 1;
01512   ix = 0;
01513   ix1 = ilp + *m * *n;
01514   for (kij = ilp + 1; kij <= ix1; ++kij) {
01515     *istk(kij ) = *istk(kij - 1) + strlen(Str[ix]);
01516     ++ix;
01517   }
01518   ilast = ilp + *m * *n;
01519   lr1 = ilast + *istk(ilp );
01520   pos = istk(lr1);
01521   for ( ix = 0 ; ix < (*m)*(*n) ; ix++) 
01522     {
01523       int l = strlen(Str[ix]);
01524       C2F(cvstr)(&l, pos, Str[ix], &cx0, l);
01525       pos += l;
01526     }
01527   ix1 = ilast + *istk(ilast );
01528   *rep = sadr(ix1);
01529   return TRUE_;
01530 } 
01531 
01532 
01533 int cre_smat_from_str(char *fname,integer *lw,integer *m,integer *n,char *Str[],unsigned long fname_len)
01534 {
01535   int rep;
01536   
01537   if (*lw + 1 >= Bot) {
01538     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01539     return FALSE_;
01540   }
01541 
01542   if ( cre_smat_from_str_i(fname, Lstk(*lw ), m, n, Str, fname_len,&rep)== FALSE_ )
01543     return FALSE_;
01544   *Lstk(*lw+1) = rep;
01545   return TRUE_;
01546 } 
01547 
01548 
01549 int cre_listsmat_from_str(char *fname,integer *lw,integer *numi,integer *stlw,integer *m,integer *n,char *Str[],unsigned long fname_len )
01550 {
01551   int rep,ix1,il;
01552   if ( cre_smat_from_str_i(fname, stlw, m, n, Str, fname_len,&rep)== FALSE_ )
01553     return FALSE_;
01554   *stlw = rep;
01555   il = iadr(*Lstk(*lw ));
01556   ix1 = il + *istk(il +1) + 3;
01557   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
01558   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
01559   return TRUE_;
01560 } 
01561 
01562 
01563 /*------------------------------------------------------------------ 
01564  * Try to create a sparse matrix S of size mxn 
01565  *     - m is the number of rows of Matrix S 
01566  *     - n is the number of colums of Matrix S 
01567  *     - Str : a null terminated array of strings char **Str assumed 
01568  *             to contain at least m*n strings 
01569  *     - lw  : where to create the matrix on the stack 
01570  *------------------------------------------------------------------ */
01571 
01572 int cre_sparse_from_ptr_i(char *fname, integer *lw, integer *m, integer *n, SciSparse *S, unsigned long fname_len,  integer *rep)
01573 {
01574   double size = (double) ( (S->nel)*(S->it + 1) );
01575 
01576   integer ix1,  il, lr, lc;
01577   integer cx1l=1;
01578   il = iadr(*lw);
01579 
01580   ix1 = il + 5 + *m + S->nel;
01581   Err = sadr(ix1)  - *Lstk(Bot );
01582   if (Err > -size ) {
01583     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",
01584              get_fname(fname,fname_len));
01585     return  FALSE_;
01586   } ;
01587   *istk(il ) = 5;
01588   /* note: code sligtly modified (remark of C. Deroulers in the newsgroup) */
01589   if ( (*m == 0)  |  (*n == 0) ) {
01590       *istk(il + 1) = 0; 
01591       *istk(il + 2) = 0;
01592   } else {
01593     *istk(il + 1) = *m; 
01594     *istk(il + 2) = *n;
01595   }
01596   /* end of the modified code */
01597   *istk(il + 3) = S->it;
01598   *istk(il + 4) = S->nel;
01599   C2F(icopy)(&S->m, S->mnel, &cx1l, istk(il+5 ), &cx1l);
01600   C2F(icopy)(&S->nel, S->icol, &cx1l, istk(il+5+*m ), &cx1l);
01601   ix1 = il + 5 + *m + S->nel;
01602   lr = sadr(ix1);
01603   lc = lr + S->nel;
01604   C2F(dcopy)(&S->nel, S->R, &cx1l, stk(lr), &cx1l);
01605   if ( S->it == 1) 
01606     C2F(dcopy)(&S->nel, S->I, &cx1l, stk(lc), &cx1l);
01607   *rep = lr + S->nel*(S->it+1);
01608   return TRUE_;
01609 } 
01610 
01611 
01612 int cre_sparse_from_ptr(char *fname,integer *lw,integer *m,integer *n,SciSparse *Str,unsigned long fname_len )
01613 {
01614   int rep;
01615   if (*lw + 1 >= Bot) {
01616     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01617     return FALSE_;
01618   }
01619 
01620   if ( cre_sparse_from_ptr_i(fname, Lstk(*lw ), m, n, Str, fname_len,&rep)== FALSE_ )
01621     return FALSE_;
01622   *Lstk(*lw+1) = rep;
01623   return TRUE_;
01624 } 
01625 
01626 
01627 int cre_listsparse_from_ptr(char *fname,integer *lw,integer *numi,integer *stlw,integer *m,integer *n,SciSparse *Str,unsigned long fname_len )
01628 {
01629   int rep,ix1,il;
01630   if ( cre_sparse_from_ptr_i(fname, stlw, m, n, Str, fname_len,&rep)== FALSE_ )
01631     return FALSE_;
01632   *stlw = rep;
01633   il = iadr(*Lstk(*lw ));
01634   ix1 = il + *istk(il +1) + 3;
01635   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
01636   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
01637   return TRUE_;
01638 } 
01639 
01640 
01641 
01642 /*------------------------------------------------------------------ 
01643  * TODO : add comments
01644  * listcrestring 
01645  *------------------------------------------------------------------ */
01646 
01647 int C2F(listcrestring)(char *fname,integer *lw,integer *numi,integer *stlw,integer *nch,integer *ilrs,unsigned long fname_len)
01648 {
01649   integer ix1, il ;
01650 
01651   if ( C2F(crestringi)(fname, stlw, nch, ilrs, fname_len) == FALSE_ )
01652     return FALSE_;
01653 
01654   ix1 = *ilrs - 1 + *istk(*ilrs - 2 +1);
01655   *stlw = sadr(ix1);
01656   il = iadr(*Lstk(*lw ));
01657   ix1 = il + *istk(il +1) + 3;
01658   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
01659   if (*numi == *istk(il +1)) {
01660     *Lstk(*lw +1) = *stlw;
01661   }
01662   return TRUE_;
01663 }
01664 
01665 /*------------------------------------------------------------------ 
01666 *     verifie que l'on peut stocker une matrice [1,1] 
01667 *     de chaine de caracteres a la position spos du stack 
01668 *     en renvoyant .true. ou .false.  suivant la reponse. 
01669 *     nchar est le nombre de caracteres que l'on veut stocker 
01670 *     Entree : 
01671 *       spos : position (entier) 
01672 *     Sortie : 
01673 *       ilrs 
01674 *------------------------------------------------------------------ */
01675 
01676 int C2F(crestring)(char *fname,integer *spos,integer *nchar,integer *ilrs,unsigned long fname_len)
01677 {
01678   integer ix1;
01679   if ( C2F(crestringi)(fname, Lstk(*spos ), nchar, ilrs, fname_len) == FALSE_) 
01680     return FALSE_;
01681   ix1 = *ilrs + *nchar;
01682   *Lstk(*spos +1) = sadr(ix1);
01683   /* empty strings */
01684   if ( *nchar == 0)   *Lstk(*spos +1) += 1;
01685   return TRUE_;
01686 }
01687 
01688 /*------------------------------------------------------------------ 
01689  *     verifie que l'on peut stocker une matrice [1,1] 
01690  *     de chaine de caracteres  a la position stlw en renvoyant .true. ou .false. 
01691  *     suivant la reponse. 
01692  *     nchar est le nombre de caracteres que l'on veut stcoker 
01693  *     Entree : 
01694  *       stlw : position (entier) 
01695  *     Sortie : 
01696  *       nchar : nombre de caracteres stockable 
01697  *       lr : pointe sur  a(1,1)=istk(lr) 
01698  *------------------------------------------------------------------ */
01699 
01700 int C2F(crestringi)(char *fname,integer *stlw,integer *nchar,integer *ilrs,unsigned long fname_len)
01701 {
01702 
01703   integer ix1, ilast, il;
01704 
01705   il = iadr(*stlw);
01706   ix1 = il + 4 + (*nchar + 1);
01707   Err = sadr(ix1) - *Lstk(Bot );
01708   if (Err > 0) {
01709     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",
01710              get_fname(fname,fname_len));
01711     return FALSE_;
01712   } ;
01713   *istk(il ) = 10;
01714   *istk(il +1) = 1;
01715   *istk(il + 1 +1) = 1;
01716   *istk(il + 2 +1) = 0;
01717   *istk(il + 3 +1) = 1;
01718   *istk(il + 4 +1) = *istk(il + 3 +1) + *nchar;
01719   ilast = il + 5;
01720   *ilrs = ilast + *istk(ilast - 2 +1);
01721   return TRUE_;
01722 }
01723 
01724 
01725 /*---------------------------------------------------------------------
01726  *  checks if we can store a string of size nchar at position lw 
01727  *---------------------------------------------------------------------*/
01728 
01729 int C2F(fakecresmat2)(integer *lw,integer *nchar,integer *lr)
01730 {
01731   static integer cx17 = 17;
01732   int retval;
01733   static integer ilast;
01734   static integer il;
01735   il = iadr((*Lstk(*lw)));
01736   Err = sadr(il + 4 + (*nchar + 1)) - *Lstk(Bot);
01737   if (Err > 0) {
01738     C2F(error)(&cx17);
01739     retval = FALSE_;
01740   } else {
01741     ilast = il + 5;
01742     *Lstk(*lw+1) = sadr(ilast + *istk(ilast));
01743     *lr = ilast + *istk(ilast - 1);
01744     retval = TRUE_;
01745   }
01746   return retval;
01747 }
01748 
01749 /*------------------------------------------------------------------ 
01750  *     verifie qu'il y a une matrice de chaine de caracteres en lw-1 
01751  *     et verifie que l'on peut stocker l'extraction de la jieme colonne 
01752  *     en lw : si oui l'extraction est faite 
01753  *     Entree : 
01754  *       lw : position (entier) 
01755  *       j  : colonne a extraire 
01756  *------------------------------------------------------------------ */
01757 
01758 int C2F(smatj)(char *fname,integer *lw,integer *j,unsigned long fname_len)
01759 {
01760   integer ix1, ix2;
01761   integer incj;
01762   integer ix, m, n;
01763   integer lj, nj, lr, il1, il2, nlj;
01764   integer il1j, il2p;
01765 
01766   if (*lw + 1 >= Bot) {
01767     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01768     return FALSE_;
01769   }
01770   ix1 = *lw - 1;
01771   ix2 = *lw - 1;
01772   
01773   if (! C2F(getsmat)(fname, &ix1, &ix2, &m, &n, &cx1, &cx1, &lr, &nlj, fname_len)) 
01774     return FALSE_;
01775   if (*j > n) return FALSE_;
01776   
01777   il1 = iadr(*Lstk(*lw - 2 +1));
01778   il2 = iadr(*Lstk(*lw ));
01779   /*     nombre de caracteres de la jieme colonne */
01780   incj = (*j - 1) * m;
01781   nj = *istk(il1 + 4 + incj + m ) - *istk(il1 + 4 + incj );
01782   /*     test de place */
01783   ix1 = il2 + 4 + m + nj + 1;
01784   Err = sadr(ix1) - *Lstk(Bot );
01785   if (Err > 0) {
01786     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
01787     return FALSE_;
01788   }
01789   *istk(il2 ) = 10;
01790   *istk(il2 +1) = m;
01791   *istk(il2 + 1 +1) = 1;
01792   *istk(il2 + 2 +1) = 0;
01793   il2p = il2 + 4;
01794   il1j = il1 + 4 + incj;
01795   *istk(il2p ) = 1;
01796   ix1 = m;
01797   for (ix = 1; ix <= ix1; ++ix) {
01798     *istk(il2p + ix ) = *istk(il2p - 1 + ix ) + *istk(il1j + ix ) - *istk(il1j + ix - 2 +1);
01799   }
01800   lj = *istk(il1 + 4 + incj ) + il1 + 4 + m * n;
01801   C2F(icopy)(&nj, istk(lj ), &cx1, istk(il2 + 4 + m +1), &cx1);
01802   ix1 = il2 + 4 + m + nj + 1;
01803   *Lstk(*lw +1) = sadr(ix1);
01804   return TRUE_;
01805 } 
01806 
01807 
01808 /*------------------------------------------------------------------ 
01809  *     copie la matrice de chaine de caracteres stockee en flw 
01810  *     en tlw, les verifications de dimensions 
01811  *     ne sont pas faites 
01812  *     Lstk(tlw+1) est modifie si necessaire 
01813  *------------------------------------------------------------------ */
01814 
01815 int C2F(copysmat)(char *fname,integer *flw,integer *tlw,unsigned long fname_len)
01816 {
01817   integer ix1;
01818   integer dflw, fflw;
01819   integer dtlw;
01820   dflw = iadr(*Lstk(*flw ));
01821   fflw = iadr(*Lstk(*flw +1));
01822   dtlw = iadr(*Lstk(*tlw ));
01823   ix1 = fflw - dflw;
01824   C2F(icopy)(&ix1, istk(dflw ), &cx1, istk(dtlw ), &cx1);
01825   *Lstk(*tlw +1) = *Lstk(*tlw ) + *Lstk(*flw +1) - *Lstk(*flw );
01826   return 0;
01827 }
01828 
01829 /*------------------------------------------------------------------ 
01830  *     lw designe une matrice de chaine de caracteres 
01831  *     on veut changer la taille de la chaine (i,j) 
01832  *     et lui donner la valeur nlr 
01833  *     cette routine si (i,j) != (m,n) fixe 
01834  *     le pointeur de l'argument i+j*m +1 
01835  *     sans changer les valeurs de la matrice 
01836  *     si (i,j)=(m,n) fixe juste la longeur de la chaine 
01837  *     Entree : 
01838  *       fname : nom de la routine appellante pour le message 
01839  *       d'erreur 
01840  *       lw : position dans la pile 
01841  *       i,j : indice considere 
01842  *       m,n : taille de la matrice 
01843  *       lr  : 
01844  *------------------------------------------------------------------ */
01845 
01846 int C2F(setsimat)(char *fname,integer *lw,integer *ix,integer *j,integer *nlr,unsigned long fname_len)
01847 {
01848   integer k, m, il;
01849   il = iadr(*Lstk(*lw ));
01850   m = *istk(il +1);
01851   k = *ix - 1 + (*j - 1) * m;
01852   *istk(il + 4 + k +1) = *istk(il + 4 + k ) + *nlr;
01853   return 0;
01854 }
01855 
01856 /**********************************************************************
01857  * LISTS
01858  **********************************************************************/
01859 
01860 /*------------------------------------------------------------------- 
01861  * crelist :creation of a list with ilen elements at slw position 
01862  * cretlist:creation of a tlist with ilen elements at slw position 
01863  * cremlist:creation of an mlist with ilen elements at slw position 
01864  *    In : slw and ilen 
01865  *    Out : lw 
01866  *     first element can be stored at postion stk(lw) 
01867  * Note : elements are to be added to close the list creation 
01868  *------------------------------------------------------------------- */
01869 
01870 int crelist_G(integer *slw,integer *ilen,integer *lw,integer type)
01871 {
01872   integer ix1;
01873   integer il;
01874   il = iadr(*Lstk(*slw ));
01875   *istk(il ) = type;
01876   *istk(il + 1) = *ilen;
01877   *istk(il + 2) = 1;
01878   ix1 = il + *ilen + 3;
01879   *lw = sadr(ix1);
01880   if (*ilen == 0) *Lstk(*lw +1) = *lw;
01881   return 0;
01882 } 
01883 
01884 
01885 int C2F(crelist)(integer *slw,integer *ilen,integer *lw)
01886 {
01887   return crelist_G(slw,ilen,lw,15);
01888 } 
01889 
01890 int C2F(cretlist)(integer *slw,integer *ilen,integer *lw)
01891 {
01892   return crelist_G(slw,ilen,lw,16);
01893 } 
01894 
01895 int C2F(cremlist)(integer *slw,integer *ilen,integer *lw)
01896 {
01897   return crelist_G(slw,ilen,lw,17);
01898 } 
01899 
01900 
01901 /*------------------------------------------------------------------ 
01902  * lmatj : 
01903  *   checks that there's a list at position  lw-1 
01904  *   checks that the j-th element can be extracted at lw position 
01905  *   perform the extraction 
01906  *       lw : position 
01907  *       j  : element to be extracted 
01908  *------------------------------------------------------------------ */
01909 
01910 int C2F(lmatj)(char *fname,integer *lw,integer *j,unsigned long fname_len)
01911 {
01912   integer ix1, ix2;
01913   integer n;
01914   integer il, ilj, slj;
01915   if (*lw + 1 >= Bot) {
01916     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
01917     return FALSE_;
01918   }
01919   ix1 = *lw - 1;
01920   ix2 = *lw - 1;
01921   if (! C2F(getilist)(fname, &ix1, &ix2, &n, j, &ilj, fname_len)) 
01922     return FALSE_;
01923   if (*j > n)       return FALSE_;
01924   /*     a ameliorer */
01925   il = iadr(*Lstk(*lw - 2 +1));
01926   ix1 = il + 3 + n;
01927   slj = sadr(ix1) + *istk(il + 2 + (*j - 1) ) - 1;
01928   n = *istk(il + 2 + *j ) - *istk(il + 2 + (*j - 1) );
01929   Err = *Lstk(*lw ) + n - *Lstk(Bot );
01930   if (Err > 0) return FALSE_;
01931   C2F(dcopy)(&n, stk(slj ), &cx1, stk(*Lstk(*lw ) ), &cx1);
01932   *Lstk(*lw +1) = *Lstk(*lw ) + n;
01933   return TRUE_;
01934 } 
01935 
01936 /*------------------------------------------------
01937  *     renvoit .true. si l'argument en lw est une liste 
01938  *     Entree : 
01939  *      fname : nom de la routine appellante pour le message 
01940  *          d'erreur 
01941  *      lw : position ds la pile 
01942  *      i  : element demande 
01943  *     Sortie : 
01944  *      n  : nombre d'elements ds la liste 
01945  *      ili : le ieme element commence en istk(iadr(ili)) 
01946  *     ==> pour recuperer un argument il suffit 
01947  *     de faire un lk=Lstk(top);Lstk(top)=ili; getmat(...,top,...);stk(top)=lk 
01948  *------------------------------------------------*/
01949 
01950 int C2F(getilist)(char *fname,integer *topk,integer *lw,integer *n,integer *ix,integer *ili,unsigned long fname_len)
01951 {
01952   integer ix1;
01953   integer itype, il;
01954 
01955   il = iadr(*Lstk(*lw ));
01956   if (*istk(il ) < 0) {
01957     il = iadr(*istk(il +1));
01958   }
01959 
01960   itype = *istk(il );
01961   if (itype < 15 || itype > 17) {
01962     Scierror(210,"%s: Argument %d: wrong type argument, expecting a list\r\n",
01963              get_fname(fname,fname_len) , Rhs + (*lw - *topk));
01964     return FALSE_;
01965   }
01966   *n = *istk(il +1);
01967   if (*ix <= *n) {
01968     ix1 = il + 3 + *n;
01969     *ili = sadr(ix1) + *istk(il + 2 + (*ix - 1) ) - 1;
01970   } else {
01971     *ili = 0;
01972   }
01973   return TRUE_;
01974 } 
01975 
01976 /**********************************************************************
01977  * POLYNOMS 
01978  **********************************************************************/
01979 
01980 /*------------------------------------------------
01981 *     renvoit .true. si l'argument en lw est une matrice de polynome 
01982 *             sinon appelle error et renvoit .false. 
01983 *     Entree : 
01984 *       fname : nom de la routine appellante pour le message 
01985 *       d'erreur 
01986 *       lw    : position ds la pile 
01987 *     Sortie 
01988 *       [it,m,n] caracteristiques de la matrice 
01989 *       name : nom de la variable muette ( character*4) 
01990 *       namel : taille de name <=4 ( uncounting trailling blanks) 
01991 *       soit lij=istk(ilp+(i-1)+(j-1)*m) 
01992 *       alors le degre zero de l'elements (i,j) est en 
01993 *       stk(lr+lij) (partie reelle ) et stk(lc+lij) (imag) 
01994 *       le degre de l'elt (i,j)= l(i+1)j - lij -1 
01995 *      implicit undefined (a-z) 
01996 *------------------------------------------------*/
01997 
01998 int C2F(getpoly)(char *fname,integer *topk,integer *lw,integer *it,integer *m,integer *n,char *namex,integer *namel,integer *ilp,integer *lr,integer *lc,unsigned long fname_len,unsigned long name_len)
01999 {
02000   integer ix1;
02001 
02002   integer il;
02003   il = iadr(*Lstk(*lw ));
02004   if (*istk(il ) != 2) {
02005     Scierror(212,"%s: Argument %d: wrong type argument, expecting a polynomial matrix\r\n",
02006              get_fname(fname,fname_len), Rhs + (*lw - *topk));
02007     return FALSE_;
02008   } ;
02009   *m = *istk(il +1);
02010   *n = *istk(il +2);
02011   *it = *istk(il + 3);
02012   *namel = 4;
02013   C2F(cvstr)(namel, istk(il + 4), namex, &cx1, 4L);
02014  L11:
02015   if (*namel > 0) {
02016     if ( namex[*namel - 1] == ' ') {
02017       --(*namel);
02018       goto L11;
02019     }
02020   }
02021   *ilp = il + 8;
02022   ix1 = *ilp + *m * *n + 1;
02023   *lr = sadr(ix1) - 1;
02024   *lc = *lr + *istk(*ilp + *m * *n ) - 1;
02025   return  TRUE_;
02026 
02027 } 
02028 
02029 
02030 /*------------------------------------------------------------------ 
02031 *     recupere un polynome 
02032 *     md est son degre et son premier element est en 
02033 *     stk(lr),stk(lc) 
02034 *     Finir les tests 
02035 *------------------------------------------------------------------ */
02036 
02037 int C2F(getonepoly)(char *fname,integer *topk,integer *lw,integer *it,integer *md,char *namex,integer *namel,integer *lr,integer *lc, unsigned long fname_len, unsigned long name_len)
02038 {
02039   integer m, n;
02040   integer ilp;
02041 
02042   if (C2F(getpoly)(fname, topk, lw, it, &m, &n, namex, namel, &ilp, lr, lc, fname_len, 4L)
02043       == FALSE_)
02044     return FALSE_;
02045 
02046   if (m * n != 1) {
02047     Scierror(998,"%s: argument should be a polygon\r\n",
02048              get_fname(fname,fname_len));
02049     return FALSE_;
02050   }
02051   *md = *istk(ilp +1) - *istk(ilp ) - 1;
02052   *lr += *istk(ilp );
02053   *lc += *istk(ilp );
02054   return TRUE_;
02055 } 
02056 
02057 /*------------------------------------------------------------------ 
02058  * pmatj : 
02059  *   checks that there's a polynomial matrix  at position  lw-1 
02060  *   checks that the j-th column  can be extracted at lw position 
02061  *   perform the extraction 
02062  *       lw : position 
02063  *       j  : column  to be extracted 
02064  *------------------------------------------------------------------ */
02065 
02066 int C2F(pmatj)(char *fname,integer *lw,integer *j,unsigned long fname_len)
02067 {
02068   integer ix1, ix2;
02069   char namex[4];
02070   integer incj;
02071   integer ix, l, m, n, namel;
02072   integer l2, m2, n2, lc, il, lj, it, lr, il2, ilp;
02073 
02074   if (*lw + 1 >= Bot) {
02075     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
02076     return FALSE_;
02077   }
02078   ix1 = *lw - 1;
02079   ix2 = *lw - 1;
02080   if (! C2F(getpoly)(fname, &ix1, &ix2, &it, &m, &n, namex, &namel, &ilp, &lr, &lc, fname_len, 4L)) {
02081     return FALSE_;
02082   }
02083   if (*j > n)     return FALSE_;
02084 
02085   /*     a ameliorer */
02086   il = iadr(*Lstk(*lw - 2 +1));
02087   incj = (*j - 1) * m;
02088   il2 = iadr(*Lstk(*lw ));
02089   ix1 = il2 + 4;
02090   l2 = sadr(ix1);
02091   m2 = Max(m,1);
02092   ix1 = il + 9 + m * n;
02093   l = sadr(ix1);
02094   n = *istk(il + 8 + m * n );
02095   ix1 = il2 + 9 + m2;
02096   l2 = sadr(ix1);
02097   n2 = *istk(il + 8 + incj + m ) - *istk(il + 8 + incj );
02098   Err = l2 + n2 * (it + 1) - *Lstk(Bot );
02099   if (Err > 0) {
02100     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
02101     return FALSE_;
02102   }
02103   C2F(icopy)(&cx4, istk(il + 3 +1), &cx1, istk(il2 + 3 +1), &cx1);
02104   il2 += 8;
02105   il = il + 8 + incj;
02106   lj = l - 1 + *istk(il );
02107   *istk(il2 ) = 1;
02108   ix1 = m2;
02109   for (ix = 1; ix <= ix1; ++ix) {
02110     *istk(il2 + ix ) = *istk(il2 - 1 + ix ) + *istk(il + ix ) - *istk(il - 1 + ix );
02111   }
02112   C2F(dcopy)(&n2, stk(lj ), &cx1, stk(l2 ), &cx1);
02113   if (it == 1) {
02114     C2F(dcopy)(&n2, stk(lj + n ), &cx1, stk(l2 + n2 ), &cx1);
02115   }
02116   *Lstk(Top +1) = l2 + n2 * (it + 1);
02117   il2 += -8;
02118   *istk(il2 ) = 2;
02119   *istk(il2 +1) = m2;
02120   *istk(il2 + 1 +1) = 1;
02121   *istk(il2 + 2 +1) = it;
02122   return TRUE_;
02123 }
02124 
02125 /**********************************************************************
02126  * WORKING ARRAYS 
02127  **********************************************************************/
02128 
02129 /*------------------------------------------------------------------ 
02130  * crewmat : uses the rest of the stack as a working area (double)
02131  *    In : 
02132  *       lw : position (entier) 
02133  *    Out: 
02134  *       m  : size that can be used 
02135  *       lr : stk(lr+i) is the working area 
02136  *------------------------------------------------------------------ */
02137 
02138 int C2F(crewmat)(char *fname,integer *lw,integer *m,integer *lr,unsigned long fname_len)
02139 {
02140   integer il,ix1; 
02141   if (*lw + 1 >= Bot) {
02142     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
02143     return FALSE_;
02144   }
02145   il = iadr(*Lstk(*lw ));
02146   *m = *Lstk(Bot ) - sadr(il+4);
02147   *istk(il ) = 1;
02148   *istk(il + 1) = 1;
02149   *istk(il + 2) = *m;
02150   *istk(il + 3) = 0;
02151   ix1 = il + 4;
02152   *lr = sadr(il+4);
02153   *Lstk(*lw +1) = sadr(il+4) + *m;
02154   return TRUE_;
02155 }
02156 
02157 /*------------------------------------------------------------------ 
02158  * crewimat : uses the rest of the stack as a working area (int)
02159  *    In : 
02160  *       lw : position (entier) 
02161  *    Out: 
02162  *       m  : size that can be used 
02163  *       lr : istk(lr+i) is the working area 
02164  *------------------------------------------------------------------ */
02165 
02166 int C2F(crewimat)(char *fname,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
02167 {
02168   double size = ((double) *m) * ((double) *n ); 
02169   integer ix1,il;
02170   if (*lw + 1 >= Bot) {
02171     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
02172     return FALSE_;
02173   }
02174   il = iadr(*Lstk(*lw ));
02175   Err = il + 3  - iadr(*Lstk(Bot ));
02176   if (Err > -size ) {
02177     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",
02178              get_fname(fname,fname_len));
02179     return FALSE_;
02180   }
02181   *istk(il ) = 4;
02182   *istk(il + 1) = *m;
02183   *istk(il + 2) = *n;
02184   *lr = il + 3;
02185   ix1 = il + 3 + *m * *n + 2;
02186   *Lstk(*lw +1) = sadr(ix1);
02187   return TRUE_;
02188 }
02189 
02190 /*------------------------------------------------
02191  * getwimat : used to get information about 
02192  *     a working area set by crewimat 
02193  *     In : 
02194  *       fname, topk, lw 
02195  *     Out : 
02196  *       m, n :  dimensions 
02197  *       lr : working area is istk(lr+i) i=0,m*n-1
02198  *------------------------------------------------ */
02199 
02200 int C2F(getwimat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
02201 {
02202   integer il;
02203   il = iadr(*Lstk(*lw ));
02204   if (*istk(il ) < 0) {
02205     il = iadr(*istk(il +1));
02206   }
02207   if (*istk(il ) != 4) {
02208     Scierror(213,"%s: Argument %d: wrong type argument, expecting a working\r\n\tinteger matrix\r\n",
02209              get_fname(fname,fname_len),Rhs + (*lw - *topk));
02210     return FALSE_;
02211   };
02212   *m = *istk(il + 1);
02213   *n = *istk(il + 2);
02214   *lr = il + 3;
02215   return TRUE_;
02216 } 
02217 
02218 /*------------------------------------------------------------------ 
02219  *     creation of an object of type pointer at spos position on the stack 
02220  *     the pointer points to an object of type char matrix created by 
02221  *     the c routine stringc and is filled with a scilab stringmat 
02222  *     which was stored at istk(ilorig) 
02223  *     stk(lw) is used to transmit the pointer 
02224  *     F: transforme une stringmat scilab en un objet de type 
02225  *     pointeur qui pointe vers une traduction en C de la stringMat 
02226  *------------------------------------------------------------------- */
02227 
02228 int C2F(crestringv)(char *fname,integer *spos,integer *ilorig,integer *lw,unsigned long fname_len)
02229 {
02230   integer ierr;
02231   if (C2F(crepointer)(fname, spos, lw, fname_len) == FALSE_) 
02232     return FALSE_;
02233 
02234   C2F(stringc)(istk(*ilorig ), (char ***)stk(*lw ), &ierr);
02235 
02236   if (ierr != 0) {
02237     Scierror(999,"Not enough memory\r\n");
02238     return FALSE_;
02239   }
02240   return TRUE_;
02241 }
02242 
02243 /*---------------------------------------------------------- 
02244  *  listcrepointer(top,numero,lw,....) 
02245  *---------------------------------------------------------- */
02246 
02247 int C2F(listcrepointer)(char *fname,integer *lw,integer *numi,integer *stlw,integer *lrs,unsigned long fname_len)
02248 {
02249   integer ix1,il ;
02250   if (C2F(crepointeri)(fname, stlw,  lrs, &c_true, fname_len)==FALSE_)
02251     return FALSE_ ;
02252   *stlw = *lrs + 2;
02253   il = iadr(*Lstk(*lw ));
02254   ix1 = il + *istk(il +1) + 3;
02255   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
02256   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
02257   return TRUE_;
02258 } 
02259 
02260 /*---------------------------------------------------------- 
02261  *  crepointer :
02262  *---------------------------------------------------------- */
02263 
02264 int C2F(crepointer)(char *fname,integer *lw,integer *lr,unsigned long fname_len)
02265 {
02266 
02267   if (*lw + 1 >= Bot) {
02268     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
02269     return FALSE_;
02270   }
02271   if ( C2F(crepointeri)(fname, Lstk(*lw ), lr, &c_true, fname_len) == FALSE_)
02272     return FALSE_ ;
02273   *Lstk(*lw +1) = *lr + 2;
02274   return TRUE_;
02275 } 
02276 
02277 /*--------------------------------------------------------- 
02278  * internal function used by crepointer and listcrepointer 
02279  *---------------------------------------------------------- */
02280 int C2F(crepointeri)(char *fname,integer *stlw,integer *lr,int *flagx,unsigned long fname_len)
02281 {
02282   integer ix1;
02283   integer il;
02284   il = iadr(*stlw);
02285   ix1 = il + 4;
02286   Err = sadr(ix1) + 2 - *Lstk(Bot );
02287   if (Err > 0) {
02288     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
02289     return FALSE_;
02290   };
02291   if (*flagx) {
02292     *istk(il ) = 128;
02293     /* if m*n=0 then both dimensions are to be set to zero */
02294     *istk(il + 1) = 1;
02295     *istk(il + 2) = 1;
02296     *istk(il + 3) = 0;
02297   }
02298   ix1 = il + 4;
02299   *lr = sadr(ix1);
02300   return TRUE_;
02301 } 
02302 
02303 /*------------------------------------------------------------------- 
02304  *     creates a Scilab stringpointer on the stack at position spos 
02305  *     of size mxn the stringpointer is filled with the datas stored 
02306  *     in stk(lorig) ( for example created with cstringv ) 
02307  *     and the data stored at stk(lorig) is freed 
02308  *------------------------------------------------------------------- */
02309 
02310 int C2F(lcrestringmatfromc)(char *fname,integer *spos,integer *numi,integer *stlw,integer *lorig,integer *m,integer *n,unsigned long fname_len)
02311 {
02312   integer ix1;
02313   integer ierr;
02314   integer il, ilw;
02315   ilw = iadr(*stlw);
02316   ix1 = *Lstk(Bot ) - *stlw;
02317   C2F(cstringf)((char ***)stk(*lorig ), istk(ilw ), m, n, &ix1, &ierr);
02318   if (ierr > 0) {
02319     Scierror(999,"Not enough memory\r\n");
02320     return FALSE_;
02321   }
02322   ix1 = ilw + 5 + *m * *n + *istk(ilw + 4 + *m * *n ) - 1;
02323   *stlw = sadr(ix1);
02324   il = iadr(*Lstk(*spos ));
02325   ix1 = il + *istk(il +1) + 3;
02326   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
02327   if (*numi == *istk(il +1)) {
02328     *Lstk(*spos +1) = *stlw;
02329   }
02330   return TRUE_;
02331 }
02332 
02333 
02334 /*------------------------------------------------------------------- 
02335  *     creates a Scilab stringmat on the stack at position spos 
02336  *     of size mxn the stringmat is filled with the datas stored 
02337  *     in stk(lorig) ( for example created with cstringv ) 
02338  *     and the data stored at stk(lorig) is freed 
02339  *------------------------------------------------------------------- */
02340 
02341 int C2F(crestringmatfromc)(char *fname,integer *spos,integer *lorig,integer *m,integer *n,unsigned long fname_len)
02342 {
02343   integer ix1;
02344   integer ierr;
02345   integer ilw;
02346   ilw = iadr(*Lstk(*spos ));
02347   ix1 = *Lstk(Bot ) - *Lstk(*spos );
02348   C2F(cstringf)((char ***)stk(*lorig ), istk(ilw ), m, n, &ix1, &ierr);
02349   if (ierr > 0) {
02350     Scierror(999,"Not enough memory\r\n");
02351     return FALSE_;
02352   }
02353   ix1 = ilw + 5 + *m * *n + *istk(ilw + 4 + *m * *n ) - 1;
02354   *Lstk(*spos +1) = sadr(ix1);
02355   return  TRUE_;
02356 }
02357 
02358 /*------------------------------------------------------------------ 
02359  *     getlistvectrow : recupere un vecteur ligne dans une liste 
02360  *------------------------------------------------------------------ */
02361 
02362 int C2F(getlistvectrow)(char *fname,integer *topk,integer *spos,integer *lnum,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
02363 {
02364   integer nv;
02365   integer ili;
02366 
02367   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_) 
02368     return FALSE_;
02369 
02370   if (*lnum > nv) {
02371     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
02372              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
02373     return FALSE_;
02374   }
02375 
02376   if (C2F(getmati)(fname, topk, spos, &ili, it, m, n, lr, lc, &c_true, lnum, fname_len)== 
02377       FALSE_) 
02378     return FALSE_;
02379   if (*m != 1) {
02380     Scierror(999,"%s: argument %d >(%d) should be a row vector \r\n",
02381              get_fname(fname,fname_len),Rhs + (*spos - *topk), *lnum);
02382     return FALSE_;
02383   }
02384   return TRUE_;
02385 } 
02386 
02387 
02388 /*------------------------------------------------------------------ 
02389  *     Fonction normalement identique a getmat mais rajoutee 
02390  *     pour ne pas avoir a changer le stack.f de interf 
02391  *     renvoit .true. si l'argument en spos est une matrice 
02392  *             sinon appelle error et renvoit .false. 
02393  *     Entree : 
02394  *       fname : nom de la routine appellante pour le message 
02395  *       d'erreur 
02396  *       spos    : position ds la pile 
02397  *     Sortie 
02398  *       [it,m,n] caracteristiques de la matrice 
02399  *       lr : pointe sur la partie reelle ( si la matrice est a 
02400  *              a(1,1)=stk(lr) 
02401  *            si l'on veut acceder a des entiers 
02402  *                         a(1,1)=istk(adr(lr,0)) 
02403  *       lc : pointe sur la partie imaginaire si elle existe sinon sur zero 
02404  *------------------------------------------------------------------ */
02405 
02406 int C2F(getvectrow)(char *fname,integer *topk,integer *spos,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
02407 {
02408   if (C2F(getmati)(fname, topk, spos, Lstk(*spos ), it, m, n, lr, lc, &c_false, &cx0, fname_len) == FALSE_) 
02409     return FALSE_;
02410 
02411   if (*m != 1) {
02412     Scierror(999,"%s: argument %d should be a row vector \r\n",
02413              get_fname(fname,fname_len),Rhs + (*spos - *topk));
02414     return FALSE_;
02415   }
02416   return TRUE_ ;
02417 } 
02418 
02419 /*------------------------------------------------------------------ 
02420  *
02421  *------------------------------------------------------------------ */
02422 
02423 int C2F(getlistvectcol)(char *fname,integer *topk,integer *spos,integer *lnum,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
02424 {
02425   integer nv;
02426   integer ili;
02427   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_) 
02428     return FALSE_;
02429 
02430   if (*lnum > nv) {
02431     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
02432              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
02433     return FALSE_;
02434   }
02435   if ( C2F(getmati)(fname, topk, spos, &ili, it, m, n, lr, lc, &c_true, lnum, fname_len)
02436        == FALSE_)
02437     return FALSE_;
02438 
02439   if (*n != 1) {
02440     Scierror(999,"%s: argument %d >(%d) should be a column vector \r\n",
02441              get_fname(fname,fname_len),Rhs + (*spos - *topk), *lnum);
02442     return FALSE_;
02443   }
02444   return TRUE_;
02445 }
02446 
02447 /*------------------------------------------------------------------ 
02448 *     Fonction normalement identique a getmat mais rajoutee 
02449 *     pour ne pas avoir a changer le stack.f de interf 
02450 *     renvoit .true. si l'argument en spos est une matrice 
02451 *             sinon appelle error et renvoit .false. 
02452 *     Entree : 
02453 *       fname : nom de la routine appellante pour le message 
02454 *       d'erreur 
02455 *       spos    : position ds la pile 
02456 *     Sortie 
02457 *       [it,m,n] caracteristiques de la matrice 
02458 *       lr : pointe sur la partie reelle ( si la matrice est a 
02459 *              a(1,1)=stk(lr) 
02460 *            si l'on veut acceder a des entiers 
02461 *                          a(1,1)=istk(adr(lr,0)) 
02462 *       lc : pointe sur la partie imaginaire si elle existe sinon sur zero 
02463 *------------------------------------------------------------------ */
02464 
02465 int C2F(getvectcol)(char *fname,integer *topk,integer *spos,integer *it,integer *m,integer *n,integer *lr,integer *lc,unsigned long fname_len)
02466 {
02467 
02468   if ( C2F(getmati)(fname, topk, spos, Lstk(*spos ), it, m, n, lr, lc, &c_false, &cx0, fname_len)
02469        == FALSE_ ) 
02470     return FALSE_;
02471 
02472   if (*n != 1) {
02473     Scierror(999,"%s: argument %d should be a column vector \r\n",
02474              get_fname(fname,fname_len),Rhs + (*spos - *topk));
02475     return FALSE_;
02476   }
02477   return TRUE_;
02478 }
02479 
02480 
02481 int C2F(getlistsimat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *m,integer *n,integer *ix,integer *j,integer *lr,integer *nlr,unsigned long fname_len)
02482 {
02483   integer nv;
02484   integer ili;
02485 
02486   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_) 
02487     return FALSE_;
02488 
02489   if (*lnum > nv) {
02490     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
02491              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
02492     return FALSE_;
02493   }
02494   return  C2F(getsmati)(fname, topk, spos, &ili, m, n, ix, j, lr, nlr, &c_true, lnum, fname_len);
02495 } 
02496 
02497 /*------------------------------------------------------------------- 
02498  *     recuperation d'un pointer 
02499  *------------------------------------------------------------------- */
02500 
02501 int C2F(getpointer)(char *fname,integer *topk,integer *lw,integer *lr,unsigned long fname_len)
02502 {
02503   return C2F(getpointeri)(fname, topk, lw,Lstk(*lw), lr, &c_false, &cx0, fname_len);
02504 } 
02505 
02506 /*------------------------------------------------------------------ 
02507  * getlistpointer : 
02508  *    checks that spos object is a list 
02509  *    checks that lnum-element of the list exists and is a pointer 
02510  *    extracts pointer value 
02511  *     In  : 
02512  *       fname : name of calling function for error message 
02513  *       topk  : stack ref for error message 
02514  *       spos    : stack position 
02515  *     Out : 
02516  *       lw : stk(lw) a <<pointer>> casted to a double 
02517  *------------------------------------------------------------------ */
02518 
02519 int C2F(getlistpointer)(char *fname,integer *topk,integer *spos,integer *lnum,integer *lw,unsigned long fname_len)
02520 {
02521   integer nv, ili;
02522 
02523   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_)
02524     return FALSE_;
02525 
02526   if (*lnum > nv) {
02527     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
02528              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
02529     return FALSE_;
02530   }
02531   return C2F(getpointeri)(fname, topk, spos, &ili, lw, &c_true, lnum, fname_len);
02532 } 
02533 
02534 /*------------------------------------------------------------------- 
02535  * For internal use 
02536  *------------------------------------------------------------------- */
02537 
02538 int C2F(getpointeri)(char *fname,integer *topk,integer *spos,integer *lw,integer *lr,int *inlistx,integer *nel,unsigned long fname_len)
02539 {
02540   integer il;
02541   il = iadr(*lw);
02542   if (*istk(il ) < 0) il = iadr(*istk(il +1));
02543   if (*istk(il ) != 128) {
02544     sciprint("----%d\r\n",*istk(il));
02545     if (*inlistx) 
02546       Scierror(999,"%s: argument %d >(%d) should be a boxed pointer\r\n",
02547                get_fname(fname,fname_len), Rhs + (*spos - *topk), *nel);
02548     else 
02549       Scierror(201,"%s: argument %d should be a boxed pointer\r\n",get_fname(fname,fname_len),
02550                Rhs + (*spos - *topk));
02551     return  FALSE_;
02552   }
02553   *lr = sadr(il+4);
02554   return TRUE_;
02555 } 
02556 
02557 /*-----------------------------------------------------------
02558  *     creates a matlab-like sparse matrix 
02559  *-----------------------------------------------------------*/
02560 
02561 int C2F(mspcreate)(integer *lw,integer *m,integer *n,integer *nzMax,integer *it)
02562 {
02563   integer ix1;
02564   integer jc, il, ir; int NZMAX;
02565   int k,pr;
02566   double size;
02567   if (*lw + 1 >= Bot) {
02568     Scierror(18,"too many names\r\n");
02569     return FALSE_;
02570   }
02571 
02572   il = iadr(*Lstk(*lw ));
02573   NZMAX=*nzMax;
02574   if (NZMAX==0) NZMAX=1;
02575   ix1 = il + 4 + (*n + 1) + NZMAX;
02576   size = (*it + 1) * NZMAX ;
02577   Err = sadr(ix1)  - *Lstk(Bot );
02578   if (Err > -size ) {
02579     Scierror(17,"stack size exceeded (Use stacksize function to increase it)\r\n");
02580     return FALSE_;
02581   };
02582   *istk(il ) = 7;
02583   /*        si m*n=0 les deux dimensions sont mises a zero. 
02584   *istk(il +1) = Min(*m , *m * *n);
02585   *istk(il + 1 +1) = Min(*n, *m * *n);     */
02586   *istk(il +1) = *m;
02587   *istk(il + 2) = *n;
02588   *istk(il + 3) = *it;
02589   *istk(il + 4) = NZMAX;
02590   jc = il + 5;
02591 
02592   for (k=0; k<*n+1; ++k) *istk(jc+k)=0;  /* Jc =0 */
02593   ir = jc + *n + 1;
02594   for (k=0; k<NZMAX; ++k) *istk(ir+k)=0;   /* Ir = 0 */
02595   pr = sadr(ir + NZMAX );
02596 
02597   for (k=0; k<NZMAX; ++k) *stk(pr+k)=0;    /* Pr =0  */
02598   ix1 = il + 4 + (*n + 1) + NZMAX;
02599   *Lstk(*lw +1) = sadr(ix1) + (*it + 1) * NZMAX + 1;
02600 
02601   C2F(intersci).ntypes[*lw-Top+Rhs-1] = '$';
02602   C2F(intersci).iwhere[*lw-Top+Rhs-1] = *Lstk(*lw);
02603   /* C2F(intersci).lad[*lw-Top+Rhs-1] = should point to numeric data */
02604   return TRUE_;
02605 }
02606 
02607 /**********************************************************************
02608  * Utilities 
02609  **********************************************************************/
02610 
02611 /*------------------------------------------
02612  * get_fname used for function names which can be non   
02613  * null-terminated strings when coming from 
02614  * a Fortran call
02615  *------------------------------------------*/
02616 
02617 static char Fname[nlgh+1];
02618 
02619 char *get_fname(char *fname,unsigned long fname_len)
02620 {
02621   int i;
02622   strncpy(Fname,fname,Min(fname_len,nlgh));
02623   Fname[fname_len] = '\0';
02624   for ( i= 0 ; i < (int) fname_len ; i++) 
02625     if (Fname[i] == ' ') { Fname[i]= '\0'; break;}
02626   return Fname;
02627 }
02628 
02629 /*------------------------------------------------------------------ 
02630  * realmat : 
02631  *     Top is supposed to be a matrix 
02632  *     and the matrix is chnaged to its real part 
02633  *------------------------------------------------------------------ */
02634 
02635 int C2F(realmat)()
02636 {
02637   integer ix1;
02638   integer m, n, il;
02639 
02640   il = iadr(*Lstk(Top ));
02641   if (*istk(il + 3 ) == 0) return 0;
02642   m = *istk(il + 1);
02643   n = *istk(il + 2);
02644   *istk(il + 3) = 0;
02645   ix1 = il + 4;
02646   *Lstk(Top +1) = sadr(ix1) + m * n;
02647   return 0;
02648 }
02649 
02650 
02651 
02652 
02653 /*------------------------------------------------------------------ 
02654 *     copie l'objet qui est a la position lw de la pile 
02655 *     a la position lwd de la pile 
02656 *     copie faite avec dcopy 
02657 *     pas de verification 
02658 *      implicit undefined (a-z) 
02659 *------------------------------------------------------------------ */
02660 
02661 int C2F(copyobj)(char *fname,integer *lw,integer *lwd,unsigned long fname_len)
02662 {
02663   integer ix1,l,ld;
02664   l=*Lstk(*lw );
02665   ld=*Lstk(*lwd );
02666 
02667   ix1 = *Lstk(*lw +1) - l;
02668   /* check for overlaping region */
02669   if (l+ix1>ld||ld+ix1>l) 
02670     C2F(unsfdcopy)(&ix1, stk(l), &cx1, stk(ld), &cx1);
02671   else
02672     C2F(dcopy)(&ix1, stk(l), &cx1, stk(ld), &cx1);
02673   *Lstk(*lwd +1) = ld + ix1;
02674   return 0;
02675 }
02676 
02677 
02678 
02679 /*------------------------------------------------
02680  *     copie l'objet qui est a la position lw de la pile
02681  *     a la position lwd de la pile 
02682  *     copie faite avec dcopy 
02683  *     et verification 
02684  *------------------------------------------------*/
02685 
02686 int C2F(vcopyobj)(char *fname,integer *lw,integer *lwd,unsigned long fname_len)
02687 {
02688   integer l;
02689   integer l1, lv;
02690   l = *Lstk(*lw );
02691   lv = *Lstk(*lw +1) - *Lstk(*lw );
02692   l1 = *Lstk(*lwd );
02693   if (*lwd + 1 >= Bot) {
02694     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
02695     return FALSE_;
02696   }
02697   Err = *Lstk(*lwd ) + lv - *Lstk(Bot );
02698   if (Err > 0) {
02699     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",
02700              get_fname(fname,fname_len));
02701     return FALSE_;
02702   }
02703   /* check for overlaping region */
02704   if (l+lv>l1||l1+lv>l) 
02705     C2F(unsfdcopy)(&lv, stk(l), &cx1, stk(l1), &cx1);
02706   else
02707     C2F(dcopy)(&lv, stk(l), &cx1, stk(l1), &cx1);
02708 
02709   *Lstk(*lwd +1) = *Lstk(*lwd ) + lv;
02710   return TRUE_;
02711 } 
02712 
02713 
02714 
02715 /*------------------------------------------------== 
02716 *     suppose qu'il y a une matrice en lw de taille it1,m1,n1,mn1, 
02717 *     et une autre en lw+1 de taille it2,m2,n2,mn2 
02718 *     et echange les matrices et change les valeurs de it1,m1,n1,... 
02719 *     apres echange la taille de la matrice en lw est stocke ds(it1,m1,n1) 
02720 *     et celle en lw+1 est stocke ds (it2,m2,n2) 
02721 *     effet de bord il faut que lw+2 soit une place libre 
02722 *------------------------------------------------== */
02723 
02724 
02725 int C2F(swapmat)(char *fname,integer *topk,integer *lw,integer *it1,integer *m1,integer *n1,integer *mn1,integer *it2,integer *m2,integer *n2,integer *mn2,unsigned long fname_len)
02726 {
02727   integer ix1, ix2;
02728   integer lc, lr;
02729   ix1 = *lw + 1;
02730 
02731   if ( C2F(cremat)(fname, &ix1, it1, m1, n1, &lr, &lc, fname_len)== FALSE_)
02732     return FALSE_ ;
02733 
02734   ix1 = *lw + 2;
02735   C2F(copyobj)(fname, lw, &ix1, fname_len);
02736   ix1 = *lw + 1;
02737   C2F(copyobj)(fname, &ix1, lw, fname_len);
02738   ix1 = *lw + 2;
02739   ix2 = *lw + 1;
02740   C2F(copyobj)(fname, &ix1, &ix2, fname_len);
02741   if ( C2F(getmat)(fname, topk, lw, it1, m1, n1, &lr, &lc, fname_len) == FALSE_ )
02742     return FALSE_;
02743 
02744   ix1 = *lw + 1;
02745 
02746   if (C2F(getmat)(fname, topk, &ix1, it2, m2, n2, &lr, &lc, fname_len) == FALSE_ )
02747     return FALSE_;
02748 
02749   *mn1 = *m1 * *n1;
02750   *mn2 = *m2 * *n2;
02751 
02752   return TRUE_;
02753 } 
02754 
02755 
02756 /*------------------------------------------------== 
02757 *     verifie qu'en lw il y a une matrice de taille (it1,m1,n1) 
02758 *     deplace cette matrice en lw+1, en reservant en lw 
02759 *     la place pour stocker une matrice (it,m,n) 
02760 *     insmat  verifie  qu'on a la place de faire tout ca 
02761 *     appelle error en cas de probleme 
02762 *     Remarque : noter par exemple que si it=it1,m1=m,n1=n 
02763 *        alors apres le contenu de la matrice en lw est une copie de 
02764 *        celle en lw+1 
02765 *     Remarque : lw doit etre top car sinon on perd ce qu'il y avait avant 
02766 *        en lw+1,....,lw+n 
02767 *     Entree : 
02768 *        lw : position 
02769 *        it ,m,n : taille de la matrice a inserer 
02770 *     Sortie : 
02771 *       lr : pointe sur la partie reelle de la matrice 
02772 *            en lw (   a(1,1)=stk(lr)) 
02773 *       lc : pointe sur la partie imaginaire si besoin est 
02774 *       lr1,lc1 : meme signification mais pour la matrice en lw+1 
02775 *            ( matrice qui a ete copiee de lw a lw+1 
02776 *------------------------------------------------== */
02777 
02778 int C2F(insmat)(integer *topk,integer *lw,integer *it,integer *m,integer *n,integer *lr,integer *lc,integer *lr1,integer *lc1)
02779 {
02780 
02781   integer ix1;
02782   integer c_n1 = -1;
02783   integer m1, n1;
02784   integer lc0, it1, lr0;
02785   
02786   if (C2F(getmat)("insmat", topk, lw, &it1, &m1, &n1, &lr0, &lc0, 6L) == FALSE_) 
02787     return FALSE_;
02788 
02789   if (C2F(cremat)("insmat", lw, it, m, n, lr, lc, 6L)  == FALSE_) 
02790     return FALSE_;
02791 
02792   ix1 = *lw + 1;
02793 
02794   if (C2F(cremat)("insmat", &ix1, &it1, &m1, &n1, lr1, lc1, 6L) == FALSE_) 
02795     return FALSE_;
02796 
02797   ix1 = m1 * n1 * (it1 + 1);
02798   C2F(dcopy)(&ix1, stk(lr0 ), &c_n1, stk(*lr1 ), &c_n1);
02799   return TRUE_;
02800 } 
02801 
02802 
02803 
02804 
02805 /*------------------------------------------------
02806  *     imprime le contenu de la pile en lw en mode entier ou 
02807  *        double precision suivant typ 
02808  *------------------------------------------------*/
02809 
02810 int C2F(stackinfo)(integer *lw,integer *typ)
02811 {
02812   integer ix, l, m, n;
02813   integer il, nn;
02814 
02815   if (*lw == 0) {
02816     return 0;
02817   }
02818   il = iadr(*Lstk(*lw ));
02819   if (*istk(il ) < 0) {
02820     il = iadr(*istk(il +1));
02821   }
02822   m = *istk(il +1);
02823   n = *istk(il + 1 +1);
02824 
02825   sciprint("-----------------stack-info-----------------\r\n");
02826   sciprint("lw=%d -[istk]-> il lw+1 -[istk]-> %d \r\n",
02827            *lw,iadr(*Lstk(*lw+1)));
02828   sciprint("istk(%d:..) ->[%d %d %d %d ....]\r\n",
02829            il, istk(il),istk(il+1),istk(il+2),istk(il+3) );
02830   if (*typ == 1) {
02831     l = sadr(il+4);
02832     nn = Min(m*n,3);
02833     for (ix = 0; ix <= nn-1 ; ++ix) {
02834       sciprint("%5.2f  ",stk(l + ix ));
02835     }
02836   } else {
02837     l = il + 4;
02838     nn = Min(m*n,3);
02839     for (ix = 0; ix <= nn-1; ++ix) {
02840       sciprint("%5d  ",istk(l + ix ));
02841     }
02842   }
02843   sciprint("\r\n-----------------stack-info-----------------\r\n");
02844   return 0;
02845 }
02846 
02847 
02848 
02849 /*------------------------------------------------
02850  * allmat :
02851  *  checks if object at position lw is a matrix 
02852  *  (scalar,string,polynom) 
02853  *  In : 
02854  *     fname,topk,lw 
02855  *  Out : 
02856  *     m,n
02857  *------------------------------------------------*/
02858 
02859 int C2F(allmat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,unsigned long fname_len)
02860 {
02861   integer itype, il;
02862   il = iadr(*Lstk(*lw ));
02863   if (*istk(il ) < 0) il = iadr(*istk(il +1));
02864   itype = *istk(il );
02865   if (itype != 1 && itype != 2 && itype != 10) {
02866     Scierror(209,"%s: Argument %d wrong type argument, expecting a matrix\r\n",
02867              get_fname(fname,fname_len) ,  Rhs + (*lw - *topk));
02868     return FALSE_;
02869   }
02870   *m = *istk(il + 1);
02871   *n = *istk(il + 2);
02872   return TRUE_;
02873 } 
02874 
02875 /*------------------------------------------------
02876  * Assume that object at position lw is a matrix 
02877  * and set its size to (m,n) 
02878  *------------------------------------------------*/
02879 
02880 int C2F(allmatset)(char *fname,integer *lw,integer *m,integer *n,unsigned long fname_len)
02881 {
02882   integer il;
02883   il = iadr(*Lstk(*lw ));
02884   if (*istk(il ) < 0) il = iadr(*istk(il +1));
02885   *istk(il + 1) = *m;
02886   *istk(il + 2) = *n;
02887   return 0;
02888 } 
02889 
02890 /*------------------------------------------------
02891  *     cree un objet vide en lw et met a jour lw+1 
02892  *     en fait lw doit etre top 
02893  *     verifie les cas particuliers lw=0 ou lw=1 
02894  *     ainsi que le cas particulier ou une fonction 
02895  *     n'a pas d'arguments (ou il faut faire top=top+1) 
02896  *------------------------------------------------ */
02897 
02898 int C2F(objvide)(char *fname,integer *lw,unsigned long fname_len)
02899 {
02900   if (*lw == 0 || Rhs < 0) {
02901     ++(*lw);
02902   }
02903   *istk(iadr(*Lstk(*lw )) ) = 0;
02904   *Lstk(*lw +1) = *Lstk(*lw ) + 2;
02905   return 0;
02906 }
02907 
02908 /*------------------------------------------------
02909  *     renvoit .true. si l'argument en lw est un ``external'' 
02910  *             sinon appelle error et renvoit .false. 
02911  *     si l'argument est un external de type string 
02912  *         on met a jour la table des fonctions externes 
02913  *         corespondante en appellant fun 
02914  *     Entree : 
02915  *       fname : nom de la routine appellante pour le message 
02916  *       d'erreur 
02917  *       topk : numero d'argument d'appel pour le message d'ereur 
02918  *       lw    : position ds la pile 
02919  *     Sortie 
02920  *       type vaut true ou false 
02921  *       si l'external est de type chaine de caracteres 
02922  *       la chaine est mise ds name 
02923  *       et type est mise a true 
02924  *------------------------------------------------ */
02925 
02926 int C2F(getexternal)(char *fname,integer *topk,integer *lw,char *namex,int *typex,void (*setfun) __PARAMS((char *,int *)),unsigned long fname_len,unsigned long name_len)
02927 {
02928   int ret_value;
02929   integer irep;
02930   integer m, n;
02931   integer il, lr;
02932   integer nlr;
02933   int i;
02934   il = C2F(gettype)(lw);
02935   switch ( il) {
02936   case 11 : case 13 : case 15 :
02937     ret_value = TRUE_;
02938     *typex = FALSE_;
02939     break;
02940   case 10 :
02941     ret_value = C2F(getsmat)(fname, topk, lw, &m, &n, &cx1, &cx1, &lr, &nlr, fname_len);
02942     *typex = TRUE_;
02943     for (i=0; i < (int)name_len ; i++ ) namex[i] = ' ';
02944     if (ret_value == TRUE_) 
02945       {
02946         C2F(cvstr)(&nlr, istk(lr ), namex, &cx1, name_len);
02947         namex[nlr] = '\0';
02948         (*setfun)(namex, &irep); /* , name_len); */
02949         if (irep == 1) 
02950           {
02951             Scierror(50,"%s: entry point %s not found in predefined tables or link table\r\n",get_fname(fname,fname_len),namex);
02952             ret_value = FALSE_;
02953           }
02954       }
02955     break;
02956   default: 
02957     Scierror(211,"%s: Argument %d: wrong type argument, expecting a function\r\n\tor string (external function)\r\n",
02958              get_fname(fname,fname_len), Rhs + (*lw - *topk));
02959     ret_value = FALSE_;
02960     break;
02961   }
02962   return ret_value;
02963 } 
02964 
02965 /*------------------------------------------------
02966  *------------------------------------------------ */
02967 
02968 int C2F(checkval)(char *fname,integer *ival1,integer *ival2,unsigned long fname_len)
02969 {
02970   if (*ival1 != *ival2) 
02971   {
02972     Scierror(999,"%s: incompatible sizes \r\n",get_fname(fname,fname_len));
02973     return  FALSE_;
02974   } ;
02975   return  TRUE_;
02976 }
02977 
02978 /*------------------------------------------------------------- 
02979  *      recupere si elle existe la variable name dans le stack et 
02980  *      met sa valeur a la position top et top est incremente 
02981  *      ansi que rhs 
02982  *      si la variable cherchee n'existe pas on renvoit false 
02983  *------------------------------------------------------------- */
02984 
02985 int C2F(optvarget)(char *fname,integer *topk,integer *iel,char *namex,unsigned long fname_len,unsigned long name_len)
02986 {
02987   integer id[nsiz];
02988   C2F(cvname)(id, namex, &cx0, name_len);
02989   Fin = 0;
02990   /*     recupere la variable et incremente top */
02991   C2F(stackg)(id);
02992   if (Fin == 0) {
02993     Scierror(999,"%s: optional argument %d not given and default value %s not found\r\n",
02994              get_fname(fname,fname_len),*iel,namex);
02995     return FALSE_;
02996   }
02997   ++Rhs;
02998   return TRUE_;
02999 }
03000 
03001 
03002 /*------------------------------------------------------------- 
03003  * this routine adds nlr characters (coded in istk(*lr)) 
03004  * + a null character in Scilab character buffer C2F(cha1).buf
03005  * the characters are stored at position lbuf 
03006  * lbuf,lbufi,lbuff are the updated : 
03007  *     buf(lbufi:lbuff) will give the characters in buf at Fortran level 
03008  * and lbuf will give the next available position (i.e lbuff+2 since 
03009  * '\0' is added at position lbuff+1 
03010  * 
03011  * Note that at Fortran level buf(lbufi:lbuff) can be used as a C string argument 
03012  * since it is null terminated 
03013  *
03014  *------------------------------------------------------------- */
03015 
03016 int C2F(bufstore)(char *fname,integer *lbuf,integer *lbufi,integer *lbuff,integer *lr,integer *nlr,unsigned long fname_len)
03017 {
03018   *lbufi = *lbuf;
03019   *lbuff = *lbufi + *nlr - 1;
03020   *lbuf = *lbuff + 2;
03021   if (*lbuff > bsiz) {
03022     Scierror(999,"%f: No more space to store string arguments\r\n",
03023              get_fname(fname,fname_len) );
03024     return FALSE_;
03025   }
03026   /* lbufi is a Fortran indice ==> offset -1 at C level */
03027   C2F(cvstr)(nlr, istk(*lr ), C2F(cha1).buf + (*lbufi - 1), &cx1, *lbuff - (*lbufi - 1));
03028   C2F(cha1).buf[*lbuff] = '\0';
03029   return TRUE_;
03030 }
03031 
03032 
03033 /*------------------------------------------------------------- 
03034  * 
03035  *------------------------------------------------------------- */
03036 int C2F(credata)(char *fname,integer *lw,integer m,unsigned long fname_len)
03037 {
03038   integer lr;
03039   lr = *Lstk(*lw );
03040   if (*lw + 1 >= Bot) {
03041     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
03042     return FALSE_;
03043   }
03044   
03045   Err = lr   - *Lstk(Bot);
03046   if (Err > -m ) {
03047     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
03048     return FALSE_;
03049   };
03050   /*  *Lstk(*lw +1) = lr + 1 + m/sizeof(double);  */
03051   /*    type 0  */
03052   *istk(iadr(lr)) = 0;
03053   *Lstk(*lw +1) = lr + (m+sizeof(double)-1)/sizeof(double);
03054   return TRUE_;
03055 } 
03056 /* ==============================================================
03057 MATRIX OF HANDLE
03058 ================================================================= */
03059 /*--------------------------------------------------------- 
03060  * internal function used by crehmat and listcrehmat 
03061  *---------------------------------------------------------- */
03062 
03063 int C2F(crehmati)(char *fname,integer *stlw,integer *m,integer *n,integer *lr,int *flagx,unsigned long fname_len)
03064 {
03065   integer ix1;
03066   integer il;
03067   double size = ((double) *m) * ((double) *n);
03068   il = iadr(*stlw);
03069   ix1 = il + 4;
03070   Err = sadr(ix1) - *Lstk(Bot );
03071   if ( (double) Err > -size ) {
03072     Scierror(17,"%s: stack size exceeded (Use stacksize function to increase it)\r\n",get_fname(fname,fname_len));
03073     return FALSE_;
03074   };
03075   if (*flagx) {
03076     *istk(il ) = 9;
03077     /* if m*n=0 then both dimensions are to be set to zero */
03078     *istk(il + 1) = Min(*m , *m * *n);
03079     *istk(il + 2) = Min(*n ,*m * *n);
03080     *istk(il + 3) = 0;
03081   }
03082   ix1 = il + 4;
03083   *lr = sadr(ix1);
03084   return TRUE_;
03085 } 
03086 
03087 /*---------------------------------------------------------- 
03088  *  listcrehmat(top,numero,lw,....) 
03089  *      le numero ieme element de la liste en top doit etre un matrice 
03090  *      stockee a partir de Lstk(lw) 
03091  *      doit mettre a jour les pointeurs de la liste 
03092  *      ainsi que stk(top+1) 
03093  *      si l'element a creer est le dernier 
03094  *      lw est aussi mis a jour 
03095  *---------------------------------------------------------- */
03096 
03097 int C2F(listcrehmat)(char *fname,integer *lw,integer *numi,integer *stlw,integer *m,integer *n,integer *lrs,unsigned long fname_len)
03098 {
03099   integer ix1,il ;
03100     
03101   if (C2F(crehmati)(fname, stlw, m, n, lrs, &c_true, fname_len)==FALSE_)
03102     return FALSE_ ;
03103 
03104   *stlw = *lrs + *m * *n;
03105   il = iadr(*Lstk(*lw ));
03106   ix1 = il + *istk(il +1) + 3;
03107   *istk(il + 2 + *numi ) = *stlw - sadr(ix1) + 1;
03108   if (*numi == *istk(il +1))  *Lstk(*lw +1) = *stlw;
03109   return TRUE_;
03110 } 
03111 
03112 /*---------------------------------------------------------- 
03113  *  crehmat :
03114  *   checks that a matrix of handle of size [m,n] can be stored at position  lw 
03115  *   <<pointers>> to data is returned on success
03116  *   In : 
03117  *     lw : position (entier) 
03118  *     m, n dimensions 
03119  *   Out : 
03120  *     lr : stk(lr+i-1)= h(i)
03121  *   Side effect : if matrix creation is possible 
03122  *     [m,n] are stored in Scilab stack 
03123  *     and lr is returned but stk(lr+..)  are unchanged 
03124  *---------------------------------------------------------- */
03125 
03126 int C2F(crehmat)(char *fname,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
03127 {
03128 
03129   if (*lw + 1 >= Bot) {
03130     Scierror(18,"%s: too many names\r\n",get_fname(fname,fname_len));
03131     return FALSE_;
03132   }
03133   if ( C2F(crehmati)(fname, Lstk(*lw ), m, n, lr, &c_true, fname_len) == FALSE_)
03134     return FALSE_ ;
03135   *Lstk(*lw +1) = *lr + *m * *n;
03136   return TRUE_;
03137 } 
03138 /*------------------------------------------------------------------ 
03139  * getlisthmat : 
03140  *    checks that spos object is a list 
03141  *    checks that lnum-element of the list exists and is a matrix 
03142  *    extracts matrix information(m,n,lr) 
03143  *     In  : 
03144  *       fname : name of calling function for error message 
03145  *       topk  : stack ref for error message 
03146  *       lw    : stack position 
03147  *     Out : 
03148  *       [m,n] matrix dimensions 
03149  *       lr : stk(lr+i-1)= h(i)) 
03150  *------------------------------------------------------------------ */
03151 
03152 int C2F(getlisthmat)(char *fname,integer *topk,integer *spos,integer *lnum,integer *m,integer *n,integer *lr,unsigned long fname_len)
03153 {
03154   integer nv, ili;
03155 
03156   if ( C2F(getilist)(fname, topk, spos, &nv, lnum, &ili, fname_len) == FALSE_)
03157     return FALSE_;
03158 
03159   if (*lnum > nv) {
03160     Scierror(999,"%s: argument %d should be a list of size at least %d \r\n",
03161              get_fname(fname,fname_len), Rhs+(*spos - *topk), *lnum);
03162     return FALSE_;
03163   }
03164   return C2F(gethmati)(fname, topk, spos, &ili, m, n, lr, &c_true, lnum, fname_len);
03165 } 
03166 
03167 /*------------------------------------------------------------------- 
03168  * gethmat :
03169  *     check that object at position lw is a matrix 
03170  *     In  : 
03171  *       fname : name of calling function for error message 
03172  *       topk  : stack ref for error message 
03173  *       lw    : stack position ( ``in the top sense'' )
03174  *     Out : 
03175  *       [m,n] matrix dimensions 
03176  *       lr : stk(lr+i-1)= h(i)
03177  *------------------------------------------------------------------- */
03178 
03179 int C2F(gethmat)(char *fname,integer *topk,integer *lw,integer *m,integer *n,integer *lr,unsigned long fname_len)
03180 {
03181   return C2F(gethmati)(fname, topk, lw,Lstk(*lw), m, n, lr, &c_false, &cx0, fname_len);
03182 }
03183 
03184 /*------------------------------------------------------------------- 
03185  * For internal use 
03186  *------------------------------------------------------------------- */
03187 
03188 int C2F(gethmati)(char *fname,integer *topk,integer *spos,integer *lw,integer *m,integer *n,integer *lr,int *inlistx,integer *nel,unsigned long fname_len)
03189 {
03190   integer il;
03191   il = iadr(*lw);
03192   if (*istk(il ) < 0) il = iadr(*istk(il +1));
03193   if (*istk(il ) != 9) {
03194     if (*inlistx) 
03195       Scierror(999,"%s: argument %d >(%d) should be a matrix of handle\r\n",
03196                get_fname(fname,fname_len), Rhs + (*spos - *topk), *nel);
03197     else 
03198       Scierror(201,"%s: argument %d should be a matrix of handle\r\n",get_fname(fname,fname_len),
03199                Rhs + (*spos - *topk));
03200     return  FALSE_;
03201   }
03202   *m = *istk(il + 1);
03203   *n = *istk(il + 2);
03204   *lr = sadr(il+4);
03205   return TRUE_;
03206 } 
03207 

Generated on Sun Mar 4 15:03:47 2007 for Scilab [trunk] by  doxygen 1.5.1