00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <string.h>
00012 #include "stack3.h"
00013 #include "stack-c.h"
00014
00015 extern int C2F(dmcopy) __PARAMS((double *a, integer *na, double *b, integer *nb, integer *m, integer *n));
00016 extern int C2F(stackg) __PARAMS((integer *id));
00017 extern int C2F(stackp) __PARAMS((integer *id, integer *macmod));
00018
00019
00020 void *Name2ptr(char *namex);
00021 int Name2where(char *namex);
00022
00023
00024
00025 static integer cx0 = 0;
00026 static integer cx1 = 1;
00027
00028
00029
00030
00031
00032 int C2F(readmat)(char *namex,integer *m, integer *n, double *scimat, unsigned long name_len)
00033 {
00034 int j;
00035 j = C2F(creadmat)(namex, m, n, scimat, name_len);
00036 return 0;
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 int C2F(creadmat)(char *namex, integer *m, integer *n, double *scimat, unsigned long name_len)
00062 {
00063 integer l;
00064 integer id[nsiz];
00065
00066 C2F(str2name)(namex, id, name_len);
00067
00068 Fin = -1;
00069 C2F(stackg)(id);
00070 if (Err > 0) return FALSE_ ;
00071 if (Fin == 0) {
00072 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00073 return FALSE_;
00074 }
00075 if ( *Infstk(Fin ) == 2) Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00076
00077 if (! C2F(getrmat)("creadmat", &Fin, &Fin, m, n, &l, 8L)) return FALSE_;
00078
00079 C2F(dmcopy)(stk(l ), m, scimat, m, m, n);
00080
00081 return TRUE_;
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 int C2F(creadcmat)(char *namex, integer *m, integer *n, double *scimat, unsigned long name_len)
00111 {
00112 integer l, ix1;
00113 integer id[nsiz];
00114
00115 C2F(str2name)(namex, id, name_len);
00116
00117 Fin = -1;
00118 C2F(stackg)(id);
00119 if (Err > 0) return FALSE_ ;
00120 if (Fin == 0) {
00121 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00122 return FALSE_;
00123 }
00124 if ( *Infstk(Fin ) == 2) Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00125
00126 if (! C2F(getcmat)("creadcmat", &Fin, &Fin, m, n, &l, 8L)) return FALSE_;
00127 ix1 = *m * *n;
00128 C2F(dmcopy)(stk(l ), m, scimat, m, m, n);
00129 C2F(dmcopy)(stk(l+ix1 ), m, scimat+ix1, m, m, n);
00130
00131 return TRUE_;
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 int C2F(cwritemat)(char *namex, integer *m, integer *n, double *mat, unsigned long name_len)
00144 {
00145 integer ix1 = *m * *n;
00146 integer Rhs_k = Rhs , Top_k = Top ;
00147 integer l4, id[nsiz], lc, lr;
00148
00149 C2F(str2name)(namex, id, name_len);
00150
00151
00152 Top = Top + Nbvars + 1;
00153 if (! C2F(cremat)("cwritemat", &Top, &cx0, m, n, &lr, &lc, 9L)) return FALSE_;
00154 C2F(dcopy)(&ix1, mat, &cx1, stk(lr ), &cx1);
00155 Rhs = 0;
00156 l4 = C2F(iop).lct[3];
00157 C2F(iop).lct[3] = -1;
00158 C2F(stackp)(id, &cx0);
00159 C2F(iop).lct[3] = l4;
00160 Top = Top_k;
00161 Rhs = Rhs_k;
00162 if (Err > 0) return FALSE_;
00163 return TRUE_;
00164 }
00165
00166
00167
00176
00177 int C2F(cwritecmat)(char *namex,integer *m, integer*n,double *mat,unsigned long name_len)
00178 {
00179 integer ix1 = *m * *n *2;
00180 integer Rhs_k = Rhs , Top_k = Top ;
00181 integer l4, id[nsiz], lc, lr;
00182 int IT=1;
00183
00184 C2F(str2name)(namex, id, name_len);
00185
00186 Top = Top + Nbvars + 1;
00187 if (! C2F(cremat)("cwritecmat", &Top, &IT, m, n, &lr, &lc, 10L)) return FALSE_;
00188 C2F(dcopy)(&ix1, mat, &cx1, stk(lr ), &cx1);
00189 Rhs = 0;
00190 l4 = C2F(iop).lct[3];
00191 C2F(iop).lct[3] = -1;
00192 C2F(stackp)(id, &cx0);
00193 C2F(iop).lct[3] = l4;
00194 Top = Top_k;
00195 Rhs = Rhs_k;
00196 if (Err > 0) return FALSE_;
00197 return TRUE_;
00198 }
00199
00200
00201 int C2F(putvar)(int *number,char *namex, unsigned long name_len)
00202 {
00203 integer Rhs_k = Rhs , Top_k = Top ;
00204 integer l4, id[nsiz], cx0_2=1;
00205
00206 C2F(str2name)(namex, id, name_len);
00207 Top = *number + Top -Rhs;
00208 Rhs = 0;
00209 l4 = C2F(iop).lct[3];
00210 C2F(iop).lct[3] = -1;
00211 C2F(stackp)(id, &cx0_2);
00212 C2F(iop).lct[3] = l4;
00213 Top = Top_k;
00214 Rhs = Rhs_k;
00215 if (Err > 0) return FALSE_;
00216 return TRUE_;
00217 }
00218
00219
00220
00221
00222
00223 int C2F(readchain)(char *namex, integer *itslen, char *chai, unsigned long name_len, unsigned long chai_len)
00224 {
00225 int j;
00226 j = C2F(creadchain)(namex, itslen, chai, name_len, chai_len);
00227 return 0;
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248 int C2F(creadchain)(char *namex, integer *itslen, char *chai, unsigned long name_len, unsigned long chai_len)
00249 {
00250 integer ix1;
00251 integer m1, n1;
00252 integer id[nsiz];
00253 integer lr1;
00254 integer nlr1;
00255
00256 Err = 0;
00257 C2F(str2name)(namex, id, name_len);
00258 Fin = -1;
00259 C2F(stackg)(id);
00260 if (Err > 0) return FALSE_ ;
00261 if (Fin == 0) {
00262 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00263 return FALSE_ ;
00264 }
00265 if (*Infstk(Fin ) == 2) {
00266 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00267 }
00268 if (! C2F(getsmat)("creadchain", &Fin, &Fin, &m1, &n1, &cx1, &cx1, &lr1, &nlr1, 10L)) {
00269 return FALSE_;
00270 }
00271 if (m1 * n1 != 1) {
00272 Scierror(999,"creadchain: argument must be a string\r\n");
00273 return FALSE_ ;
00274 }
00275
00276 ix1 = *itslen - 1;
00277 *itslen = Min(ix1,nlr1);
00278 C2F(cvstr)(itslen, istk(lr1 ), chai, &cx1, chai_len);
00279 chai[*itslen] = '\0';
00280 return TRUE_ ;
00281 }
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 int C2F(creadchains)(char *namex, integer *ir, integer *ic, integer *itslen, char *chai, unsigned long name_len, unsigned long chai_len)
00305 {
00306 integer ix1;
00307 integer m1, n1;
00308 integer id[nsiz];
00309 integer lr1;
00310 integer nlr1;
00311
00312 Err = 0;
00313 C2F(str2name)(namex, id, name_len);
00314 Fin = -1;
00315 C2F(stackg)(id);
00316 if (Err > 0) return FALSE_ ;
00317
00318 if (Fin == 0) {
00319 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00320 return FALSE_ ;
00321 }
00322
00323 if (*Infstk(Fin ) == 2) {
00324 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00325 }
00326 if (*ir == -1 && *ic == -1) {
00327 if (! C2F(getsmat)("creadchain", &Fin, &Fin, ir, ic, &cx1, &cx1, &lr1, &nlr1, 10L))
00328 return FALSE_;
00329 else
00330 return TRUE_ ;
00331 } else {
00332 if (! C2F(getsmat)("creadchain", &Fin, &Fin, &m1, &n1, ir, ic, &lr1, &nlr1, 10L)) {
00333 return FALSE_;
00334 }
00335 }
00336 ix1 = *itslen - 1;
00337 *itslen = Min(ix1,nlr1);
00338 C2F(cvstr)(itslen, istk(lr1 ), chai, &cx1, chai_len);
00339 chai[*itslen]='\0';
00340 return TRUE_;
00341 }
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 int C2F(cwritechain)(char *namex, integer *m, char *chai, unsigned long name_len, unsigned long chai_len)
00353 {
00354 integer Rhs_k, Top_k;
00355 integer l4;
00356 integer id[nsiz], lr;
00357 C2F(str2name)(namex, id, name_len);
00358 Top_k = Top;
00359
00360
00361 Top = Top + Nbvars + 1;
00362 if (! C2F(cresmat2)("cwritechain", &Top, m, &lr, 11L)) {
00363 return FALSE_;
00364 }
00365 C2F(cvstr)(m, istk(lr ), chai, &cx0, chai_len);
00366 Rhs_k = Rhs;
00367 Rhs = 0;
00368 l4 = C2F(iop).lct[3];
00369 C2F(iop).lct[3] = -1;
00370 C2F(stackp)(id, &cx0);
00371 C2F(iop).lct[3] = l4;
00372 Top = Top_k ;
00373 Rhs = Rhs_k ;
00374 if (Err > 0) return FALSE_;
00375 return TRUE_ ;
00376 }
00377
00378
00379
00380
00381
00382 int C2F(matptr)(char *namex, integer *m, integer *n, integer *lp, unsigned long name_len)
00383 {
00384 int ix;
00385 ix = C2F(cmatptr)(namex, m, n, lp, name_len);
00386 return 0;
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 int C2F(cmatptr)(char *namex, integer *m,integer *n,integer *lp, unsigned long name_len)
00413 {
00414 integer id[nsiz];
00415 C2F(str2name)(namex, id, name_len);
00416
00417 Fin = -1;
00418 C2F(stackg)(id);
00419 if (Fin == 0) {
00420 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00421 *m = -1;
00422 *n = -1;
00423 return FALSE_;
00424 }
00425
00426 if (*Infstk(Fin ) == 2) {
00427 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00428 }
00429 if (! C2F(getrmat)("creadmat", &Fin, &Fin, m, n, lp, 8L)) {
00430 return FALSE_;
00431 }
00432 return TRUE_ ;
00433 }
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 int C2F(cmatcptr)(char *namex, integer *m, integer *n, integer *lp, unsigned long name_len)
00465 {
00466 integer id[nsiz];
00467 C2F(str2name)(namex, id, name_len);
00468
00469 Fin = -1;
00470 C2F(stackg)(id);
00471 if (Fin == 0) {
00472 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00473 *m = -1;
00474 *n = -1;
00475 return FALSE_;
00476 }
00477
00478 if (*Infstk(Fin ) == 2) {
00479 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00480 }
00481 if (! C2F(getcmat)("creadmat", &Fin, &Fin, m, n, lp, 8L)) {
00482 return FALSE_;
00483 }
00484 return TRUE_ ;
00485 }
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510 int C2F(cmatsptr)(char *namex, integer *m, integer *n,integer *ix,integer *j,integer *lp,integer *nlr, unsigned long name_len)
00511 {
00512 integer id[nsiz];
00513 C2F(str2name)(namex, id, name_len);
00514
00515 Fin = -1;
00516 C2F(stackg)(id);
00517 if (Fin == 0) {
00518 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00519 *m = -1;
00520 *n = -1;
00521 return FALSE_;
00522 }
00523
00524 if (*Infstk(Fin ) == 2) {
00525 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00526 }
00527 if (! C2F(getsmat)("creadmat", &Fin, &Fin, m, n, ix, j, lp, nlr, 8L)) {
00528 return FALSE_;
00529 }
00530 return TRUE_ ;
00531 }
00532
00533
00534
00535
00536
00537
00538
00539 void *Name2ptr(char *namex)
00540 {
00541 int l1; int *loci;
00542 integer id[nsiz];
00543 C2F(str2name)(namex, id, strlen(namex));
00544
00545 Fin = -1;
00546 C2F(stackg)(id);
00547 if (Fin == 0) {
00548 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,strlen(namex)));
00549 return 0;
00550 }
00551
00552 if (*Infstk(Fin ) == 2) {
00553 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00554 }
00555 loci = (int *) stk(*Lstk(Fin));
00556 if (loci[0] < 0)
00557 {
00558 l1 = loci[1];
00559 loci = (int *) stk(l1);
00560 }
00561 return loci;
00562 }
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576 int Name2where(char *namex)
00577 {
00578 int loci;
00579 integer id[nsiz];
00580 C2F(str2name)(namex, id, strlen(namex));
00581
00582 Fin = -1;
00583 C2F(stackg)(id);
00584 if (Fin == 0) {
00585 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,strlen(namex)));
00586 return 0;
00587 }
00588 loci = *Lstk(Fin);
00589 return loci;
00590 }
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600 int C2F(str2name)(char *namex, integer *id, unsigned long name_len)
00601 {
00602 integer ix;
00603 integer lon;
00604 lon = 0;
00605 for (ix = 0 ; ix < (integer) name_len ; ix++ ) {
00606 if ( namex[ix] == '\0') break;
00607 ++lon;
00608 }
00609 C2F(cvname)(id, namex, &cx0, lon);
00610 return 0;
00611 }
00612
00613
00614
00615
00616
00617
00618 int C2F(objptr)(char *namex, integer *lp, integer *fin, unsigned long name_len)
00619 {
00620 integer id[nsiz];
00621 *lp = 0;
00622
00623 C2F(str2name)(namex, id, name_len);
00624
00625 Fin = -1;
00626 C2F(stackg)(id);
00627 if (Fin == 0) {
00628 C2F(putid)(&C2F(recu).ids[(C2F(recu).pt + 1) * nsiz - nsiz], id);
00629
00630
00631 return FALSE_;
00632 }
00633 *fin = Fin;
00634 *lp = *Lstk(Fin );
00635 if (*Infstk(Fin ) == 2) {
00636 *lp = *Lstk(*istk(iadr(*lp) + 1 +1) );
00637 }
00638 return TRUE_;
00639 }
00640
00641
00642
00643 int C2F(creadbmat)(char *namex, integer *m, integer *n, int *scimat, unsigned long name_len)
00644 {
00645 integer l = 0;
00646 integer id[nsiz];
00647 int c_x = 1;
00648 int N = 0;
00649
00650 C2F(str2name)(namex, id, name_len);
00651
00652 Fin = -1;
00653 C2F(stackg)(id);
00654 if (Err > 0) return FALSE_ ;
00655 if (Fin == 0) {
00656 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00657 return FALSE_;
00658 }
00659 if ( *Infstk(Fin ) == 2) Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00660
00661
00662 if (! C2F(getbmat)("creadbmat", &Fin, &Fin, m, n, &l , 9L)) return FALSE_;
00663
00664 N = *n * *m;
00665 C2F(icopy)(&N,istk(l),&c_x,scimat,&c_x);
00666
00667 return TRUE_;
00668 }
00669
00670 int C2F(cwritebmat)(char *namex, integer *m, integer *n, int *mat, unsigned long name_len)
00671 {
00672 integer ix1 = *m * *n;
00673 integer Rhs_k = Rhs , Top_k = Top ;
00674 integer l4, id[nsiz], lr;
00675
00676 C2F(str2name)(namex, id, name_len);
00677 Top = Top + Nbvars + 1;
00678 if (! C2F(crebmat)("cwritebmat", &Top, m, n, &lr, 10L)) return FALSE_;
00679
00680 C2F(icopy)(&ix1, mat, &cx1, istk(lr ), &cx1);
00681 Rhs = 0;
00682 l4 = C2F(iop).lct[3];
00683 C2F(iop).lct[3] = -1;
00684 C2F(stackp)(id, &cx0);
00685 C2F(iop).lct[3] = l4;
00686 Top = Top_k;
00687 Rhs = Rhs_k;
00688 if (Err > 0) return FALSE_;
00689 return TRUE_;
00690
00691 }
00692
00693 int C2F(cmatbptr)(char *namex, integer *m,integer *n,integer *lp, unsigned long name_len)
00694 {
00695 integer id[nsiz];
00696 C2F(str2name)(namex, id, name_len);
00697
00698 Fin = -1;
00699 C2F(stackg)(id);
00700 if (Fin == 0)
00701 {
00702 Scierror(4,"Undefined variable %s\r\n",get_fname(namex,name_len));
00703 *m = -1;
00704 *n = -1;
00705 return FALSE_;
00706 }
00707
00708 if (*Infstk(Fin ) == 2)
00709 {
00710 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00711 }
00712
00713 if (! C2F(getbmat)("creadbmat", &Fin, &Fin, m, n, lp , 9L)) return FALSE_;
00714
00715 return TRUE_ ;
00716 }
00717
00718
00726 int getlengthchain(char *namex)
00727 {
00728 int retLength = -1;
00729
00730 integer m1, n1;
00731 integer id[nsiz];
00732 integer lr1;
00733 integer nlr1;
00734 unsigned long name_len= strlen(namex);
00735
00736 Err = 0;
00737 C2F(str2name)(namex, id, name_len);
00738 Fin = -1;
00739 C2F(stackg)(id);
00740 if (Err > 0) return -1;
00741 if (Fin == 0) return -1;
00742
00743
00744 if (*Infstk(Fin ) == 2)
00745 {
00746 Fin = *istk(iadr(*Lstk(Fin )) + 1 +1);
00747 }
00748
00749 if (! C2F(getsmat)("getlengthchain", &Fin, &Fin, &m1, &n1, &cx1, &cx1, &lr1, &nlr1, 14L)) return -1;
00750
00751 if (m1 * n1 != 1) return -1;
00752 retLength = nlr1;
00753
00754 return retLength;
00755
00756 }
00757