00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #pragma ident "@(#) libf/fio/rnl90.c 92.9 10/12/99 13:16:22"
00043
00044 #include <stdio.h>
00045 #include <errno.h>
00046 #include <liberrno.h>
00047 #include <fortran.h>
00048 #include <stdlib.h>
00049 #include <cray/fmtconv.h>
00050 #include <cray/nassert.h>
00051 #if !defined(_ABSOFT)
00052 #include <sys/unistd.h>
00053 #endif
00054 #include "fio.h"
00055 #include "namelist.h"
00056 #include "rnl90def.h"
00057
00058
00059 extern int _s_scan_extensions(void *ptr, ftype_t type,
00060 unsigned long elsize, long *field_begin,
00061 unsigned long rec_chars, int *fwptr, long cmode);
00062 extern int _nicverr(const int _Nicverror);
00063
00064
00065
00066
00067
00068
00069
00070 #define SUBGTC(x) { \
00071 while (cup->ulinecnt == 0) { \
00072 if (errn = _nlrd_fillrec(css, cup)) { \
00073 return(errn); \
00074 } \
00075 } \
00076 x = (char) *cup->ulineptr++; \
00077 cup->ulinecnt--; \
00078 }
00079
00080 #define SUBGTCNOEOR(x) { \
00081 if (!cup->ulinecnt) { \
00082 x = ' '; \
00083 } else { \
00084 x = (char) *cup->ulineptr++; \
00085 cup->ulinecnt--; \
00086 } \
00087 }
00088
00089
00090
00091
00092
00093
00094
00095 #define CMTE_SUBGTC(x) { \
00096 while (cup->ulinecnt == 0) { \
00097 if (errn = _nlrd_fillrec(css, cup)) { \
00098 return(errn); \
00099 } \
00100 } \
00101 x = (char) *cup->ulineptr++; \
00102 if (x == '!') { \
00103 x = ' '; \
00104 cup->ulinecnt = 1; \
00105 } \
00106 cup->ulinecnt--; \
00107 }
00108
00109 #define CMTE_SUBGTCNOEOR(x) { \
00110 if (!cup->ulinecnt) { \
00111 x = ' '; \
00112 } else { \
00113 x = (char) *cup->ulineptr++; \
00114 cup->ulinecnt--; \
00115 } \
00116 if (x == '!') { \
00117 x = ' '; \
00118 cup->ulinecnt = 0; \
00119 } \
00120 }
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 #define MAINGT(x) { \
00131 while (cup->ulinecnt == 0) { \
00132 if (errn = _nlrd_fillrec(css, cup)) { \
00133 if (errn < 0) { \
00134 ENDD(endf, css, FERDPEOF); \
00135 } \
00136 else { \
00137 ERROR0(errf, css, errn); \
00138 } \
00139 } \
00140 } \
00141 x = (char) *cup->ulineptr++; \
00142 cup->ulinecnt--; \
00143 }
00144
00145 #define CMTE_MAINGT(x) { \
00146 while (cup->ulinecnt == 0) { \
00147 if (errn = _nlrd_fillrec(css, cup)) { \
00148 if (errn < 0) { \
00149 ENDD(endf, css, FERDPEOF); \
00150 } \
00151 else { \
00152 ERROR0(errf, css, errn); \
00153 } \
00154 } \
00155 } \
00156 x = (char) *cup->ulineptr++; \
00157 \
00158 if (x == '!') { \
00159 x = ' '; \
00160 cup->ulinecnt = 1; \
00161 } \
00162 cup->ulinecnt--; \
00163 }
00164
00165 #define GETSECTION(x) { \
00166 field_begin = cup->ulineptr; \
00167 field_end = cup->ulineptr; \
00168 for (j = 0; j < cup->ulinecnt; j++) { \
00169 x = (char) *field_end; \
00170 if (x == ')' || x == ',' || x == ':') \
00171 break; \
00172 field_end++; \
00173 } \
00174 field_width = j; \
00175 }
00176
00177
00178
00179
00180
00181 ic_func *ncf_tab90[] = {
00182 NULL,
00183 NULL,
00184 _iu2s,
00185 _defgu2sd,
00186 _defgu2sd,
00187 NULL,
00188 NULL,
00189 };
00190
00191 static int _nlrd_fillrec(FIOSPTR css, unit *cup);
00192
00193 static int _getname(FIOSPTR css, unit *cup, char *buf, char *lastc);
00194
00195 static void _cnvrt_toupper(char *bufr);
00196
00197 static nmlist_goli_t *_findname(char *key, nmlist_goli_t *nlvar,
00198 unsigned countitm);
00199
00200 static int _getnlval(FIOSPTR css, nmlist_goli_t *nlvar, char *lastc,
00201 unit *cup);
00202
00203 static int _indx_nl(FIOSPTR css, unit *cup, struct DvDimen *dvdn,
00204 int *ndim, long strbegend[3], int *encnt, int *icnt, int arryflag);
00205
00206 static int _nlrdent(FIOSPTR css,unit *cup,nmlist_goli_t *nalist,
00207 unsigned count, char *lastc, int byt);
00208
00209 static int _nlread(FIOSPTR css, ftype_t type, unit *cup, void *ptr,
00210 long elsize, int cnt, int inc, char *lastc);
00211
00212 static int _nexdata(FIOSPTR css, ftype_t type, void *ptr, int cnt, int inc,
00213 char lastc, unit *cup, long *lval, int *lcount, long elsize, int *nullvlu);
00214
00215 static int _g_charstr(FIOSPTR css, unit *cup, void *p, int cnt, char c,
00216 int lcount, long elsize, int *nullvlu);
00217
00218 static int _g_complx(FIOSPTR css, unit *cup, ftype_t type, long *lval,
00219 long elsize);
00220
00221 static int _g_number(ftype_t type, unit *cup,long *lval, long elsize);
00222
00223 static int _gocthex(FIOSPTR css, unit *cup, ftype_t type, long *lval, int base,
00224 long elsize, int *nullvlu);
00225
00226 static int _get_holl(FIOSPTR css, unit *cup, char holltype, int count,
00227 ftype_t type, long *lval, long elsize);
00228
00229 static int _get_quoholl(FIOSPTR css, unit *cup, char cdelim, ftype_t type,
00230 long *lval, long elsize);
00231
00232 static int _nl_stride_dv(FIOSPTR css, unit *cup, DopeVectorType *dv,
00233 struct DvDimen *sectn, char *lastc, long strbegend[3]);
00234
00235 static int _nl_strd_derv( FIOSPTR css, unit *cup, DopeVectorType *dv,
00236 struct DvDimen *sectn, char *lastch, nmlist_goli_t *vdr,
00237 unsigned int cnt, long bte);
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 int
00259 _FRN(ControlListType *cilist, nmlist_group *namlist, void *stck)
00260 {
00261 char buf[MAXNAML + 5], c;
00262 int errf;
00263 int endf;
00264 int errn;
00265 register unum_t unum;
00266 unit *cup;
00267 unsigned long rlen;
00268 unsigned long rcount;
00269 char *rptr;
00270 char *varptr;
00271 unsigned long varlen;
00272 nmlist_goli_t *nlvar;
00273 nmlist_goli_t *fdvar;
00274 ftype_t type;
00275 char endnmlchar;
00276 FIOSPTR css;
00277
00278
00279
00280 assert ( cilist->stksize >= sizeof(struct fiostate)/sizeof(long) );
00281
00282
00283 assert( (cilist->fmt == CI_NAMELIST));
00284
00285
00286 assert( !(cilist->internal && cilist->fmt == CI_NAMELIST));
00287
00288
00289 assert( !(cilist->dflag && cilist->fmt == CI_NAMELIST));
00290
00291 css = stck;
00292 errn = 0;
00293 type = DVTYPE_UNUSED;
00294 varptr = NULL;
00295
00296
00297
00298
00299
00300
00301 errf = (cilist->errflag || cilist->iostatflg);
00302 endf = (cilist->endflag || cilist->iostatflg);
00303
00304 if (cilist->uflag == CI_UNITASTERK)
00305 unum = STDIN_U;
00306 else
00307 unum = *cilist->unit.wa;
00308
00309 STMT_BEGIN(unum, 0, T_RNL, NULL, css, cup);
00310
00311 if (cup == NULL) {
00312 cup = _imp_open(css, SEQ, FMT, unum, errf, &errn);
00313
00314
00315
00316
00317 if (cup == NULL)
00318 goto finalization;
00319 }
00320
00321 assert (cup != NULL);
00322
00323
00324 cup->uflag = (cilist->errflag ? _UERRF : 0) |
00325 (cilist->endflag ? _UENDF : 0) |
00326 (cilist->iostat_spec != NULL ? _UIOSTF : 0);
00327 css->u.fmt.nonadv = 0;
00328
00329
00330 if ((cup->uaction & OS_READ) == 0) {
00331 errn = FENOREAD;
00332 ERROR0(errf, css, errn);
00333 }
00334
00335 if (!cup->ufmt) {
00336 errn = FEFMTTIV;
00337 ERROR0(errf, css, errn);
00338 }
00339
00340 if (cup->useq && cup->uwrt != 0) {
00341 errn = FERDAFWR;
00342 ERROR0(errf, css, errn);
00343 }
00344
00345
00346
00347 cup->uwrt = 0;
00348
00349
00350
00351 css->u.fmt.icp = NULL;
00352 css->u.fmt.blank0 = cup->ublnk;
00353 css->u.fmt.lcomma = 0;
00354 css->u.fmt.slash = 0;
00355
00356 if (cup->useq == 0) {
00357 errn = FESEQTIV;
00358 ERROR0(errf, css, errn);
00359 }
00360
00361 if (cup->uend && !cup->umultfil) {
00362 errn = FERDENDR;
00363 ERROR0(endf, css, errn);
00364 }
00365
00366 css->u.fmt.endrec = _sr_endrec;
00367
00368 if (cup->pnonadv == 0)
00369 errn = (*css->u.fmt.endrec)(css, cup, 1);
00370 else
00371 css->u.fmt.leftablim = cup->ulineptr;
00372
00373 if (errn != 0)
00374 if (errn < 0 ) {
00375 ENDD(endf, css, FERDPEOF);
00376 }
00377 else {
00378 ERROR0(errf, css, errn);
00379 }
00380 cup->pnonadv = css->u.fmt.nonadv;
00381
00382
00383
00384
00385
00386 #if defined(__mips) || !defined(_WORD32)
00387 if (!(cup->uft90)) {
00388 errn = _rnl90to77(css, cup, namlist, stck, errf, endf);
00389 goto finalization;
00390
00391 }
00392 #endif
00393 skiprec:
00394 while (cup->ulinecnt == 0) {
00395 errn = _nlrd_fillrec(css, cup);
00396 if (errn != 0)
00397 goto err_eof;
00398 }
00399 rrd:
00400 do {
00401 CMTE_MAINGT(c)
00402 } while (ISBLANK(c));
00403 if (c != '&' && c != '$') {
00404
00405
00406
00407
00408
00409 if ((cup->ufnl_skip != 0) ||
00410 (cup->ufcompat == AS_IRIX_F77) ||
00411 (cup->ufcompat == AS_IRIX_F90)) {
00412 cup->ulinecnt = 0;
00413 goto skiprec;
00414 }
00415 errn = FENLONEC;
00416 ERROR0(errf, css, errn);
00417 }
00418
00419 endnmlchar = c;
00420
00421
00422 MAINGT(c);
00423
00424 errn = _getname(css, cup, buf, &c);
00425 if (errn != 0)
00426 goto err_eof;
00427
00428 _cnvrt_toupper(buf);
00429
00430 assert ( (cup != NULL));
00431 rcount = namlist->icount;
00432 rptr = _fcdtocp(namlist->group_name);
00433 rlen = _fcdlen(namlist->group_name);
00434 nlvar = namlist->goli;
00435
00436 if (strncmp(rptr,buf,rlen)) {
00437 if (cup->ufnl_skip == 0) {
00438 errn = FENLIVGP;
00439 ERROR1(errf, css, errn, buf);
00440 }
00441
00442
00443
00444
00445 while (c != '/') {
00446
00447
00448
00449
00450 if (c == '&' || c == '$') {
00451
00452
00453
00454
00455
00456 if (c == endnmlchar) {
00457
00458
00459 #ifdef KEY
00460
00461
00462
00463 char c_e, c_n, c_d;
00464 MAINGT(c_e);
00465 MAINGT(c_n);
00466 MAINGT(c_d);
00467 if (tolower(c_e) != 'e' ||
00468 tolower(c_n) != 'n' ||
00469 tolower(c_d) != 'd') {
00470 errn = FERDNLEF;
00471 ERROR1(errf, css, errn, buf);
00472 }
00473 #else
00474 do {
00475 MAINGT(c);
00476 } while (!ISBLANK(c));
00477 #endif
00478 goto rrd;
00479 }
00480 }
00481
00482
00483 if ((c == '\'') || (c == '"')) {
00484 char qcr;
00485 qcr = c;
00486 rqte:
00487 do {
00488 MAINGT(c);
00489 } while (c != qcr);
00490 MAINGT(c);
00491
00492 if (c == qcr)
00493 goto rqte;
00494 } else {
00495 CMTE_MAINGT(c);
00496 }
00497 }
00498
00499 goto rrd;
00500 }
00501
00502
00503
00504
00505
00506
00507 while (c != '/') {
00508 int sepcnt;
00509 if (c == '&' || c == '$') {
00510 if (c != endnmlchar) {
00511
00512 errn = FENLONEC;
00513 ERROR0(errf, css, errn);
00514 }
00515 else
00516 goto finalization;
00517 }
00518
00519 errn = _getname(css, cup, buf, &c);
00520 if (errn != 0)
00521 goto err_eof;
00522 _cnvrt_toupper(buf);
00523
00524 if (!(fdvar = _findname(buf, nlvar, rcount))) {
00525 if (strlen(buf) > 0) {
00526
00527 errn = FENLNREC;
00528 ERROR1(errf, css, errn, buf);
00529 }
00530 else {
00531
00532 errn = 0;
00533 goto finalization;
00534 }
00535 }
00536
00537
00538
00539
00540 while (c == '%') {
00541 nmlist_struclist_t *nlstruc;
00542 unsigned scount;
00543 nmlist_goli_t *vaddr;
00544 assert ((fdvar->valtype == IO_STRUC_A) ||
00545 (fdvar->valtype == IO_STRUC_S));
00546 if ((fdvar->valtype == IO_SCALAR) ||
00547 (fdvar->valtype == IO_DOPEVEC)) {
00548
00549
00550
00551 errn = FENLNREC;
00552 ERROR1(errf, css, errn, buf);
00553 }
00554
00555 nlstruc = fdvar->goli_addr.sptr;
00556 vaddr = nlstruc->goli;
00557 scount = nlstruc->structlen;
00558
00559
00560
00561
00562 MAINGT(c);
00563 errn = _getname(css, cup, buf, &c);
00564 if (errn != 0)
00565 goto err_eof;
00566 _cnvrt_toupper(buf);
00567
00568
00569
00570
00571 if (!(fdvar = _findname(buf, vaddr, scount))) {
00572 if (strlen(buf) > 0) {
00573
00574 errn = FENLNREC;
00575 ERROR1(errf, css, errn, buf);
00576 }
00577 else {
00578
00579 errn = 0;
00580 goto finalization;
00581 }
00582 }
00583 }
00584
00585
00586
00587 errn = _getnlval(css, fdvar, &c, cup);
00588 if (errn != 0)
00589 goto err_eof;
00590 sepcnt = 0;
00591 for ( ; ; ) {
00592 if (!(ISBLANK(c))) {
00593 if ((c == ',') && (sepcnt == 0)) {
00594
00595 sepcnt++;
00596 }
00597 else
00598 break;
00599 }
00600 CMTE_MAINGT(c);
00601 }
00602 }
00603
00604
00605
00606
00607 finalization:
00608
00609
00610 if (cilist->iostat_spec != NULL)
00611 *cilist->iostat_spec = errn;
00612
00613
00614 STMT_END(cup, TF_READ, NULL, css);
00615
00616
00617 if (errn == 0)
00618 return(IO_OKAY);
00619 else if (errn < 0) {
00620 cup->pnonadv = 0;
00621 return(IO_END);
00622 }
00623 return(IO_ERR);
00624 err_eof:
00625
00626 if(errn < 0) {
00627 ENDD(endf, css, FERDPEOF);
00628 } else if (errn == FENLSTRN || errn == FENLSTRG ||
00629 errn == FENLSUBD || errn == FENLSUBN ||
00630 errn == FENLSUBS || errn == FENLLGNM ||
00631 errn == FENLUNKI || errn == FENLUNKN) {
00632 ERROR1(errf, css, errn, buf);
00633 } else {
00634 ERROR0(errf, css, errn);
00635 }
00636 goto finalization;
00637 }
00638
00639
00640
00641
00642
00643
00644
00645
00646 static int
00647 _nlrd_fillrec(FIOSPTR css, unit *cup)
00648 {
00649 register int errn;
00650
00651 errn = css->u.fmt.endrec(css, cup, 1);
00652
00653 return(errn);
00654 }
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671 static int
00672 _getname(FIOSPTR css, unit *cup, char *s, char *lastc)
00673 {
00674 char *p, c;
00675 int n, errn;
00676 errn = 0;
00677 n = MAXNAML + 5;
00678 p = s;
00679 c = *lastc;
00680
00681
00682
00683
00684
00685
00686
00687
00688 while (ISBLANK(c))
00689 CMTE_SUBGTC(c);
00690 while (!(ISBLANK(c)) && c != '(' && c != '=' && c != '/' &&
00691 c != '&' && c != '%' && c != '$') {
00692 *p++ = c;
00693 CMTE_SUBGTCNOEOR(c);
00694 if (n-- == 0) {
00695 errn = FENLLGNM;
00696 p--;
00697 break;
00698 }
00699 }
00700 *lastc = c;
00701 *p = '\0';
00702 return (errn);
00703 }
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715 static nmlist_goli_t
00716 *_findname(char *key, nmlist_goli_t *nlvar, unsigned countitm)
00717 {
00718 char *varptr;
00719 unsigned varlen;
00720 nmlist_goli_t *newitem;
00721 int cnt, lcnt;
00722 newitem = nlvar;
00723 cnt = countitm;
00724 lcnt = strlen(key);
00725 while (cnt--) {
00726 varptr = _fcdtocp(newitem->goli_name);
00727 varlen = _fcdlen(newitem->goli_name);
00728 if ((varlen == lcnt) && (!strncmp(key, varptr, lcnt)))
00729 return (newitem);
00730 else {
00731
00732
00733
00734 #if (defined(__mips) && (_MIPS_SZLONG == 32)) || (defined(_LITTLE_ENDIAN) && !defined(_LP64))
00735 newitem = (nmlist_goli_t*)((long *)newitem +
00736 3 + (sizeof(_fcd))/(sizeof(long)));
00737 #else
00738 newitem = (nmlist_goli_t*)((long *)newitem +
00739 2 + (sizeof(_fcd))/(sizeof(long)));
00740 #endif
00741 }
00742 }
00743 return (NULL);
00744 }
00745
00746 #ifdef KEY
00747
00748
00749
00750
00751
00752
00753 static int
00754 bounds_ok(struct DvDimen *dvdm, struct DvDimen *dimnsn, int ndim) {
00755
00756 int nc;
00757 for (nc = 0; nc < ndim; nc++) {
00758 if (dvdm[nc].extent) {
00759 int lb = dimnsn[nc].low_bound;
00760 int ext = (dimnsn[nc].stride_mult < 0) ?
00761 (-dimnsn[nc].extent) :
00762 dimnsn[nc].extent;
00763 int glb = dvdm[nc].low_bound;
00764 if (dimnsn[nc].stride_mult < 0) {
00765 if (lb >= (glb + dvdm[nc].extent) || (lb - ext + 1) < glb) {
00766 return 0;
00767 }
00768 } else {
00769 if (lb < glb || ((lb + ext) > (glb + dvdm[nc].extent))) {
00770 return 0;
00771 }
00772 }
00773 }
00774 }
00775 return 1;
00776 }
00777 #endif
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792 static int
00793 _getnlval(FIOSPTR css, nmlist_goli_t *nlvar, char *lastc, unit *cup)
00794 {
00795 long cntp = 0;
00796 int i;
00797 int ndim = 0;
00798 int encnt = 0;
00799 int icnt = 0;
00800 long strbegend[3];
00801 char *cp;
00802 char c;
00803 long vaddr;
00804 long errn = 0;
00805 struct DvDimen dimnsn[MAXDIM];
00806 struct DvDimen *dvdn = dimnsn;
00807
00808
00809 for (i=0; i < MAXDIM; i++) {
00810 dimnsn[i].stride_mult = 0;
00811 dimnsn[i].extent = 0;
00812 dimnsn[i].low_bound = 0;
00813 }
00814 strbegend[0] = -1;
00815 strbegend[1] = -1;
00816 strbegend[2] = -1;
00817
00818 switch (nlvar->valtype) {
00819 case IO_SCALAR:
00820 {
00821 nmlist_scalar_t *nlscalar;
00822 unsigned long elsize;
00823 unsigned int int_len;
00824 void *vaddr;
00825 ftype_t type;
00826 nlscalar = nlvar->goli_addr.ptr;
00827 type = nlscalar->tinfo.type;
00828 int_len = nlscalar->tinfo.int_len;
00829
00830 assert (type >= DVTYPE_TYPELESS && type <= DVTYPE_ASCII);
00831 assert(nlscalar->tinfo.int_len > 0 );
00832 if ((type != DVTYPE_ASCII) && (*lastc == '(')) {
00833 errn = FENLUNKI;
00834 break;
00835 }
00836 if (type == DVTYPE_ASCII)
00837 strbegend[0] = 0;
00838 if (*lastc == '(') {
00839 errn = _indx_nl(css, cup, dvdn, &ndim, strbegend,
00840 &encnt, &icnt, 0);
00841 if (errn != 0) {
00842 if (errn == FENLSUBS)
00843 errn = FENLSTRG;
00844 else if (errn == FENLSUBN)
00845 errn = FENLSTRN;
00846 break;
00847 }
00848 } else {
00849 while (ISBLANK(*lastc)) {
00850 CMTE_SUBGTC(*lastc);
00851 }
00852
00853 if ((*lastc == '/') || (*lastc == '&') || (*lastc == '$')) {
00854 errn = 0;
00855 break;
00856 }
00857
00858 if (*lastc != '=') {
00859 errn = FENLNOVL;
00860 break;
00861 }
00862 }
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874 CMTE_SUBGTC(*lastc);
00875 if (type == DVTYPE_ASCII) {
00876 char *wptr;
00877 const int bytesperchar = 1;
00878 long begt = strbegend[1];
00879 long endt = strbegend[2];
00880 wptr = _fcdtocp(nlscalar->scal_addr.charptr);
00881 elsize = _fcdlen(nlscalar->scal_addr.charptr);
00882 elsize = elsize * bytesperchar;
00883
00884 if (strbegend[0] > 0) {
00885 if (begt < 1 )
00886 begt = 1;
00887 else if (begt > elsize) {
00888 errn = FENLUNKN;
00889 break;
00890 }
00891 if (endt < 1 )
00892 endt = elsize;
00893 else if ((endt > elsize) || (endt < begt)) {
00894 errn = FENLUNKN;
00895 break;
00896 }
00897 wptr = wptr + (begt - 1);
00898 elsize = (endt - begt) + 1;
00899 }
00900 vaddr = wptr;
00901 }
00902 else {
00903 vaddr = nlscalar->scal_addr.ptr;
00904 elsize = int_len >> 3;
00905 }
00906 c = *lastc;
00907 cntp = 1;
00908 errn = _nlread(css, type, cup, vaddr, elsize, cntp, 0, &c);
00909 *lastc = c;
00910 break;
00911 }
00912 case IO_DOPEVEC:
00913 {
00914 DopeVectorType *nldv;
00915 ftype_t type;
00916 nldv = nlvar->goli_addr.dv;
00917
00918 assert ( nldv != NULL );
00919 assert ( nldv->type_lens.int_len > 0 );
00920 type = nldv->type_lens.type;
00921 if (type == DVTYPE_ASCII)
00922 strbegend[0] = 0;
00923 for (i=0; i < nldv->n_dim; i++) {
00924 dimnsn[i].stride_mult = nldv->dimension[i].stride_mult;
00925 dimnsn[i].extent = nldv->dimension[i].extent;
00926 dimnsn[i].low_bound = nldv->dimension[i].low_bound;
00927 }
00928 if (*lastc == '(') {
00929 errn = _indx_nl(css, cup, dvdn, &ndim, strbegend,
00930 &encnt, &icnt, 1);
00931 if (errn != 0)
00932 break;
00933 } else {
00934 while (ISBLANK(*lastc)) {
00935 CMTE_SUBGTC(*lastc);
00936 }
00937
00938 if ((*lastc == '/') || (*lastc == '&') || (*lastc == '$')) {
00939 errn = 0;
00940 break;
00941 }
00942
00943 if (*lastc != '=') {
00944 errn = FENLNOVL;
00945 break;
00946 }
00947 }
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959 CMTE_SUBGTC(*lastc);
00960 if ((ndim != 0) && (ndim != nldv->n_dim)) {
00961 errn = FENLBNDY;
00962 break;
00963 }
00964
00965
00966 if (ndim != 0) {
00967 struct DvDimen *dvdm = nldv->dimension;
00968 void *vaddr;
00969 long extent = 1;
00970 long elsize;
00971 long mult = 1;
00972 long offs = 0;
00973 long incrmt;
00974 int int_len = nldv->type_lens.int_len;
00975 register long nc;
00976 for (nc = 0; nc < nldv->n_dim; nc++) {
00977 extent *= dvdm[nc].extent;
00978 }
00979
00980
00981 if (encnt == 0 && icnt == 0) {
00982 #ifdef KEY
00983 if (!bounds_ok(dvdm, dimnsn, ndim)) {
00984 return(FENLBNDY);
00985 }
00986 #endif
00987 offs = dimnsn[0].low_bound - (dvdm[0].low_bound);
00988 incrmt = 1;
00989 for (nc = 1; nc < ndim; nc++) {
00990 mult = mult * (dvdm[nc-1].extent);
00991 offs = offs +
00992 ((dimnsn[nc].low_bound -
00993 dvdm[nc].low_bound) * mult);
00994 }
00995 extent = extent - offs;
00996 if (type == DVTYPE_ASCII) {
00997 char *wptr;
00998 const int bytesperchar = 1;
00999 long begt = strbegend[1];
01000 long endt = strbegend[2];
01001 wptr =
01002 _fcdtocp(nldv->base_addr.charptr);
01003 elsize =
01004 _fcdlen(nldv->base_addr.charptr);
01005 elsize = elsize * bytesperchar;
01006
01007
01008
01009 wptr += offs * elsize;
01010
01011 if (strbegend[0] > 0) {
01012 if (begt < 1 )
01013 begt = 1;
01014 else if (begt > elsize) {
01015 errn = FENLUNKN;
01016 break;
01017 }
01018 if (endt < 1 )
01019 endt = elsize;
01020 else if ((endt >
01021 elsize) ||
01022 (endt < begt)) {
01023 errn = FENLUNKN;
01024 break;
01025 }
01026 wptr = wptr + (begt - 1);
01027 elsize = (endt - begt) + 1;
01028 }
01029
01030 vaddr = wptr;
01031 } else {
01032 bcont *iwptr;
01033 iwptr = (bcont*)nldv->base_addr.a.ptr;
01034 elsize = int_len >> 3;
01035 iwptr += offs * (elsize /
01036 (sizeof(bcont)));
01037 vaddr = iwptr;
01038 }
01039
01040 assert ( elsize > 0 && extent > 0 );
01041 c = *lastc;
01042 cntp = extent;
01043 errn = _nlread(css, type, cup, vaddr,
01044 elsize, cntp, incrmt, &c);
01045 *lastc = c;
01046 } else {
01047 #ifdef KEY
01048 if (!bounds_ok(dvdm, dimnsn, ndim)) {
01049 return(FENLBNDY);
01050 }
01051 #endif
01052 for (nc = 0; nc < ndim; nc++) {
01053 #ifndef KEY
01054 if (dimnsn[nc].extent !=
01055 dvdm[nc].extent) {
01056 if (dimnsn[nc].extent >
01057 dvdm[nc].extent) {
01058 return(FENLBNDY);
01059 }
01060 }
01061 #endif
01062 #ifdef KEY
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078 dimnsn[nc].stride_mult =
01079 dimnsn[nc].stride_mult *
01080 dvdm[nc].stride_mult;
01081 #else
01082 if (dimnsn[nc].stride_mult !=
01083 dvdm[nc].stride_mult) {
01084 dimnsn[nc].stride_mult =
01085 dimnsn[nc].stride_mult *
01086 dvdm[nc].stride_mult;
01087 }
01088 #endif
01089 }
01090 c = *lastc;
01091 errn = _nl_stride_dv(css, cup, nldv,
01092 dvdn, &c, strbegend);
01093 *lastc = c;
01094 }
01095
01096
01097 } else if (type != DVTYPE_ASCII) {
01098 int n_dm = nldv->n_dim;
01099 unsigned long elsize = nldv->type_lens.int_len >> 3;
01100 unsigned long extent = nldv->dimension[0].extent;
01101 struct DvDimen *dvdm = nldv->dimension;
01102 long incrmt;
01103
01104 if (n_dm != 1) {
01105 register long nc;
01106 if (n_dm == 2) {
01107 if (dvdm[0].stride_mult * extent !=
01108 dvdm[1].stride_mult)
01109 goto gen_dv_process;
01110 extent *= dvdm[1].extent;
01111 } else if (n_dm == 0) {
01112 extent = 1;
01113 } else {
01114 for (nc = 0; nc < (n_dm-1); nc++) {
01115 register int st =
01116 dvdm[nc].stride_mult;
01117 register int ex =
01118 dvdm[nc].extent;
01119 if ( (st * ex) !=
01120 dvdm[nc+1].stride_mult)
01121 goto gen_dv_process;
01122 extent *= dvdm[nc+1].extent;
01123 }
01124 }
01125 }
01126 if (extent > 1) {
01127 register long sm =
01128 nldv->dimension[0].stride_mult;
01129 if (sm * (signed)SMSCALE(nldv) == elsize)
01130 incrmt = 1;
01131 else {
01132 int bytes_per_sm = sm *
01133 (signed)SMSCALE(nldv);
01134 incrmt = bytes_per_sm / elsize;
01135
01136 if (elsize * incrmt != bytes_per_sm)
01137 goto gen_dv_process;
01138 }
01139 } else
01140 incrmt = 0;
01141
01142
01143 assert ( elsize > 0 && extent > 0 );
01144 c = *lastc;
01145 errn = _nlread(css, type, cup,
01146 nldv->base_addr.a.ptr, elsize, extent,
01147 incrmt, &c);
01148 *lastc = c;
01149 } else {
01150 gen_dv_process:
01151 c = *lastc;
01152 errn = _nl_stride_dv(css, cup, nldv, 0, &c, strbegend);
01153 *lastc = c;
01154 }
01155 break;
01156 }
01157 case IO_STRUC_A:
01158 {
01159 nmlist_struclist_t *nlstruc;
01160 unsigned long elsize;
01161 unsigned int int_len;
01162 unsigned int scount;
01163 char *cp;
01164 nmlist_goli_t *vaddr;
01165 ftype_t type;
01166 int byt = 0;
01167 nlstruc = nlvar->goli_addr.sptr;
01168 vaddr = nlstruc->goli;
01169 scount = nlstruc->structlen;
01170 if (*lastc == '(') {
01171
01172 errn = FENLUNKI;
01173 break;
01174 } else {
01175 while (ISBLANK(*lastc)) {
01176 CMTE_SUBGTC(*lastc);
01177 }
01178
01179 if ((*lastc == '/') || (*lastc == '&') ||
01180 (*lastc == '$')) {
01181 errn = 0;
01182 break;
01183 }
01184
01185 if (*lastc == '%') {
01186 errn = FENLIOER;
01187 break;
01188 } else if (*lastc != '=') {
01189 errn = FENLNOVL;
01190 break;
01191 }
01192 }
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204 CMTE_SUBGTC(*lastc);
01205 cp = lastc;
01206 errn = _nlrdent(css, cup, vaddr, scount, cp, byt);
01207 *lastc = *cp;
01208 break;
01209 }
01210 case IO_STRUC_S:
01211 {
01212 nmlist_struclist_t *nlstruc;
01213 unsigned long elsize;
01214 unsigned int int_len;
01215 unsigned int scount;
01216 int nc;
01217 long ic;
01218 char *cp;
01219 long extnt = 1;
01220 nmlist_goli_t *vaddr;
01221 DopeVectorType *nlsdv;
01222 ftype_t type;
01223 int byt = 0;
01224 unsigned int compflag = 0;
01225 nmlist_goli_t *fdvar;
01226 char abuf[MAXNAML + 5];
01227 nlstruc = nlvar->goli_addr.sptr;
01228
01229
01230 scount = nlstruc->structlen;
01231
01232
01233 vaddr = nlstruc->goli;
01234 fdvar = nlvar;
01235
01236
01237 nlsdv = nlstruc->struc_addr.dv;
01238 elsize = nlsdv->base_addr.a.el_len;
01239 type = nlsdv->type_lens.type;
01240
01241 for (i=0; i < nlsdv->n_dim; i++) {
01242 dimnsn[i].stride_mult = nlsdv->dimension[i].stride_mult;
01243 dimnsn[i].extent = nlsdv->dimension[i].extent;
01244 dimnsn[i].low_bound = nlsdv->dimension[i].low_bound;
01245 }
01246 if (*lastc == '(') {
01247 errn = _indx_nl(css, cup, dvdn, &ndim, strbegend,
01248 &encnt, &icnt, 1);
01249 if (errn != 0)
01250 break;
01251 } else {
01252 while (ISBLANK(*lastc)) {
01253 CMTE_SUBGTC(*lastc);
01254 }
01255
01256 if ((*lastc == '/') || (*lastc == '&') ||
01257 (*lastc == '$')) {
01258 errn = 0;
01259 break;
01260 }
01261 }
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278 CMTE_SUBGTC(*lastc);
01279 if ((ndim != 0) && (ndim != nlsdv->n_dim)) {
01280 errn = FENLBNDY;
01281 break;
01282 }
01283
01284 while (*lastc == '%') {
01285 compflag++;
01286 nlstruc = fdvar->goli_addr.sptr;
01287 vaddr = nlstruc->goli;
01288 scount = nlstruc->structlen;
01289
01290 SUBGTC(*lastc);
01291 errn = _getname(css, cup, abuf, lastc);
01292 if (errn != 0)
01293 break;
01294 _cnvrt_toupper(abuf);
01295
01296
01297
01298 if (!(fdvar = _findname(abuf, vaddr, scount))) {
01299 if (strlen(abuf) > 0) {
01300
01301 errn = FENLNREC;
01302 break;
01303 } else {
01304
01305
01306
01307 errn = 0;
01308 break;
01309 }
01310 } else
01311 vaddr = fdvar;
01312 while (ISBLANK(*lastc)) {
01313 CMTE_SUBGTC(*lastc);
01314 }
01315 if (*lastc != '=') {
01316 errn = FENLNOVL;
01317 break;
01318 }
01319 CMTE_SUBGTC(*lastc);
01320 }
01321 if (ndim != 0) {
01322 struct DvDimen *dvdm = nlsdv->dimension;
01323 long mult = 1;
01324 long offs = 0;
01325 register long nc;
01326 for (nc = 0; nc < nlsdv->n_dim; nc++)
01327 extnt *= nlsdv->dimension[nc].extent;
01328
01329 if (encnt == 0 && icnt == 0) {
01330 offs = dimnsn[0].low_bound - (dvdm[0].low_bound);
01331 for (nc = 1; nc < ndim; nc++) {
01332 mult = mult * (dvdm[nc-1].extent);
01333 offs = offs +
01334 ((dimnsn[nc].low_bound -
01335 dvdm[nc].low_bound) * mult);
01336 }
01337 extnt = extnt - offs;
01338 elsize = elsize >> 3;
01339 byt = offs * elsize;
01340 assert ( elsize > 0 && extnt > 0);
01341 cp = lastc;
01342 if (compflag)
01343 scount = 1;
01344 errn = _nlrdent(css, cup, vaddr, scount,
01345 cp, byt);
01346 *lastc = *cp;
01347 } else {
01348 for (nc = 0; nc < ndim; nc++) {
01349 if (dimnsn[nc].extent !=
01350 dvdm[nc].extent) {
01351 if (dimnsn[nc].extent >
01352 dvdm[nc].extent) {
01353 return(FENLBNDY);
01354 }
01355 }
01356 if (dimnsn[nc].stride_mult !=
01357 dvdm[nc].stride_mult) {
01358 dimnsn[nc].stride_mult =
01359 dimnsn[nc].stride_mult *
01360 dvdm[nc].stride_mult;
01361 }
01362 }
01363 cp = lastc;
01364 if (compflag)
01365 scount = 1;
01366 errn = _nl_strd_derv(css, cup, nlsdv, dvdn,
01367 cp, vaddr, scount, byt);
01368 *lastc = *cp;
01369 }
01370 } else {
01371 cp = lastc;
01372 errn = _nl_strd_derv(css, cup, nlsdv, 0, cp,
01373 vaddr, scount, byt);
01374 *lastc = *cp;
01375 }
01376 break;
01377 }
01378 default:
01379 errn = FEINTUNK;
01380 }
01381 return(errn);
01382 }
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392 static int
01393 _nlread(FIOSPTR css, ftype_t type, unit *cup, void *ptr, long elsize,
01394 int cntp, int incrm, char *lastc)
01395 {
01396
01397 long double lval[5];
01398 long ss, ncntp;
01399 long stat;
01400 char c;
01401 void *vaddr;
01402 long errn = 0;
01403 int lcount;
01404 bcont *sval;
01405 int nullvlu;
01406 c = *lastc;
01407 ncntp = cntp;
01408 vaddr = ptr;
01409 nullvlu = 0;
01410
01411 while (ncntp > 0) {
01412 errn = _nexdata(css, type, vaddr, ncntp, 1, c, cup,
01413 (long *) lval, &lcount, elsize, &nullvlu);
01414 if (errn != 0)
01415 return(errn);
01416 else {
01417 if (nullvlu == 2) {
01418 lcount = 0;
01419 ncntp = 0;
01420 }
01421 }
01422 if (lcount > ncntp) {
01423 errn = FENLTOOM;
01424 return(errn);
01425 }
01426 if (type == DVTYPE_ASCII) {
01427 char *wptr;
01428 wptr = vaddr;
01429
01430
01431
01432 ncntp = ncntp - lcount;
01433 wptr = wptr + (lcount * elsize);
01434 #ifdef KEY
01435
01436 wptr += incrm ? (elsize * (incrm - 1)) : 0;
01437 #endif
01438 vaddr = wptr;
01439 }
01440 else {
01441 int move;
01442 int *iptr;
01443 int ix, lim;
01444 bcont *siptr;
01445 #ifdef KEY
01446
01447
01448 long abs_incrm = (incrm > 0) ? incrm : (-incrm);
01449 long ncntp_tmp = abs_incrm ?
01450 ((ncntp + abs_incrm + 1) / abs_incrm) :
01451 ncntp;
01452 move = MIN(ncntp_tmp,lcount);
01453 lim = elsize/(sizeof(bcont));
01454 long extra_dest_stride =
01455 incrm ? (lim * (incrm - 1)) : 0;
01456 #else
01457 lim = elsize/(sizeof(bcont));
01458 move = MIN(ncntp,lcount);
01459 #endif
01460 siptr = (bcont*) vaddr;
01461
01462 while (move != 0) {
01463 sval = (bcont*) lval;
01464
01465 if (!nullvlu) {
01466 for (ix=0; ix < lim; ix++) {
01467 *siptr = *sval;
01468 siptr++;
01469 sval++;
01470 }
01471 } else
01472 siptr = siptr + lim;
01473 vaddr = siptr;
01474 move--;
01475 #ifdef KEY
01476 ncntp -= abs_incrm ? abs_incrm : 1;
01477 siptr = (vaddr += extra_dest_stride);
01478 #else
01479 ncntp--;
01480 #endif
01481 lcount--;
01482 }
01483 }
01484 do {
01485 CMTE_SUBGTC(*lastc);
01486 } while (ISBLANK(*lastc));
01487 if (*lastc == ',') {
01488 do {
01489 CMTE_SUBGTC(*lastc);
01490 } while (ISBLANK(*lastc));
01491 }
01492 c = *lastc;
01493 }
01494 return(0);
01495 }
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509 static int
01510 _indx_nl(
01511 FIOSPTR css, unit *cup, struct DvDimen *dvdn, int *ndima,
01512 long strbegend[3],int *encnt, int *icnt, int arryflag)
01513 {
01514 long mode, ss;
01515 long offs, mult;
01516 char c;
01517 int i, j, ir1, en1;
01518 long dummy;
01519 int errn = 0;
01520 long stat;
01521 long field_width;
01522 long *field_begin;
01523 long *field_end;
01524 long tempbuf[2];
01525 en1 = 0;
01526 ir1 = 0;
01527 if (arryflag) {
01528 for (i = 0; i < MAXDIMS; ) {
01529 long dummy;
01530 #ifdef KEY
01531 int orig_low_bound = dvdn[i].low_bound;
01532 #endif
01533
01534
01535
01536 do {
01537 SUBGTC(c);
01538 } while (ISBLANK(c));
01539
01540 if (c == ')')
01541 break;
01542 cup->ulinecnt++;
01543 cup->ulineptr--;
01544
01545
01546 GETSECTION(c);
01547 if (field_width == 0)
01548 goto indxgetext;
01549
01550 field_end++;
01551 tempbuf[0] = 0;
01552 tempbuf[1] = 0;
01553 mode = 0;
01554 (void) _iu2s(field_begin, &field_width,
01555 &field_end, &mode, tempbuf, &stat,
01556 &dummy, &dummy);
01557 if(stat < 0) {
01558 errn = FENLSUBS;
01559 return(errn);
01560 }
01561 dvdn[i].low_bound = *((_f_int8 *)tempbuf);
01562 indxgetext:
01563
01564 cup->ulineptr = field_begin + field_width;
01565 cup->ulinecnt = cup->ulinecnt - field_width;
01566
01567
01568 if (c == ':') {
01569
01570 SUBGTC(c);
01571 GETSECTION(c);
01572 #ifdef KEY
01573
01574
01575 en1++;
01576 if (field_width == 0) {
01577
01578
01579
01580 dvdn[i].extent -=
01581 (dvdn[i].low_bound - orig_low_bound);
01582 goto indxgetinc;
01583 }
01584 #else
01585 if (field_width == 0)
01586 goto indxgetinc;
01587 #endif
01588
01589 field_end++;
01590 tempbuf[0] = 0;
01591 tempbuf[1] = 0;
01592 mode = 0;
01593 (void) _iu2s(field_begin, &field_width,
01594 &field_end, &mode, tempbuf, &stat,
01595 &dummy, &dummy);
01596 if(stat < 0) {
01597 errn = FENLSUBS;
01598 return(errn);
01599 }
01600
01601
01602
01603 #ifdef KEY
01604
01605
01606
01607 long extent_tmp = (*((_f_int8 *)tempbuf) -
01608 dvdn[i].low_bound);
01609 extent_tmp =
01610 (extent_tmp < 0) ? (-extent_tmp) : extent_tmp;
01611 dvdn[i].extent = extent_tmp + 1;
01612 #else
01613 dvdn[i].extent = (*((_f_int8 *)tempbuf) -
01614 dvdn[i].low_bound) + 1;
01615 en1++;
01616 #endif
01617 indxgetinc:
01618
01619 cup->ulineptr = field_begin + field_width;
01620 cup->ulinecnt = cup->ulinecnt - field_width;
01621
01622
01623 if (c == ':') {
01624
01625 SUBGTC(c);
01626 GETSECTION(c);
01627 if (field_width == 0)
01628 goto indxforloop;
01629
01630 field_end++;
01631 tempbuf[0] = 0;
01632 tempbuf[1] = 0;
01633 mode = 0;
01634 (void) _iu2s(field_begin,
01635 &field_width, &field_end,
01636 &mode, tempbuf, &stat,
01637 &dummy, &dummy);
01638 if(stat < 0) {
01639 errn = FENLSUBS;
01640 return(errn);
01641 }
01642 dvdn[i].stride_mult = *((_f_int8 *)tempbuf);
01643 ir1++;
01644 indxforloop:
01645
01646 cup->ulineptr = field_begin + field_width;
01647 cup->ulinecnt = cup->ulinecnt - field_width;
01648 }
01649 #ifdef KEY
01650
01651 else {
01652 dvdn[i].stride_mult = 1;
01653 }
01654 #endif
01655 }
01656 #ifdef KEY
01657
01658 else {
01659 dvdn[i].extent = 1;
01660 dvdn[i].stride_mult = 1;
01661 }
01662 #endif
01663
01664 i++;
01665 do {
01666 SUBGTC(c);
01667 } while (ISBLANK(c));
01668
01669 if (c == ')')
01670 break;
01671 if (c != ',') {
01672 errn = FENLSUBD;
01673 return(errn);
01674 }
01675 }
01676 *ndima = i;
01677 *encnt = en1;
01678 *icnt = ir1;
01679 if (i == 0) {
01680 errn = FENLSUBN;
01681 return(errn);
01682 }
01683 }
01684 if (strbegend[0] == 0) {
01685 j = 0;
01686 if (arryflag) {
01687 SUBGTC(c);
01688 } else
01689 c = '(';
01690
01691 if (c == '(') {
01692
01693 do {
01694 SUBGTC(c);
01695 } while (ISBLANK(c));
01696
01697 if (c == ')') {
01698 errn = FENLSTRN;
01699 return(errn);
01700 }
01701 cup->ulinecnt++;
01702 cup->ulineptr--;
01703 GETSECTION(c);
01704 if (field_width == 0)
01705 goto indxstrend;
01706
01707 field_end++;
01708 tempbuf[0] = 0;
01709 tempbuf[1] = 0;
01710 mode = 0;
01711 (void) _iu2s(field_begin, &field_width, &field_end,
01712 &mode, tempbuf, &stat, &dummy, &dummy);
01713 if(stat < 0) {
01714 errn = FENLSTRG;
01715 return(errn);
01716 }
01717 strbegend[1] = *((_f_int8 *)tempbuf);
01718 j++;
01719 indxstrend:
01720
01721 cup->ulineptr = field_begin + field_width;
01722 cup->ulinecnt = cup->ulinecnt - field_width;
01723 if (c == ':') {
01724
01725 SUBGTC(c);
01726
01727 do {
01728 SUBGTC(c);
01729 } while (ISBLANK(c));
01730
01731 if (c == ')')
01732 goto indxstrout;
01733 cup->ulinecnt++;
01734 cup->ulineptr--;
01735 GETSECTION(c);
01736 if (field_width == 0)
01737 goto indxstrdon;
01738
01739 field_end++;
01740 tempbuf[0] = 0;
01741 tempbuf[1] = 0;
01742 mode = 0;
01743 (void) _iu2s(field_begin, &field_width,
01744 &field_end, &mode, tempbuf,
01745 &stat, &dummy, &dummy);
01746 if(stat < 0) {
01747 errn = FENLSTRG;
01748 return(errn);
01749 }
01750 strbegend[2] = *((_f_int8 *)tempbuf);
01751 j++;
01752 indxstrdon:
01753
01754 cup->ulineptr = field_begin + field_width;
01755 cup->ulinecnt = cup->ulinecnt - field_width;
01756 }
01757 indxstrout:
01758 strbegend[0] = j;
01759 }
01760 }
01761
01762
01763
01764
01765 while (!(c == '=') && !(c == '%')) {
01766 SUBGTC(c);
01767 }
01768 if (c == '%') {
01769 cup->ulineptr--;
01770 cup->ulinecnt++;
01771 }
01772 return(errn);
01773 }
01774
01775
01776
01777 static void
01778 _cnvrt_toupper(char *buf)
01779 {
01780 char c;
01781 while ((c = *buf) != '\0') {
01782 *buf++ = toupper(c);
01783 }
01784 return;
01785 }
01786
01787
01788
01789
01790
01791
01792
01793
01794
01795
01796
01797 static int
01798 _nlrdent(FIOSPTR css, unit *cup, nmlist_goli_t *nalist, unsigned count,
01799 char *lastc, int byt)
01800 {
01801 char c, oc;
01802 int ocnt, ss;
01803 long *optr;
01804 unsigned scnt;
01805 nmlist_goli_t *nlvar;
01806 int errn;
01807 int cntp;
01808 c = *lastc;
01809 scnt = count;
01810 errn = 0;
01811 nlvar = nalist;
01812
01813 while (scnt--) {
01814 switch(nlvar->valtype) {
01815 case IO_SCALAR:
01816 {
01817 nmlist_scalar_t *nlscalar;
01818 unsigned long elsize;
01819 unsigned int int_len;
01820 void *vaddr;
01821 ftype_t type;
01822 int adj = 0;
01823 cntp = 1;
01824 nlscalar = nlvar->goli_addr.ptr;
01825 type = nlscalar->tinfo.type;
01826 int_len = nlscalar->tinfo.int_len;
01827
01828 assert (type >= DVTYPE_TYPELESS &&
01829 type <= DVTYPE_ASCII);
01830 assert(nlscalar->tinfo.int_len > 0 );
01831 if (type == DVTYPE_ASCII) {
01832 char *wptr;
01833 const int bytesperchar = 1;
01834 wptr =
01835 _fcdtocp(nlscalar->scal_addr.charptr) +
01836 byt;
01837 elsize =
01838 _fcdlen(nlscalar->scal_addr.charptr);
01839 elsize = elsize * bytesperchar;
01840
01841 vaddr = wptr;
01842 }
01843 else {
01844 if (byt > 0)
01845 adj = byt/(sizeof(bcont));
01846 vaddr = ((bcont*)nlscalar->scal_addr.ptr) +
01847 adj;
01848 elsize = int_len >> 3;
01849 }
01850 errn = _nlread(css, type, cup, vaddr, elsize,
01851 cntp, 0, &c);
01852 if (errn != 0)
01853 return(errn);
01854 *lastc = c;
01855 break;
01856 }
01857 case IO_DOPEVEC:
01858 {
01859 DopeVectorType *nldv;
01860 unsigned long elsize;
01861 unsigned long extent = 1;
01862 unsigned int int_len;
01863 void *vaddr;
01864 int nc;
01865 ftype_t type;
01866 int adj = 0;
01867 nldv = nlvar->goli_addr.dv;
01868
01869 assert ( nldv != NULL );
01870 assert ( nldv->type_lens.int_len > 0 );
01871 type = nldv->type_lens.type;
01872 int_len = nldv->type_lens.int_len;
01873 if (type == DVTYPE_ASCII) {
01874 char *wptr;
01875 const int bytesperchar = 1;
01876 wptr = _fcdtocp(nldv->base_addr.charptr) +
01877 byt;
01878 elsize = _fcdlen(nldv->base_addr.charptr);
01879 elsize = elsize * bytesperchar;
01880 vaddr = wptr;
01881 }
01882 else {
01883 if (byt > 0)
01884 adj = byt/(sizeof(bcont));
01885 vaddr = ((bcont*)nldv->base_addr.a.ptr) + adj;
01886 elsize = int_len >> 3;
01887 }
01888 for (nc = 0; nc < nldv->n_dim; nc++) {
01889 extent *= nldv->dimension[nc].extent;
01890 }
01891
01892 assert ( elsize > 0 && extent > 0 );
01893 cntp = extent;
01894 errn = _nlread(css, type, cup, vaddr, elsize,
01895 cntp, 1, &c);
01896 if (errn != 0)
01897 return(errn);
01898 *lastc = c;
01899 break;
01900 }
01901 case IO_STRUC_A:
01902 {
01903 nmlist_struclist_t *nlstruc;
01904 unsigned long elsize;
01905 unsigned int int_len;
01906 unsigned int scount;
01907 nmlist_goli_t *vaddr;
01908 ftype_t type;
01909 int bytoff;
01910 nlstruc = nlvar->goli_addr.sptr;
01911 scount = nlstruc->structlen;
01912 vaddr = nlstruc->goli;
01913
01914
01915
01916
01917 bytoff = byt;
01918 errn =
01919 _nlrdent(css, cup, vaddr, scount, &c, bytoff);
01920 if (errn != 0)
01921 return(errn);
01922 *lastc = c;
01923 break;
01924 }
01925 case IO_STRUC_S:
01926 {
01927 nmlist_struclist_t *nlstruc;
01928 unsigned long elsize;
01929 unsigned int int_len;
01930 unsigned int scount;
01931 int nc;
01932 long ic;
01933 long extnt=1;
01934 nmlist_goli_t *vaddr;
01935 DopeVectorType *nlsdv;
01936 ftype_t type;
01937 int bytoff;
01938 nlstruc = nlvar->goli_addr.sptr;
01939 scount = nlstruc->structlen;
01940 vaddr = nlstruc->goli;
01941 nlsdv = nlstruc->struc_addr.dv;
01942
01943
01944
01945
01946
01947 elsize = nlsdv->base_addr.a.el_len;
01948 for (nc = 0; nc < nlsdv->n_dim; nc++) {
01949 extnt *= nlsdv->dimension[nc].extent;
01950 }
01951 for (ic = 0; ic < extnt; ic++) {
01952
01953
01954
01955
01956
01957 bytoff = byt + ((elsize >> 3) * ic);
01958 errn = _nlrdent(css, cup, vaddr, scount,
01959 &c, bytoff);
01960 if (errn != 0)
01961 return(errn);
01962 }
01963 *lastc = c;
01964 break;
01965 }
01966 default:
01967 errn = FEINTUNK;
01968 }
01969 if (errn !=0)
01970 return(errn);
01971 #if (defined(__mips) && (_MIPS_SZLONG == 32)) || (defined(_LITTLE_ENDIAN) && !defined(_LP64))
01972 nlvar = (nmlist_goli_t*)((long *)nlvar + 3 +
01973 (sizeof(_fcd))/(sizeof(long)));
01974 #else
01975 nlvar = (nmlist_goli_t*)((long *)nlvar + 2 +
01976 (sizeof(_fcd))/(sizeof(long)));
01977 #endif
01978 }
01979 return(errn);
01980 }
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994 static int
01995 _nexdata(
01996 FIOSPTR css,
01997 ftype_t type,
01998 void *ptr,
01999 int cnt,
02000 int inc,
02001 char lastc,
02002 unit *cup,
02003 long *lval,
02004 int *lcount,
02005 long elsize,
02006 int *nullvlu)
02007 {
02008 char c, oc;
02009 int ocnt;
02010 long *optr;
02011 int holcnt;
02012 char newc;
02013 int errn;
02014 *nullvlu = 0;
02015 c = lastc;
02016 while (ISBLANK(c)) {
02017 CMTE_SUBGTC(c);
02018 }
02019 *lcount = 1;
02020 if (isdigit((int) c)) {
02021
02022
02023
02024 *lcount = c - '0';
02025 ocnt = cup->ulinecnt;
02026 optr = cup->ulineptr;
02027 oc = c;
02028 for (;;) {
02029
02030
02031 SUBGTCNOEOR(c);
02032 if (isdigit((int) c))
02033 *lcount = (*lcount * 10) + c - '0';
02034 else
02035 break;
02036 }
02037
02038
02039
02040
02041 switch (c) {
02042 case '*':
02043
02044
02045 CMTE_SUBGTCNOEOR(c);
02046 if (isdigit((int) c)) {
02047
02048
02049
02050 holcnt = c - '0';
02051 ocnt = cup->ulinecnt;
02052 optr = cup->ulineptr;
02053 oc = c;
02054 for (;;) {
02055
02056 SUBGTCNOEOR(c);
02057 if (isdigit((int) c))
02058 holcnt = (holcnt * 10) +
02059 c - '0';
02060 else
02061 break;
02062 }
02063 switch (c) {
02064 case 'H':
02065 case 'h':
02066 case 'R':
02067 case 'r':
02068 case 'L':
02069 case 'l':
02070 return(_get_holl(css, cup, c, holcnt,
02071 type, lval, elsize));
02072 default:
02073
02074 cup->ulineptr = optr;
02075
02076 cup->ulinecnt = ocnt;
02077 c = oc;
02078 ocnt = 1;
02079 break;
02080 }
02081 }
02082 break;
02083 case 'H':
02084 case 'h':
02085 case 'R':
02086 case 'r':
02087 case 'L':
02088 case 'l':
02089
02090 holcnt = *lcount;
02091 *lcount = 1;
02092 return(_get_holl(css, cup, c, holcnt, type,
02093 lval, elsize));
02094 default:
02095
02096 cup->ulineptr = optr;
02097 cup->ulinecnt = ocnt;
02098 c = oc;
02099 ocnt = 1;
02100 *lcount = 1;
02101 break;
02102 }
02103 }
02104
02105
02106
02107
02108
02109 if (c == ',') {
02110 cup->ulineptr--;
02111 cup->ulinecnt++;
02112 *nullvlu = 1;
02113 return(0);
02114 }
02115 else if (ISBLANK(c)) {
02116 *nullvlu = 1;
02117 return(0);
02118 }
02119 else {
02120 if (c == '!') {
02121
02122 cup->ulineptr--;
02123 cup->ulinecnt++;
02124 *nullvlu = 1;
02125 return(0);
02126 } else
02127 if (c == '/' || c == '&' || c == '$') {
02128
02129
02130
02131
02132 cup->ulineptr--;
02133 cup->ulinecnt++;
02134 *nullvlu = 2;
02135 return(0);
02136 }
02137 }
02138
02139
02140
02141
02142
02143 if (type == DVTYPE_LOGICAL) {
02144 bcont *slval;
02145 slval = (bcont *)lval;
02146
02147
02148
02149
02150
02151
02152
02153
02154 if (c == '.') {
02155
02156 SUBGTCNOEOR(c);
02157
02158 if ((c == 'T') || (c == 't')) {
02159 switch (elsize) {
02160 #ifdef _F_INT4
02161 case 4:
02162 *(_f_log4 *)slval = _btol(1);
02163 break;
02164
02165 #ifdef _F_INT2
02166 case 2:
02167 *(_f_log2 *)slval = _btol(1);
02168 break;
02169 case 1:
02170 *(_f_log1 *)slval = _btol(1);
02171 break;
02172 #endif
02173 #endif
02174 case 8:
02175 *(_f_log8 *)slval = _btol(1);
02176 break;
02177 default:
02178 return(FEKNTSUP);
02179 }
02180
02181
02182 } else if ((c == 'F') || (c == 'f')) {
02183 switch (elsize) {
02184 #ifdef _F_INT4
02185 case 4:
02186 *(_f_log4 *)slval = _btol(0);
02187 break;
02188
02189 #ifdef _F_INT2
02190 case 2:
02191 *(_f_log2 *)slval = _btol(0);
02192 break;
02193 case 1:
02194 *(_f_log1 *)slval = _btol(0);
02195 break;
02196 #endif
02197 #endif
02198 case 8:
02199 *(_f_log8 *)slval = _btol(0);
02200 break;
02201 default:
02202 return(FEKNTSUP);
02203 }
02204 } else {
02205 errn = FENLIVLG;
02206 return(errn);
02207 }
02208 }
02209 else {
02210
02211
02212
02213
02214
02215
02216 ocnt = cup->ulinecnt;
02217 optr = cup->ulineptr;
02218
02219 if (ocnt > 0) {
02220 newc = *optr++;
02221 ocnt--;
02222 while (!(ISBLANK(newc))) {
02223
02224 if (newc == ',' || newc == '/' ||
02225 newc == '&' || newc == '$')
02226 break;
02227 if ((newc == '=') || (newc == '(') ||
02228 (newc == '%')) {
02229
02230
02231
02232 cup->ulineptr--;
02233 cup->ulinecnt++;
02234 *nullvlu = 2;
02235 return(0);
02236 }
02237 if (ocnt <= 0)
02238 break;
02239 newc = *optr++;
02240 ocnt--;
02241 }
02242 while ((ISBLANK(newc)) && ocnt-- > 0)
02243 newc = *optr++;
02244 if (newc == '=') {
02245
02246
02247
02248
02249 cup->ulineptr--;
02250 cup->ulinecnt++;
02251 *nullvlu = 2;
02252 return(0);
02253 }
02254 }
02255 if ((c == 'T') || (c == 't')) {
02256 switch (elsize) {
02257 #ifdef _F_REAL4
02258 case 4:
02259 *(_f_log4 *)slval = _btol(1);
02260 break;
02261
02262 #ifdef _F_INT2
02263 case 2:
02264 *(_f_log2 *)slval = _btol(1);
02265 break;
02266 case 1:
02267 *(_f_log1 *)slval = _btol(1);
02268 break;
02269 #endif
02270 #endif
02271 case 8:
02272 *(_f_log8 *)slval = _btol(1);
02273 break;
02274 default:
02275 return(FEKNTSUP);
02276 }
02277 }
02278 else if ((c == 'F') || (c == 'f')) {
02279 switch (elsize) {
02280 #ifdef _F_REAL4
02281 case 4:
02282 *(_f_log4 *)slval = _btol(0);
02283 break;
02284
02285 #ifdef _F_INT2
02286 case 2:
02287 *(_f_log2 *)slval = _btol(0);
02288 break;
02289 case 1:
02290 *(_f_log1 *)slval = _btol(0);
02291 break;
02292 #endif
02293 #endif
02294 case 8:
02295 *(_f_log8 *)slval = _btol(0);
02296 break;
02297 default:
02298 return(FEKNTSUP);
02299 }
02300 }
02301 else if (ISBLANK(c) || c == ',') {
02302 *nullvlu = 1;
02303 return(0);
02304 }
02305 else {
02306 errn = FENLIVLG;
02307 return(errn);
02308 }
02309 }
02310
02311
02312
02313 while ( !(ISBLANK(c))) {
02314 CMTE_SUBGTCNOEOR(c);
02315
02316 if (c == '/' || c == ',' || c == '&' || c == '$') {
02317
02318 cup->ulineptr--;
02319 cup->ulinecnt++;
02320 return(0);
02321 }
02322 }
02323 return(0);
02324 }
02325
02326 if (type == DVTYPE_ASCII)
02327 return (_g_charstr(css, cup, ptr, cnt, c, *lcount,
02328 elsize, nullvlu));
02329
02330 if (isdigit((int) c) || c == '+' || c == '-' || c == '.') {
02331 if (type == DVTYPE_COMPLEX) {
02332 errn = FENLIVCX;
02333 return(errn);
02334 }
02335 return(_g_number(type, cup, lval, elsize));
02336 }
02337
02338
02339
02340
02341
02342
02343
02344
02345 if (c == '(') {
02346 return(_g_complx(css, cup, type, lval, elsize));
02347 }
02348 else if ((c == '\'') || (c == '"')) {
02349 return(_get_quoholl(css, cup, c, type, lval, elsize));
02350 }
02351 else if (c == 'O' || c == 'o') {
02352 return(_gocthex(css, cup, type, lval, OCTAL, elsize, nullvlu));
02353 }
02354 else if (c == 'Z' || c == 'z') {
02355 return(_gocthex(css, cup, type, lval, HEX, elsize, nullvlu));
02356 }
02357 else {
02358
02359
02360
02361
02362
02363
02364
02365 cup->ulineptr--;
02366 cup->ulinecnt++;
02367 *nullvlu = 2;
02368 return(0);
02369 }
02370 }
02371
02372
02373
02374
02375
02376
02377
02378
02379
02380 static int
02381 _g_complx(
02382 FIOSPTR css, unit*cup, ftype_t type, long *lval, long elsize)
02383 {
02384 char c;
02385 long mode, stat;
02386 long zero = 0;
02387 long field_width;
02388 long *field_begin;
02389 long *field_end;
02390 int i, errn;
02391 int nc;
02392 ic_func *ngcf;
02393 int inc;
02394 int ptrfw;
02395 bcont *slval;
02396
02397
02398
02399
02400 if (type != DVTYPE_COMPLEX) {
02401 errn = FENLIVCX;
02402 return(errn);
02403 }
02404
02405
02406
02407
02408 ngcf = ncf_tab90[type];
02409 mode = 0;
02410
02411 switch (elsize) {
02412 #ifdef _F_REAL4
02413 case 8:
02414 mode = MODEHP;
02415 break;
02416 #endif
02417 case 16:
02418 break;
02419 case 32:
02420 mode = MODEDP;
02421 break;
02422 default:
02423 return(FEKNTSUP);
02424 }
02425 inc = (elsize / 2) / (sizeof(bcont));
02426 slval = (bcont*)lval;
02427
02428
02429 for (i = 0; i < 2; i++) {
02430 do {
02431 SUBGTC(c);
02432 } while (ISBLANK(c));
02433 cup->ulinecnt++;
02434 cup->ulineptr--;
02435 field_begin = cup->ulineptr;
02436 field_end = cup->ulineptr;
02437 field_width = cup->ulinecnt;
02438 nc = 0;
02439
02440 while (nc < cup->ulinecnt && !(ISSEP(*field_end) ||
02441 *field_end == ')' || *field_end == '&' ||
02442 *field_end == '$' )) {
02443 field_end++;
02444 nc++;
02445 }
02446
02447 field_end++;
02448 field_width = nc;
02449
02450 errn = ngcf(field_begin, &field_width, &field_end,
02451 &mode, slval + (i * inc), &stat, &zero, &zero);
02452
02453
02454
02455
02456
02457
02458 if (errn < 0) {
02459 errn = _nicverr(stat);
02460 } else
02461 errn = 0;
02462
02463
02464 if (errn == FENICVIC) {
02465 int errn2;
02466 errn2 = _s_scan_extensions(slval + (i * inc),
02467 type, elsize, field_begin,
02468 field_width, &ptrfw, mode);
02469
02470 cup->ulineptr += ptrfw;
02471 cup->ulinecnt -= ptrfw;
02472 if (errn2 <= 0)
02473 errn = 0;
02474 else
02475
02476
02477
02478 return(FENLIVCX);
02479 } else {
02480 cup->ulineptr = field_begin + field_width;
02481 cup->ulinecnt -= cup->ulineptr - field_begin;
02482 if (errn != 0)
02483 return(errn);
02484 }
02485 do {
02486 SUBGTC(c);
02487 } while (ISBLANK(c));
02488 if ((c != ',') && (i == 0))
02489 return(FENLIVCX);
02490 }
02491 if ( c != ')')
02492 return(FENLIVCX);
02493 return(0);
02494 }
02495
02496
02497
02498
02499
02500
02501
02502
02503 static int
02504 _g_number(
02505 ftype_t type,
02506 unit *cup,
02507 long *lval,
02508 long elsize)
02509 {
02510 long mode, stat;
02511 long zero = 0;
02512 long field_width;
02513 long *field_begin;
02514 long *field_end;
02515 int ss = 0;
02516 int errn = 0;
02517 int nc;
02518 ic_func *ngcf;
02519 int ptrfw;
02520 bcont *slval;
02521
02522 mode = 0;
02523
02524 switch (type) {
02525 case DVTYPE_REAL:
02526 switch (elsize) {
02527 #ifdef _F_REAL4
02528 case 4:
02529 mode = MODEHP;
02530 break;
02531 #endif
02532 case 8:
02533 break;
02534 case 16:
02535 mode = MODEDP;
02536 break;
02537 default:
02538 return(FEKNTSUP);
02539 }
02540 break;
02541 case DVTYPE_INTEGER:
02542 switch (elsize) {
02543 #ifdef _F_INT4
02544 case 4:
02545 mode = MODEHP;
02546 break;
02547
02548 #if defined(_F_INT2)
02549 case 2:
02550 mode = MODEWP;
02551 break;
02552 case 1:
02553 mode = MODEBP;
02554 break;
02555 #endif
02556 #endif
02557 case 8:
02558 break;
02559 default:
02560 return(FEKNTSUP);
02561 }
02562 break;
02563 }
02564
02565
02566
02567 ngcf = ncf_tab90[type];
02568 cup->ulinecnt++;
02569 cup->ulineptr--;
02570 field_begin = cup->ulineptr;
02571 field_end = cup->ulineptr;
02572 field_width = cup->ulinecnt;
02573 slval = (bcont*)lval;
02574 nc = 0;
02575 while (nc < cup->ulinecnt && !(ISSEP(*field_end) ||
02576 *field_end == '&' || *field_end == '$')) {
02577 field_end++;
02578 nc++;
02579 }
02580
02581 field_end++;
02582 field_width = nc;
02583 errn = ngcf(field_begin, &field_width, &field_end,
02584 &mode, slval, &stat, &zero, &zero);
02585
02586
02587
02588
02589
02590
02591 if (errn < 0) {
02592 ss = _nicverr(stat);
02593 if (ss == 0)
02594 errn = 0;
02595 } else
02596 errn = 0;
02597
02598
02599 if (ss == FENICVIC) {
02600 int errn2;
02601 errn2 = _s_scan_extensions(slval,
02602 type, elsize, field_begin,
02603 field_width, &ptrfw, mode);
02604
02605 cup->ulineptr = field_begin + field_width;
02606 cup->ulinecnt -= cup->ulineptr - field_begin;
02607 if (errn2 >= 0)
02608 errn = 0;
02609 else
02610
02611
02612
02613 errn = FENLUNKI;
02614 return(errn);
02615 } else {
02616 cup->ulineptr = field_begin + field_width;
02617 cup->ulinecnt -= cup->ulineptr - field_begin;
02618 }
02619 return(errn);
02620 }
02621
02622
02623
02624
02625
02626
02627
02628
02629
02630
02631 static int
02632 _g_charstr(
02633 FIOSPTR css,
02634 unit *cup,
02635 void *p,
02636 int cnt,
02637 char c,
02638 int lcount,
02639 long elsize,
02640 int *nullvlu)
02641 {
02642 int eos;
02643 int i, ch;
02644 unsigned int len77;
02645 char *cp;
02646 char enddelim;
02647 char c1;
02648 int repcount;
02649 char *cpold;
02650 int errn = 0;
02651 long *optr;
02652 int ocnt;
02653 void *fchp;
02654 *nullvlu = 0;
02655
02656
02657
02658
02659
02660
02661
02662
02663
02664
02665
02666
02667
02668
02669
02670
02671
02672
02673
02674
02675
02676
02677
02678
02679
02680
02681
02682
02683
02684
02685
02686
02687
02688
02689
02690
02691
02692 eos = 0;
02693 fchp = p;
02694 len77 = elsize;
02695
02696 cp = fchp;
02697 repcount = MIN(lcount,cnt);
02698
02699
02700
02701
02702 if ((c == '\'') || (c == '"')) {
02703 enddelim = c;
02704
02705 for (i = 0; i < len77 && eos == 0; i++) {
02706 GETSTRD();
02707 if (eos == 0)
02708 *cp++ = ch;
02709 }
02710 if (eos == -1)
02711 i--;
02712 i = len77 - i;
02713 if (i > 0)
02714 (void) memset(cp, BLANK, i);
02715 cp = cp + i;
02716 while (eos != -1) {
02717
02718
02719
02720
02721 GETSTRD();
02722 }
02723 while (--repcount) {
02724
02725
02726
02727
02728 cpold = fchp;
02729 (void) memcpy(cp, cpold, len77);
02730 cp = cp + len77;
02731 }
02732 } else {
02733
02734
02735
02736
02737
02738
02739
02740
02741 if (lcount > 1) {
02742 errn = FENLNOVL;
02743 return(errn);
02744 }
02745
02746
02747
02748
02749 ocnt = cup->ulinecnt;
02750 optr = cup->ulineptr;
02751 c1 = *optr++;
02752 ocnt--;
02753
02754 while (!(ISBLANK(c1))) {
02755
02756 if (c1 == ',' || c1 == '/' || c1 == '&' || c == '$')
02757 break;
02758 if (c1 == '=' || c1 == '(' || c1 == '%') {
02759
02760
02761
02762 cup->ulineptr--;
02763 cup->ulinecnt++;
02764 *nullvlu = 2;
02765 return(0);
02766 }
02767 c1 = *optr++;
02768 ocnt--;
02769 }
02770 while ((ISBLANK(c1)) && ocnt-- > 0)
02771 c1 = *optr++;
02772 if (c1 == '=' || c1 == '(' || c1 == '%') {
02773
02774
02775
02776
02777 cup->ulineptr--;
02778 cup->ulinecnt++;
02779 *nullvlu = 2;
02780 return(0);
02781 }
02782
02783 errn = FENLUNKI;
02784 return(errn);
02785 }
02786 return(errn);
02787 }
02788
02789
02790
02791
02792
02793
02794
02795
02796 static int
02797 _get_holl(
02798 FIOSPTR css,
02799 unit *cup,
02800 char holltype,
02801 int count,
02802 ftype_t type,
02803 long *lval,
02804 long elsize)
02805 {
02806 int i;
02807 char *holbufptr;
02808 char c;
02809 int errn = 0;
02810 int fill;
02811
02812
02813
02814
02815
02816
02817
02818
02819
02820
02821
02822
02823
02824
02825
02826 if (type == DVTYPE_COMPLEX || type == DVTYPE_ASCII ||
02827 ((type == DVTYPE_REAL) && elsize == sizeof(_f_real16))) {
02828 errn = FENLUNKI;
02829 return(errn);
02830 }
02831 if (count > elsize) {
02832 errn = FENLIOER;
02833 return(errn);
02834 }
02835 fill = BLANK;
02836 holbufptr = (char *)lval;
02837 if (holltype == 'R' || holltype == 'r') {
02838
02839 fill = NULLC;
02840 holbufptr = holbufptr + (elsize - count);
02841 }
02842 else
02843 if (holltype == 'L' || holltype == 'l')
02844 fill = NULLC;
02845
02846
02847
02848 for (i = 0; i < count && (cup->ulinecnt > 1) ; i++) {
02849 SUBGTC(c);
02850
02851 *holbufptr++ = c;
02852 }
02853 if (i == count) {
02854
02855 if (holltype == 'R' || holltype == 'r')
02856 holbufptr = (char *)lval;
02857 (void) memset(holbufptr, fill, elsize - count);
02858 }
02859 else {
02860
02861
02862
02863
02864 errn = FENLIOER;
02865 return(errn);
02866 }
02867 return(errn);
02868 }
02869
02870
02871
02872
02873
02874
02875
02876
02877
02878
02879 static int
02880 _get_quoholl(
02881 FIOSPTR css,
02882 unit *cup,
02883 char cdelim,
02884 ftype_t type,
02885 long *lval,
02886 long elsize)
02887 {
02888 int numchar;
02889 int j;
02890 int fill;
02891 long holbuf;
02892
02893 char *holbufptr;
02894 char c;
02895 char *lvalcharptr;
02896 int errn = 0;
02897
02898
02899
02900
02901
02902
02903
02904
02905
02906
02907
02908
02909 if (type == DVTYPE_COMPLEX || type == DVTYPE_ASCII ||
02910 (type == DVTYPE_REAL && elsize == sizeof(_f_real16))) {
02911 errn = FENLUNKI;
02912 return(errn);
02913 }
02914 lvalcharptr = (char *)lval;
02915 holbufptr = (char *) &holbuf;
02916
02917 numchar = 0;
02918 for (;;) {
02919 SUBGTC(c);
02920 if (c == cdelim) {
02921
02922 SUBGTC(c);
02923 if (c != cdelim)
02924 break;
02925
02926
02927
02928
02929 }
02930 if (++numchar > elsize) {
02931 errn = FENLIOER;
02932 return(errn);
02933 }
02934 *holbufptr++ = c;
02935
02936
02937
02938
02939 if (cup->ulinecnt <= 0) {
02940 errn = FENLIOER;
02941 return(errn);
02942 }
02943 }
02944 if (c == 'L' || c == 'l')
02945 fill = NULLC;
02946 else if (c == 'R' || c == 'r') {
02947
02948 holbufptr = holbufptr - 1;
02949 lvalcharptr = lvalcharptr + (elsize - 1);
02950 j = elsize - numchar;
02951 while (numchar-- > 0)
02952 *lvalcharptr-- = *holbufptr--;
02953
02954
02955 while (j-- > 0)
02956 *lvalcharptr-- = '\0';
02957 return(0);
02958 }
02959 else {
02960
02961 fill = BLANK;
02962 if (c != 'H' && c != 'h') {
02963
02964
02965 cup->ulineptr--;
02966 cup->ulinecnt++;
02967 }
02968 }
02969
02970 (void) memset(holbufptr, fill, elsize - numchar);
02971 *lval = holbuf;
02972 return(errn);
02973 }
02974
02975
02976
02977
02978
02979
02980
02981
02982
02983
02984
02985
02986
02987
02988
02989
02990
02991 static int
02992 _gocthex(
02993 FIOSPTR css,
02994 unit *cup,
02995 ftype_t type,
02996 long *lval,
02997 int base,
02998 long elsize,
02999 int *nullvlu)
03000 {
03001 char c;
03002 char strbuf[2];
03003 int errn = 0;
03004 int octshift = OCTSHFT;
03005 int hexshift = HEXSHFT;
03006
03007 #if defined(_F_REAL4) && defined(_F_INT4)
03008 if (elsize <= 4) {
03009 octshift = OCTSHFT4;
03010 hexshift = HEXSHFT4;
03011 }
03012 #endif
03013 *nullvlu = 0;
03014 if (*cup->ulineptr != '\'') {
03015
03016 cup->ulineptr--;
03017 cup->ulinecnt++;
03018 *nullvlu = 2;
03019 return(0);
03020 }
03021
03022 if (type == DVTYPE_COMPLEX || (type == DVTYPE_REAL &&
03023 elsize == sizeof(_f_real16))) {
03024 errn = FENLUNKI;
03025 return(errn);
03026 }
03027
03028 if (cup->ulinecnt <= 1) {
03029 errn = FENLIOER;
03030 return(errn);
03031 }
03032 SUBGTC(c);
03033 SUBGTC(c);
03034 *lval = 0;
03035 strbuf[1] = '\0';
03036 while (!(ISBLANK(c)) && c != '\'') {
03037 if (base == OCTAL) {
03038 if ((!isdigit((int) c)) || (c == '9') ||
03039 (*lval >> octshift)) {
03040 errn = FENICVIC;
03041 return(errn);
03042 }
03043 *lval = (*lval * 8) + c - '0';
03044 }
03045 else {
03046 if ((!isxdigit(c)) || (*lval >> hexshift)) {
03047 errn = FENICVIC;
03048 return(errn);
03049 }
03050 strbuf[0] = c;
03051 *lval = (*lval * 16) +
03052 (int) strtol(strbuf, (char **)NULL, 16);
03053 }
03054
03055 CMTE_SUBGTC(c);
03056 if (c == ',') {
03057 cup->ulineptr--;
03058 cup->ulinecnt++;
03059 break;
03060 }
03061 }
03062 return(errn);
03063 }
03064
03065
03066
03067
03068
03069
03070
03071
03072
03073
03074
03075
03076
03077
03078 static int
03079 _nl_stride_dv(
03080 FIOSPTR css,
03081 unit *cup,
03082 DopeVectorType *dv,
03083 struct DvDimen *sectn,
03084 char *lastch,
03085 long strbegend[3])
03086 {
03087 int nd;
03088 int i;
03089 long extent;
03090 long inc;
03091 long ret = 0;
03092 ftype_t f90type;
03093 long elsize;
03094 long element_stride;
03095 register long id1, id2, id3, id4, id5, id6, id7;
03096 struct DvDimen *dvdimen;
03097 long badjust;
03098 bcont *addr;
03099 char *baddr;
03100 void *addr2, *addr3, *addr4;
03101 void *addr5, *addr6;
03102 struct DvDimen dimen[MAXDIM];
03103 long begt = strbegend[1];
03104 long endt = strbegend[2];
03105
03106
03107 assert ( dv != NULL );
03108 assert ( dv->type_lens.int_len > 0 );
03109
03110 if (dv->p_or_a && (dv->assoc == 0))
03111 return(FEPTRNAS);
03112
03113 f90type = dv->type_lens.type;
03114 nd = dv->n_dim;
03115 badjust = 0;
03116
03117
03118
03119
03120 for (i = 0; i < nd; i++)
03121 dimen[i] = dv->dimension[i];
03122
03123
03124
03125
03126
03127
03128
03129
03130
03131 dvdimen = dv->dimension;
03132 for (i = 0; i < nd; i++) {
03133 if (sectn == NULL) {
03134
03135
03136 if (dvdimen[i].extent == 0)
03137 return(0);
03138 }
03139 else {
03140
03141 badjust += (sectn[i].low_bound -
03142 dvdimen[i].low_bound) *
03143 dvdimen[i].stride_mult;
03144 if (dvdimen[i].extent != sectn[i].extent)
03145 dimen[i].extent = sectn[i].extent;
03146 if (dvdimen[i].stride_mult != sectn[i].stride_mult)
03147 dimen[i].stride_mult = sectn[i].stride_mult;
03148 }
03149 }
03150
03151 if (f90type == DVTYPE_ASCII) {
03152
03153 elsize = _fcdlen(dv->base_addr.charptr);
03154 extent = dimen[0].extent;
03155 inc = 0;
03156 element_stride = 1;
03157
03158 if (extent > 1) {
03159 register int stm = dimen[0].stride_mult;
03160
03161 inc = stm / elsize;
03162 if (inc * elsize != stm)
03163 element_stride = 0;
03164 }
03165
03166 baddr = _fcdtocp(dv->base_addr.charptr) +
03167 badjust * (dv->type_lens.int_len >> 3);
03168
03169 switch(nd) {
03170 case 7:
03171 for (id7 = 0; id7 < dimen[6].extent; id7++) {
03172 addr6 = baddr;
03173 case 6:
03174 for (id6 = 0; id6 < dimen[5].extent; id6++) {
03175 addr5 = baddr;
03176 case 5:
03177 for (id5 = 0; id5 < dimen[4].extent; id5++) {
03178 addr4 = baddr;
03179 case 4:
03180 for (id4 = 0; id4 < dimen[3].extent; id4++) {
03181 addr3 = baddr;
03182 case 3:
03183 for (id3 = 0; id3 < dimen[2].extent; id3++) {
03184 addr2 = baddr;
03185 case 2:
03186 for (id2 = 0; id2 < dimen[1].extent; id2++) {
03187 case 1:
03188 if ((element_stride == 1) && (strbegend[0] == 0)) {
03189 ret = _nlread(css, f90type, cup, baddr,
03190 elsize, extent, inc, lastch);
03191 if (ret != 0) goto done;
03192 }
03193 else {
03194 char *ba;
03195 char *newba;
03196 int newelsz;
03197 ba = baddr;
03198 if (strbegend[0] == 0) {
03199 for (id1 = 0; id1 < extent; id1++) {
03200 ret = _nlread(css, f90type, cup, ba,
03201 elsize, 1, 0, lastch);
03202 if (ret != 0) goto done;
03203 ba += dimen[0].stride_mult;
03204 }
03205 } else {
03206 if (begt < 1 )
03207 begt = 1;
03208 else if (begt > elsize) {
03209 ret = FENLUNKN;
03210 goto done;
03211 }
03212 if (endt < 1 )
03213 endt = elsize;
03214 else if ((endt > elsize) || (endt < begt)) {
03215 ret = FENLUNKN;
03216 goto done;
03217 }
03218 for (id1 = 0; id1 < extent; id1++) {
03219 newba = ba + (begt - 1);
03220 newelsz = (endt - begt) + 1;
03221 ret = _nlread(css, f90type, cup,
03222 newba, newelsz, 1, 0, lastch);
03223 if (ret != 0)
03224 goto done;
03225 ba += dimen[0].stride_mult;
03226 }
03227 }
03228 }
03229
03230 if (nd == 1) goto done;
03231 baddr += dimen[1].stride_mult;
03232 }
03233 if (nd == 2) goto done;
03234 baddr = addr2;
03235 baddr += dimen[2].stride_mult;
03236 }
03237 if (nd == 3) goto done;
03238 baddr = addr3;
03239 baddr += dimen[3].stride_mult;
03240 }
03241 if (nd == 4) goto done;
03242 baddr = addr4;
03243 baddr += dimen[4].stride_mult;
03244 }
03245 if (nd == 5) goto done;
03246 baddr = addr5;
03247 baddr += dimen[5].stride_mult;
03248 }
03249 if (nd == 6) goto done;
03250 baddr = addr6;
03251 baddr += dimen[6].stride_mult;
03252 }
03253 }
03254
03255 }
03256 else {
03257
03258 int bshft;
03259
03260
03261
03262
03263
03264
03265
03266 #if defined(__mips) || defined(_LITTLE_ENDIAN) || defined(__sv2)
03267 assert( SMSCALE(dv) == sizeof(bcont) ||
03268 SMSCALE(dv) == sizeof(_f_int2) ||
03269 SMSCALE(dv) == sizeof(_f_int4) ||
03270 SMSCALE(dv) == sizeof(long) );
03271 #else
03272 assert( SMSCALE(dv) == sizeof(bcont) ||
03273 SMSCALE(dv) == sizeof(long) );
03274 #endif
03275
03276
03277 assert( SMSHIFT(dv) != -1);
03278
03279 element_stride = 1;
03280 elsize = dv->type_lens.int_len >> 3;
03281 extent = dimen[0].extent;
03282 inc = 0;
03283 bshft = SMSHIFT(dv);
03284
03285 if (extent > 1) {
03286 int bytes_per_sm = dimen[0].stride_mult*(signed)SMSCALE(dv);
03287 inc = bytes_per_sm / elsize;
03288 if (inc * elsize != bytes_per_sm)
03289 element_stride = 0;
03290 }
03291
03292 addr = (bcont*)dv->base_addr.a.ptr + (badjust << bshft);
03293
03294 switch(nd) {
03295 case 7:
03296 for (id7 = 0; id7 < dimen[6].extent; id7++) {
03297 addr6 = addr;
03298 case 6:
03299 for (id6 = 0; id6 < dimen[5].extent; id6++) {
03300 addr5 = addr;
03301 case 5:
03302 for (id5 = 0; id5 < dimen[4].extent; id5++) {
03303 addr4 = addr;
03304 case 4:
03305 for (id4 = 0; id4 < dimen[3].extent; id4++) {
03306 addr3 = addr;
03307 case 3:
03308 for (id3 = 0; id3 < dimen[2].extent; id3++) {
03309 addr2 = addr;
03310 case 2:
03311 for (id2 = 0; id2 < dimen[1].extent; id2++) {
03312 case 1:
03313 if (element_stride) {
03314 ret = _nlread(css, f90type, cup, addr,
03315 elsize, extent, inc, lastch);
03316 }
03317 else {
03318 bcont *ad;
03319 ad = addr;
03320
03321
03322
03323
03324
03325
03326
03327 for (id1 = 0; id1 < extent; id1++) {
03328 ret = _nlread(css, f90type, cup, ad,
03329 elsize, 1, 0, lastch);
03330 if (ret != 0) goto done;
03331 ad += dimen[0].stride_mult;
03332 }
03333 }
03334
03335
03336 if (ret != 0) goto done;
03337
03338 if (nd == 1) goto done;
03339 addr += dimen[1].stride_mult << bshft;
03340 }
03341 if (nd == 2) goto done;
03342 addr = addr2;
03343 addr += dimen[2].stride_mult << bshft;
03344 }
03345 if (nd == 3) goto done;
03346 addr = addr3;
03347 addr += dimen[3].stride_mult << bshft;
03348 }
03349 if (nd == 4) goto done;
03350 addr = addr4;
03351 addr += dimen[4].stride_mult << bshft;
03352 }
03353 if (nd == 5) goto done;
03354 addr = addr5;
03355 addr += dimen[5].stride_mult << bshft;
03356 }
03357 if (nd == 6) goto done;
03358 addr = addr6;
03359 addr += dimen[6].stride_mult << bshft;
03360 }
03361 }
03362 }
03363
03364 done: return(ret);
03365 }
03366
03367 static int
03368 _nl_strd_derv(
03369 FIOSPTR css,
03370 unit *cup,
03371 DopeVectorType *dv,
03372 struct DvDimen *sectn,
03373 char *lastch,
03374 nmlist_goli_t *vdr,
03375 unsigned int cnt,
03376 long bte)
03377 {
03378 const int bytesperchar = 1;
03379 int nd;
03380 int i;
03381 long badjust;
03382 long elsize;
03383 long ret = 0;
03384 long sizeamt;
03385 register long id1, id2, id3, id4, id5, id6, id7;
03386 struct DvDimen *dvdimen;
03387 struct DvDimen dimen[MAXDIM];
03388
03389 nd = dv->n_dim;
03390 badjust = 0;
03391
03392
03393 for (i = 0; i < nd; i++)
03394 dimen[i] = dv->dimension[i];
03395
03396
03397
03398
03399
03400
03401
03402
03403 dvdimen = dv->dimension;
03404 for (i = 0; i < nd; i++) {
03405 if (sectn == NULL) {
03406
03407
03408 if (dvdimen[i].extent == 0)
03409 return(0);
03410 }
03411 else {
03412
03413 badjust += (sectn[i].low_bound -
03414 dvdimen[i].low_bound) *
03415 dvdimen[i].stride_mult;
03416 if (dvdimen[i].extent != sectn[i].extent)
03417 dimen[i].extent = sectn[i].extent;
03418 if (dvdimen[i].stride_mult != sectn[i].stride_mult)
03419 dimen[i].stride_mult = sectn[i].stride_mult;
03420 }
03421 }
03422
03423 elsize = dv->base_addr.a.el_len>> 3;
03424 bte = (badjust * elsize);
03425 if (dv->type_lens.type == DVTYPE_DERIVEDWORD) {
03426 sizeamt = sizeof(int);
03427 } else if (dv->type_lens.type == DVTYPE_DERIVEDBYTE) {
03428 sizeamt = 1 * bytesperchar;
03429 } else {
03430 sizeamt = (signed)SMSCALE(dv);
03431 }
03432
03433 switch(nd) {
03434 case 7:
03435 for (id7 = 0; id7 < dimen[6].extent; id7++) {
03436 case 6:
03437 for (id6 = 0; id6 < dimen[5].extent; id6++) {
03438 case 5:
03439 for (id5 = 0; id5 < dimen[4].extent; id5++) {
03440 case 4:
03441 for (id4 = 0; id4 < dimen[3].extent; id4++) {
03442 case 3:
03443 for (id3 = 0; id3 < dimen[2].extent; id3++) {
03444 case 2:
03445 for (id2 = 0; id2 < dimen[1].extent; id2++) {
03446 case 1:
03447 for (id1 = 0; id1 < dimen[0].extent; id1++) {
03448 ret = _nlrdent(css, cup, vdr, cnt, lastch, bte);
03449
03450 if (ret != 0) goto done;
03451 bte += dimen[0].stride_mult * sizeamt;
03452 }
03453 if (nd == 1) goto done;
03454 bte += dimen[1].stride_mult * sizeamt;
03455 }
03456 if (nd == 2) goto done;
03457 bte += dimen[2].stride_mult * sizeamt;
03458 }
03459 if (nd == 3) goto done;
03460 bte += dimen[3].stride_mult * sizeamt;
03461 }
03462 if (nd == 4) goto done;
03463 bte += dimen[4].stride_mult * sizeamt;
03464 }
03465 if (nd == 5) goto done;
03466 bte += dimen[5].stride_mult * sizeamt;
03467 }
03468 if (nd == 6) goto done;
03469 bte += dimen[6].stride_mult * sizeamt;
03470 }
03471 }
03472 done: return(ret);
03473 }