00001
00002
00003
00004
00005
00006
00007
00008 #include <string.h>
00009 #include "stack-c.h"
00010 #include "stack1.h"
00011 #include "stack2.h"
00012 #include "sciprint.h"
00013
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
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
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
00065
00066
00067
00068
00069
00070
00071
00072
00073
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
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
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
00120
00121
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
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
00167
00168
00169
00170
00171
00172
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
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
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
00222
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
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
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
00265
00266
00267
00268
00269
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
00277 integer i__1;
00278 static integer lc, il, lr;
00279 static integer c__1 = 1;
00280
00281
00282 --itab;
00283 --rtab;
00284 --id;
00285
00286
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
00314
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
00322 static integer il, lr;
00323 integer i__1;
00324 static integer c__1 = 1;
00325
00326
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
00344
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
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
00379
00380
00381
00382
00383 #define memused(it,mn) ((((mn)*( it % 10))/sizeof(int))+1)
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
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
00419
00420
00421
00422
00423
00424
00425
00426
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
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
00462
00463
00464
00465
00466
00467
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
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
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
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
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
00544
00545
00546
00547
00548
00549
00550
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
00572
00573
00574
00575
00576
00577
00578
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
00588
00589
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
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
00633
00634
00635
00636
00637
00638
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
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
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
00692
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
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
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
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
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
00770
00771
00772
00773
00774
00775
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
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
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
00834
00835
00836
00837
00838
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
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
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
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
00908 if ( *m == 0 || *n == 0 )
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
00928
00929
00930
00931
00932
00933
00934
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
00952
00953
00954
00955
00956
00957
00958
00959
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
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
00995
00996
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
01016
01017
01018
01019
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
01051
01052
01053
01054
01055
01056
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
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
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
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
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
01132
01133
01134
01135
01136
01137
01138
01139
01140
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
01150
01151
01152
01153
01154
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
01174
01175
01176
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
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
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
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
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
01274
01275
01276
01277
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
01294 if ( *nchar == 0) *Lstk(*lw +1) += 1;
01295 return TRUE_;
01296 }
01297
01298
01299
01300
01301
01302
01303
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
01324
01325
01326
01327
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
01345 if ( *nchar == 0) *Lstk(*lw +1) += 1;
01346 *lr = ilast + *istk(ilast - 1);
01347 return TRUE_;
01348 }
01349
01350
01351
01352
01353
01354
01355
01356
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
01380
01381
01382
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
01421
01422
01423
01424
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
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
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
01483
01484
01485
01486
01487
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
01565
01566
01567
01568
01569
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
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
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
01644
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
01667
01668
01669
01670
01671
01672
01673
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
01684 if ( *nchar == 0) *Lstk(*spos +1) += 1;
01685 return TRUE_;
01686 }
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
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
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
01751
01752
01753
01754
01755
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
01780 incj = (*j - 1) * m;
01781 nj = *istk(il1 + 4 + incj + m ) - *istk(il1 + 4 + incj );
01782
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
01810
01811
01812
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
01831
01832
01833
01834
01835
01836
01837
01838
01839
01840
01841
01842
01843
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
01858
01859
01860
01861
01862
01863
01864
01865
01866
01867
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
01903
01904
01905
01906
01907
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
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
01938
01939
01940
01941
01942
01943
01944
01945
01946
01947
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
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
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
02032
02033
02034
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
02059
02060
02061
02062
02063
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
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
02127
02128
02129
02130
02131
02132
02133
02134
02135
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
02159
02160
02161
02162
02163
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
02192
02193
02194
02195
02196
02197
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
02220
02221
02222
02223
02224
02225
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
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
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
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
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
02305
02306
02307
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
02336
02337
02338
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
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
02390
02391
02392
02393
02394
02395
02396
02397
02398
02399
02400
02401
02402
02403
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
02449
02450
02451
02452
02453
02454
02455
02456
02457
02458
02459
02460
02461
02462
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
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
02508
02509
02510
02511
02512
02513
02514
02515
02516
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
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
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
02584
02585
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;
02593 ir = jc + *n + 1;
02594 for (k=0; k<NZMAX; ++k) *istk(ir+k)=0;
02595 pr = sadr(ir + NZMAX );
02596
02597 for (k=0; k<NZMAX; ++k) *stk(pr+k)=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
02604 return TRUE_;
02605 }
02606
02607
02608
02609
02610
02611
02612
02613
02614
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
02631
02632
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
02655
02656
02657
02658
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
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
02681
02682
02683
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
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
02717
02718
02719
02720
02721
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
02758
02759
02760
02761
02762
02763
02764
02765
02766
02767
02768
02769
02770
02771
02772
02773
02774
02775
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
02807
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
02851
02852
02853
02854
02855
02856
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
02877
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
02892
02893
02894
02895
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
02910
02911
02912
02913
02914
02915
02916
02917
02918
02919
02920
02921
02922
02923
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);
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
02980
02981
02982
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
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
03004
03005
03006
03007
03008
03009
03010
03011
03012
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
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
03051
03052 *istk(iadr(lr)) = 0;
03053 *Lstk(*lw +1) = lr + (m+sizeof(double)-1)/sizeof(double);
03054 return TRUE_;
03055 }
03056
03057
03058
03059
03060
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
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
03089
03090
03091
03092
03093
03094
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
03114
03115
03116
03117
03118
03119
03120
03121
03122
03123
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
03140
03141
03142
03143
03144
03145
03146
03147
03148
03149
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
03169
03170
03171
03172
03173
03174
03175
03176
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
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