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 #pragma ident "@(#) libf/fio/rnl90to77.c 92.3 06/21/99 10:37:55"
00039
00040 #include <stdio.h>
00041 #include <errno.h>
00042 #include <liberrno.h>
00043 #include <fortran.h>
00044 #include <stdlib.h>
00045 #include <cray/fmtconv.h>
00046 #include <cray/nassert.h>
00047 #if !defined(_ABSOFT)
00048 #include <sys/unistd.h>
00049 #endif
00050 #include "fio.h"
00051 #include "namelist.h"
00052 #include "rnl90def.h"
00053 #include "fmt.h"
00054
00055
00056 extern int _s_scan_extensions(void *ptr, ftype_t type, unsigned elsize,
00057 long *field_begin, unsigned rec_chars, int *fwptr, long cmode);
00058 extern int _nicverr(const int _Nicverror);
00059
00060
00061
00062
00063
00064
00065
00066
00067 #define SUBGTC(x) { \
00068 while (cup->ulinecnt == 0) { \
00069 if (errn = _nlrd_fillrec(css, cup, echoptr)) { \
00070 return(errn); \
00071 } \
00072 } \
00073 x = (char) *cup->ulineptr++; \
00074 cup->ulinecnt--; \
00075 }
00076
00077 #define CMTSUBGT(x) { \
00078 while (cup->ulinecnt == 0) { \
00079 if (errn = _nlrd_fillrec(css, cup, echoptr)) { \
00080 return(errn); \
00081 } \
00082 } \
00083 x = (char) *cup->ulineptr++; \
00084 \
00085 if (MATCH(x, _MASKS, MRNLCOMM)) { \
00086 x = ' '; \
00087 cup->ulinecnt = 1; \
00088 } \
00089 cup->ulinecnt--; \
00090 }
00091
00092 #define CMTSUBGTNOEOR(x) { \
00093 if (cup->ulinecnt == 0) { \
00094 x = ' '; \
00095 } else { \
00096 x = (char) *cup->ulineptr++; \
00097 cup->ulinecnt--; \
00098 } \
00099 \
00100 if (MATCH(x, _MASKS, MRNLCOMM)) { \
00101 x = ' '; \
00102 cup->ulinecnt = 1; \
00103 } \
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113 #define MAINGT(x) { \
00114 while (cup->ulinecnt == 0) { \
00115 if (errn = _nlrd_fillrec(css, cup, echoptr)) { \
00116 if (errn < 0) { \
00117 ENDD(endf, css, FERDPEOF); \
00118 } \
00119 else { \
00120 ERROR0(errf, css, errn); \
00121 } \
00122 } \
00123 } \
00124 x = (char) *cup->ulineptr++; \
00125 cup->ulinecnt--; \
00126 }
00127
00128 #define CMTMAINGT(x) { \
00129 while (cup->ulinecnt == 0) { \
00130 if (errn = _nlrd_fillrec(css, cup, echoptr)) { \
00131 if (errn < 0) { \
00132 ENDD(endf, css, FERDPEOF); \
00133 } \
00134 else { \
00135 ERROR0(errf, css, errn); \
00136 } \
00137 } \
00138 } \
00139 x = (char) *cup->ulineptr++; \
00140 \
00141 if (MATCH(x, _MASKS, MRNLCOMM)) { \
00142 x = ' '; \
00143 cup->ulinecnt = 1; \
00144 } \
00145 cup->ulinecnt--; \
00146 }
00147
00148 #define GETSECTION(x) { \
00149 field_begin = cup->ulineptr; \
00150 field_end = cup->ulineptr; \
00151 for (j = 0; j < cup->ulinecnt; j++) { \
00152 x = (char) *field_end; \
00153 if (x == ')' || x == ',' || x == ':') \
00154 break; \
00155 field_end++; \
00156 } \
00157 field_width = j; \
00158 }
00159
00160
00161
00162
00163
00164
00165 #define GETSTR77() { \
00166 if (cup->ulinecnt <= 1) { \
00167 SUBGTC(ch); \
00168 } \
00169 SUBGTC(ch); \
00170 if (ch == enddelim) { \
00171 eos = -1; \
00172 SUBGTC(ch); \
00173 if (ch == enddelim) \
00174 eos = 0; \
00175 else { \
00176 cup->ulineptr--; \
00177 cup->ulinecnt++; \
00178 } \
00179 } \
00180 }
00181
00182
00183
00184
00185
00186
00187 struct Echoinfo {
00188 unum_t eunit;
00189 int rnlecho;
00190 };
00191
00192
00193
00194
00195
00196 ic_func *ncf_tab77[] = {
00197 NULL,
00198 NULL,
00199 _iu2s,
00200 _defgu2sd,
00201 _defgu2sd,
00202 NULL,
00203 NULL,
00204 };
00205
00206
00207
00208
00209
00210 #define MATCH(c,a,b) (a[(c >= 0x3f) ? b+1 : b] & (1 << (IND(c))))
00211
00212
00213 #define IND(c) ((c >= 0x3f) ? 0x7f - (unsigned)c : (unsigned)(0x40 - c - 1))
00214
00215 static void _nlrdecho(unum_t eunit, long *input_ptr, long nchrs, FIOSPTR css);
00216
00217 static int _nlrd_fillrec(FIOSPTR css, unit *cup, struct Echoinfo *echoptr);
00218
00219 static void _setunit(char *string, void *u);
00220
00221 static int _getname(FIOSPTR css, unit *cup, char *buf, char *lastc,
00222 struct Echoinfo *echoptr);
00223
00224 static void _pr_echomsg(char *string);
00225
00226 static void _cnvrt_toupper(char *bufr);
00227
00228 static int _ishol(long *hlptr, unit *cup);
00229
00230 static nmlist_goli_t *_findname(char *key, nmlist_goli_t *nlvar,
00231 unsigned countitm);
00232
00233 static int _getnlval(FIOSPTR css, nmlist_goli_t *nlvar, char *lastc,
00234 unit *cup, struct Echoinfo *echoptr);
00235
00236 static int _indx_nl(FIOSPTR css, unit *cup, struct Echoinfo *echoptr,
00237 long *begcnt, int *ndim, long strbegend[3], int *encnt, int *icnt,
00238 int arryflag);
00239
00240 static int _nlread(FIOSPTR css, ftype_t type, void *ptr, int cnt, int inc,
00241 char *lastc, unit *cup, struct Echoinfo *echoptr, int elsize);
00242
00243 static int _nexdata(FIOSPTR css, ftype_t type, void *ptr, int cnt, int inc,
00244 char lastc, unit *cup, struct Echoinfo *echoptr, long *lval,
00245 int *lcount, int elsize, int *nullvlu);
00246
00247 static int _g_charstr(FIOSPTR css, unit *cup, void *p, int cnt, char c,
00248 struct Echoinfo *echoptr, int lcount,int elsize, int *nullvlu);
00249
00250 static int _g_complx(FIOSPTR css, unit *cup, ftype_t type,
00251 struct Echoinfo *echoptr, long *lval,int elsize);
00252
00253 static int _g_number(ftype_t type, unit *cup,long *lval, int elsize);
00254
00255 static int _gocthex(FIOSPTR css, unit *cup, ftype_t type,
00256 struct Echoinfo *echoptr, long *lval, int base, int elsize,
00257 int *nullvlu);
00258
00259 static int _get_holl(FIOSPTR css, unit *cup, char holltype, int count,
00260 ftype_t type, struct Echoinfo *echoptr, long *lval, int elsize);
00261
00262 static int _get_quoholl(FIOSPTR css, unit *cup, char cdelim, ftype_t type,
00263 struct Echoinfo *echoptr, long *lval, int elsize);
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 int
00288 _rnl90to77(
00289 FIOSPTR css,
00290 unit *cup,
00291 nmlist_group *namlist,
00292 void *stck,
00293 int errf,
00294 int endf)
00295 {
00296 long stat;
00297 long *hlptr;
00298 int ret;
00299 int ss;
00300 char buf[MAXNAML + 5], c;
00301 char skipmsg[sizeof(SKIPMSG) + sizeof(UNITSTR) +
00302 MAXNAML + 8 + 2];
00303 char tmpbuf[MXUNITSZ];
00304 int errn;
00305 long flag;
00306 unum_t unum;
00307 unsigned rlen;
00308 unsigned rcount;
00309 char *rptr;
00310 char *varptr;
00311 unsigned varlen;
00312 nmlist_goli_t *nlvar;
00313 nmlist_goli_t *fdvar;
00314 ftype_t type;
00315 struct Echoinfo echoinfo;
00316 struct Echoinfo *echoptr;
00317 type = DVTYPE_UNUSED;
00318 varptr = NULL;
00319
00320
00321
00322
00323
00324 unum = cup->uid;
00325 echoptr = &echoinfo;
00326
00327
00328 if (cup->ulinecnt == 0)
00329 cup->ulinecnt = 1;
00330 *(cup->ulinebuf + cup->ulinecnt) = (_f_int) BLANK;
00331 (void) strcpy(skipmsg, SKIPMSG);
00332
00333
00334 if (_OUT_UNIT < 0) {
00335 echoinfo.eunit = 101;
00336 echoinfo.rnlecho = 0;
00337 }
00338 else {
00339 echoinfo.eunit = _OUT_UNIT;
00340 echoinfo.rnlecho = 1;
00341 }
00342
00343 if ((echoptr->rnlecho) ||
00344 (MATCH(*cup->ulinebuf, _MASKS, MRNLFLAG))) {
00345
00346 echoptr->rnlecho = 1;
00347 _nlrdecho(echoptr->eunit, cup->ulinebuf, cup->ulinecnt, css);
00348 }
00349 cup->ulineptr = cup->ulinebuf + 1;
00350 fill:
00351 while (cup->ulinecnt == 0) {
00352 errn = _nlrd_fillrec(css, cup, &echoinfo);
00353 if (errn != 0)
00354 goto err_eof;
00355 }
00356 fill1:
00357 do {
00358 CMTMAINGT(c)
00359 } while (ISBLANK(c));
00360 if (!(MATCH(c, _MASKS, MRNLDELIM))) {
00361
00362
00363
00364
00365 cup->ulinecnt = 0;
00366 goto fill;
00367 }
00368
00369
00370 MAINGT(c);
00371
00372 errn = _getname(css, cup, buf, &c, &echoinfo);
00373 if (errn != 0)
00374 goto err_eof;
00375
00376 _cnvrt_toupper(buf);
00377
00378 assert ( (cup != NULL));
00379 rcount = namlist->icount;
00380 rptr = _fcdtocp(namlist->group_name);
00381 rlen = _fcdlen(namlist->group_name);
00382 nlvar = namlist->goli;
00383
00384 if (strncmp(rptr,buf,rlen)) {
00385 int i;
00386
00387
00388
00389 if ((cup->ufnl_skip != 0) ||
00390 (cup->ufcompat == AS_IRIX_F77) ||
00391 (cup->ufcompat == AS_IRIX_F90))
00392 goto get_delim;
00393 if (_SKP_MESS > 0) {
00394
00395 (void) strcpy(&skipmsg[sizeof(SKIPMSG)-1], buf);
00396 (void) strcat(skipmsg, UNITSTR);
00397 _setunit(tmpbuf, &unum);
00398
00399
00400
00401
00402
00403
00404 (void) strncat(skipmsg, tmpbuf, sizeof(long) - 1);
00405 (void) strcat(skipmsg, "\n");
00406 _pr_echomsg(skipmsg);
00407 }
00408 else if (_SKP_MESS < 0) {
00409
00410 errn = FENLIVGP;
00411 ERROR1(errf, css, errn, buf);
00412 }
00413 get_delim:
00414
00415
00416
00417 while (!MATCH(c, _MASKS, MRNLDELIM) && c != '/') {
00418 if (c == '\'' || c == '"') {
00419 char qchar;
00420 qchar = c;
00421 rquote:
00422 do {
00423 MAINGT(c);
00424 } while (c != qchar);
00425 MAINGT(c);
00426
00427 if (c == qchar)
00428 goto rquote;
00429 }
00430 else {
00431 CMTMAINGT(c);
00432 }
00433 }
00434
00435
00436
00437
00438
00439
00440 hlptr = cup->ulineptr - 2;
00441
00442
00443
00444
00445
00446 for (i = 0; i < (sizeof(_f_int)) &&
00447 hlptr > &cup->ulinebuf[2]; i++, hlptr--) {
00448 switch((char) *hlptr) {
00449 case 'h':
00450 case 'H':
00451 case 'l':
00452 case 'L':
00453 case 'r':
00454 case 'R':
00455 if (_ishol(hlptr, cup)) {
00456 CMTMAINGT(c);
00457 goto get_delim;
00458 }
00459 break;
00460 default:
00461 break;
00462 }
00463 }
00464 goto fill1;
00465 }
00466
00467
00468
00469
00470
00471
00472 while (c != '/') {
00473 int sepcnt;
00474 if (MATCH(c, _MASKS, MRNLDELIM))
00475 goto finalization;
00476
00477 errn = _getname(css, cup, buf, &c, &echoinfo);
00478 if (errn != 0)
00479 goto err_eof;
00480 _cnvrt_toupper(buf);
00481
00482 if (!(fdvar = _findname(buf, nlvar, rcount))) {
00483 if (strlen(buf) > 0) {
00484
00485 errn = FENLNREC;
00486 ERROR1(errf, css, errn, buf);
00487 }
00488 else {
00489
00490 errn = 0;
00491 goto finalization;
00492 }
00493 }
00494
00495
00496
00497 errn = _getnlval(css, fdvar, &c, cup, &echoinfo);
00498 if (errn != 0)
00499 goto err_eof;
00500 sepcnt = 0;
00501 for ( ; ; ) {
00502 if (!(ISBLANK(c))) {
00503 if ((MATCH(c, _MASKS, MRNLSEP)) &&
00504 (sepcnt == 0)) {
00505
00506 sepcnt++;
00507 }
00508 else
00509 break;
00510 }
00511 CMTMAINGT(c);
00512 }
00513 }
00514
00515
00516
00517
00518 finalization:
00519 return(errn);
00520 err_eof:
00521
00522 if(errn < 0) {
00523 ENDD(endf, css, FERDPEOF);
00524 } else if (errn == FENLSTRN || errn == FENLSTRG ||
00525 errn == FENLSUBD || errn == FENLSUBN ||
00526 errn == FENLSUBS || errn == FENLIVIT ||
00527 errn == FENLARSC || errn == FENLLGNM ||
00528 errn == FENLUNKI || errn == FENLUNKN) {
00529 ERROR1(errf, css, errn, buf);
00530 } else {
00531 ERROR0(errf, css, errn);
00532 }
00533 goto finalization;
00534 }
00535
00536
00537
00538
00539
00540
00541
00542
00543 static int
00544 _nlrd_fillrec(FIOSPTR css, unit *cup, struct Echoinfo *echoptr)
00545 {
00546 register int errn;
00547
00548 errn = css->u.fmt.endrec(css, cup, 1);
00549
00550 if (errn != 0) {
00551 return(errn);
00552 } else {
00553 if (cup->ulinecnt == 0)
00554 cup->ulinecnt = 1;
00555
00556 *(cup->ulinebuf + cup->ulinecnt) = (long) BLANK;
00557 if ((echoptr->rnlecho) ||
00558 (MATCH(*cup->ulinebuf, _MASKS, MRNLFLAG))) {
00559
00560 echoptr->rnlecho = 1;
00561 _nlrdecho(echoptr->eunit, cup->ulinebuf,
00562 cup->ulinecnt, css);
00563 }
00564
00565
00566
00567 cup->ulineptr++;
00568 }
00569 return(errn);
00570 }
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587 static int
00588 _getname(FIOSPTR css, unit *cup, char *s, char *lastc, struct Echoinfo *echoptr)
00589 {
00590 char *p, c;
00591 int n, errn;
00592 errn = 0;
00593 n = MAXNAML + 5;
00594 p = s;
00595 c = *lastc;
00596
00597
00598
00599
00600 while (ISBLANK(c))
00601 CMTSUBGT(c);
00602
00603 while (!(ISBLANK(c)) && (c != '(') && !(MATCH(c, _MASKS, MRNLREP)) &&
00604 !(MATCH(c, _MASKS, MRNLDELIM)) && (c != '/')) {
00605 *p++ = c;
00606 CMTSUBGTNOEOR(c);
00607 if (n-- == 0) {
00608 errn = FENLLGNM;
00609 p--;
00610 break;
00611 }
00612 }
00613 *lastc = c;
00614 *p = '\0';
00615 return (errn);
00616 }
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628 static nmlist_goli_t
00629 *_findname(char *key, nmlist_goli_t *nlvar, unsigned countitm)
00630 {
00631 char *varptr;
00632 unsigned varlen;
00633 nmlist_goli_t *newitem;
00634 int cnt, lcnt;
00635
00636 newitem = nlvar;
00637 cnt = countitm;
00638 lcnt = strlen(key);
00639
00640 while (cnt--) {
00641 varptr = _fcdtocp(newitem->goli_name);
00642 varlen = _fcdlen(newitem->goli_name);
00643 if ((varlen == lcnt) && (!strncmp(key, varptr, lcnt)))
00644 return (newitem);
00645 else
00646 #if defined(__mips) && (_MIPS_SZLONG == 32)
00647 newitem = (nmlist_goli_t*)((long *)newitem +
00648 3 + (sizeof(_fcd))/(sizeof(long)));
00649 #else
00650 newitem = (nmlist_goli_t*)((long *)newitem +
00651 2 + (sizeof(_fcd))/(sizeof(long)));
00652 #endif
00653 }
00654 return (NULL);
00655 }
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670 static int
00671 _getnlval(FIOSPTR css, nmlist_goli_t *nlvar, char *lastc, unit *cup,
00672 struct Echoinfo *echoptr)
00673 {
00674 long ss, cntp;
00675 long stat;
00676 int ndim = 0;
00677 int i;
00678 int encnt = 0;
00679 int icnt = 0;
00680 long begcnt[MAXDIM];
00681 long strbegend[3];
00682 char *cp;
00683 char c;
00684 long vaddr;
00685 long errn = 0;
00686
00687 for (i=0; i < MAXDIM; i++) {
00688 begcnt[i] = 0;
00689 }
00690 strbegend[0] = -1;
00691 strbegend[1] = -1;
00692 strbegend[2] = -1;
00693
00694 switch (nlvar->valtype) {
00695 case IO_SCALAR:
00696 {
00697 nmlist_scalar_t *nlscalar;
00698 unsigned elsize;
00699 unsigned int_len;
00700 void *vaddr;
00701 ftype_t type;
00702
00703 nlscalar = nlvar->goli_addr.ptr;
00704 type = nlscalar->tinfo.type;
00705 int_len = nlscalar->tinfo.int_len;
00706
00707 assert (type >= DVTYPE_TYPELESS && type <= DVTYPE_ASCII);
00708 assert(nlscalar->tinfo.int_len > 0 );
00709 if ((type != DVTYPE_ASCII) && (*lastc == '(')) {
00710 errn = FENLUNKI;
00711 break;
00712 }
00713 if (type == DVTYPE_ASCII)
00714 strbegend[0] = 0;
00715
00716 if (*lastc == '(') {
00717 errn = _indx_nl(css, cup, echoptr, begcnt, &ndim,
00718 strbegend, &encnt, &icnt, 0);
00719 if (errn != 0) {
00720 if (errn == FENLSUBS)
00721 errn = FENLSTRG;
00722 else if (errn == FENLSUBN)
00723 errn = FENLSTRN;
00724 break;
00725 }
00726 }
00727 else {
00728 while (ISBLANK(*lastc)) {
00729 CMTSUBGT(*lastc);
00730 }
00731 if (MATCH(*lastc, _MASKS, MRNLDELIM) ||
00732 (*lastc == '/')) {
00733 errn = 0;
00734 break;
00735 }
00736
00737 if (!(MATCH(*lastc, _MASKS, MRNLREP))) {
00738 errn = FENLNOVL;
00739 break;
00740 }
00741 }
00742 CMTSUBGT(*lastc);
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754 if (type == DVTYPE_ASCII) {
00755 char *wptr;
00756 const int bytesperchar = 1;
00757 int begt = strbegend[1];
00758 int endt = strbegend[2];
00759 wptr = _fcdtocp(nlscalar->scal_addr.charptr);
00760 elsize = _fcdlen(nlscalar->scal_addr.charptr);
00761 elsize = elsize * bytesperchar;
00762
00763 if (strbegend[0] > 0) {
00764 if (begt < 1 )
00765 begt = 1;
00766 else if (begt > elsize) {
00767 errn = FENLUNKN;
00768 break;
00769 }
00770 if (endt < 1 )
00771 endt = elsize;
00772 else if ((endt > elsize) || (endt < begt)) {
00773 errn = FENLUNKN;
00774 break;
00775 }
00776 wptr = wptr + (begt - 1);
00777 elsize = (endt - begt) + 1;
00778 }
00779 vaddr = wptr;
00780 }
00781 else {
00782 vaddr = nlscalar->scal_addr.ptr;
00783 elsize = int_len >> 3;
00784 }
00785 c = *lastc;
00786 cntp = 1;
00787 errn = _nlread(css, type, vaddr, cntp, 0, &c, cup, echoptr,
00788 elsize);
00789 *lastc = c;
00790 break;
00791 }
00792 case IO_DOPEVEC:
00793 {
00794 struct DvDimen *dvdimn;
00795 struct DvDimen dimen[MAXDIM];
00796 DopeVectorType *nldv;
00797 unsigned elsize;
00798 unsigned extent = 1;
00799 unsigned int_len;
00800 void *vaddr;
00801 int nc, mult, offs;
00802 ftype_t type;
00803 nldv = nlvar->goli_addr.dv;
00804 mult = 1;
00805 offs = 0;
00806
00807
00808 assert ( nldv != NULL );
00809 assert ( nldv->type_lens.int_len > 0 );
00810 type = nldv->type_lens.type;
00811 if (type == DVTYPE_ASCII)
00812 strbegend[0] = 0;
00813 for (i=0; i < nldv->n_dim; i++) {
00814 begcnt[i] = nldv->dimension[i].low_bound;
00815 }
00816
00817
00818 if (*lastc == '(') {
00819 errn = _indx_nl(css, cup, echoptr, begcnt, &ndim,
00820 strbegend, &encnt, &icnt, 1);
00821 if (errn != 0)
00822 break;
00823 }
00824 else {
00825 while (ISBLANK(*lastc)) {
00826 CMTSUBGT(*lastc);
00827 }
00828
00829 if (!(MATCH(*lastc, _MASKS, MRNLREP))) {
00830 return(FENLNOVL);
00831 }
00832 }
00833 CMTSUBGT(*lastc);
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845 int_len = nldv->type_lens.int_len;
00846 if ((ndim != 0) && (ndim != nldv->n_dim)) {
00847 errn = FENLBNDY;
00848 break;
00849 }
00850 for (nc = 0; nc < nldv->n_dim; nc++) {
00851 extent *= nldv->dimension[nc].extent;
00852 }
00853 if (ndim > 0) {
00854 offs = begcnt[0] - (nldv->dimension[0].low_bound);
00855 for (nc = 1; nc < ndim; nc++) {
00856 mult = mult * (nldv->dimension[nc-1].extent);
00857 offs = offs + ((begcnt[nc] -
00858 nldv->dimension[nc].low_bound) * mult);
00859 }
00860 extent = extent - offs;
00861 }
00862 if (type == DVTYPE_ASCII) {
00863 char *wptr;
00864 const int bytesperchar = 1;
00865 int begt = strbegend[1];
00866 int endt = strbegend[2];
00867 wptr = _fcdtocp(nldv->base_addr.charptr);
00868 elsize = _fcdlen(nldv->base_addr.charptr);
00869 elsize = elsize * bytesperchar;
00870
00871 wptr += offs * elsize;
00872 if (strbegend[0] > 0) {
00873 if (begt < 1 )
00874 begt = 1;
00875 else if (begt > elsize) {
00876 errn = FENLUNKN;
00877 return(errn);
00878 }
00879 if (endt < 1 )
00880 endt = elsize;
00881 else if ((endt > elsize) || (endt < begt)) {
00882 errn = FENLUNKN;
00883 break;
00884 }
00885 wptr = wptr + (begt - 1);
00886 elsize = (endt - begt) + 1;
00887 }
00888 vaddr = wptr;
00889 }
00890 else {
00891 bcont *iwptr;
00892 iwptr = (bcont*)nldv->base_addr.a.ptr;
00893 elsize = int_len >> 3;
00894 iwptr += offs * (elsize / (sizeof(bcont)));
00895 vaddr = iwptr;
00896 }
00897
00898 assert ( elsize > 0 && extent > 0 );
00899 c = *lastc;
00900 cntp = extent;
00901 errn = _nlread(css, type, vaddr, cntp, 1, &c, cup, echoptr,
00902 elsize);
00903 *lastc = c;
00904 break;
00905 }
00906 case IO_STRUC_A:
00907 case IO_STRUC_S:
00908 {
00909
00910 errn = FENLSTCT;
00911 break;
00912 }
00913 default:
00914 errn = FEINTUNK;
00915 }
00916 return(errn);
00917 }
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927 static int
00928 _nlread(FIOSPTR css, ftype_t type, void *ptr, int cntp, int incrm,
00929 char *lastc, unit *cup, struct Echoinfo *echoptr, int elsize)
00930 {
00931 long ss, ncntp;
00932 long stat;
00933 char c;
00934 void *vaddr;
00935 long errn = 0;
00936 int lcount;
00937 long lval[9];
00938 bcont *sval;
00939 int nullvlu;
00940 c = *lastc;
00941 ncntp = cntp;
00942 vaddr = ptr;
00943 nullvlu = 0;
00944
00945 while (ncntp > 0) {
00946 errn = _nexdata(css, type, vaddr, ncntp, 1, c, cup, echoptr,
00947 lval, &lcount, elsize, &nullvlu);
00948 if (errn != 0)
00949 return(errn);
00950 else {
00951 if (nullvlu == 2) {
00952 lcount = 0;
00953 ncntp = 0;
00954 }
00955 }
00956 if (lcount > ncntp) {
00957 errn = FENLTOOM;
00958 return(errn);
00959 }
00960 if (type == DVTYPE_ASCII) {
00961 char *wptr;
00962 wptr = vaddr;
00963
00964
00965
00966 ncntp = ncntp - lcount;
00967 wptr = wptr + (lcount * elsize);
00968 vaddr = wptr;
00969 }
00970 else {
00971 int move;
00972 int *iptr;
00973 int ix, lim;
00974 bcont *siptr;
00975 move = MIN(ncntp,lcount);
00976 lim = elsize/(sizeof(bcont));
00977 siptr = (bcont*) vaddr;
00978
00979 while (move != 0) {
00980 sval = (bcont*) lval;
00981
00982 if (!nullvlu) {
00983 for (ix=0; ix < lim; ix++) {
00984 *siptr = *sval;
00985 siptr++;
00986 sval++;
00987 }
00988 } else
00989 siptr = siptr + lim;
00990 vaddr = siptr;
00991 move--;
00992 ncntp--;
00993 lcount--;
00994 }
00995 }
00996
00997 do {
00998 CMTSUBGT(*lastc);
00999 } while (ISBLANK(*lastc));
01000
01001
01002
01003
01004 if (MATCH(*lastc, _MASKS, MRNLSEP)) {
01005 do {
01006 CMTSUBGT(*lastc);
01007 } while (ISBLANK(*lastc));
01008 }
01009 c = *lastc;
01010 }
01011 return(0);
01012 }
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025 static int
01026 _indx_nl(
01027 FIOSPTR css, unit *cup, struct Echoinfo *echoptr,
01028 long *begcnt, int *ndima, long strbegend[3],
01029 int *encnt, int *icnt, int arryflag)
01030 {
01031 long *oldp, *newp;
01032 long mode, ss;
01033 long offs, mult;
01034 char c;
01035 int i, j, ir1, en1;
01036 long dummy;
01037 int errn = 0;
01038 long stat;
01039 long field_width;
01040 long *field_begin;
01041 long *field_end;
01042 long tempbuf[2];
01043 en1 = 0;
01044 ir1 = 0;
01045 if (arryflag) {
01046 for (i = 0; i < MAXDIMS; ) {
01047 long dummy;
01048
01049
01050
01051 do {
01052 SUBGTC(c);
01053 } while (ISBLANK(c));
01054
01055
01056 if (c == ')')
01057 break;
01058 cup->ulinecnt++;
01059 cup->ulineptr--;
01060
01061
01062 GETSECTION(c);
01063 if (field_width == 0)
01064 goto indxgetext;
01065
01066 field_end++;
01067 tempbuf[0] = 0;
01068 tempbuf[1] = 0;
01069 mode = 0;
01070 (void) _iu2s(field_begin, &field_width,
01071 &field_end, &mode, tempbuf, &stat,
01072 &dummy, &dummy);
01073 if(stat < 0) {
01074 errn = FENLSUBS;
01075 return(errn);
01076 }
01077 begcnt[i] = *((_f_int8 *)tempbuf);
01078 indxgetext:
01079
01080 cup->ulineptr = field_begin + field_width;
01081 cup->ulinecnt = cup->ulinecnt - field_width;
01082
01083
01084 if (c == ':')
01085 return(FENLARSC);
01086
01087
01088 i++;
01089 do {
01090 SUBGTC(c);
01091 } while (ISBLANK(c));
01092
01093 if (c == ')')
01094 break;
01095 if (c != ',') {
01096 errn = FENLSUBD;
01097 return(errn);
01098 }
01099 }
01100 *ndima = i;
01101 *encnt = en1;
01102 *icnt = ir1;
01103 if (i == 0) {
01104 errn = FENLSUBN;
01105 return(errn);
01106 }
01107 }
01108 if (strbegend[0] == 0) {
01109 j = 0;
01110 if (arryflag) {
01111 SUBGTC(c);
01112 } else
01113 c = '(';
01114
01115 if (c == '(') {
01116 #if defined(__mips) || defined(_LITTLE_ENDIAN)
01117
01118 do {
01119 SUBGTC(c);
01120 } while (ISBLANK(c));
01121 if (c == ')') {
01122 errn = FENLSTRN;
01123 return(errn);
01124 }
01125 cup->ulinecnt++;
01126 cup->ulineptr--;
01127 #endif
01128 GETSECTION(c);
01129 if (field_width == 0)
01130 goto indxstrend;
01131
01132 field_end++;
01133 tempbuf[0] = 0;
01134 tempbuf[1] = 0;
01135 mode = 0;
01136 (void) _iu2s(field_begin, &field_width, &field_end,
01137 &mode, tempbuf, &stat, &dummy, &dummy);
01138 if(stat < 0) {
01139 errn = FENLSTRG;
01140 return(errn);
01141 }
01142 strbegend[1] = *((_f_int8 *)tempbuf);
01143 j++;
01144 indxstrend:
01145
01146 cup->ulineptr = field_begin + field_width;
01147 cup->ulinecnt = cup->ulinecnt - field_width;
01148 if (c == ':') {
01149
01150 SUBGTC(c);
01151 #if defined(__mips) || defined(_LITTLE_ENDIAN)
01152
01153 do {
01154 SUBGTC(c);
01155 } while (ISBLANK(c) || (c == ':'));
01156 if (c == ')')
01157 goto indxstrout;
01158 cup->ulinecnt++;
01159 cup->ulineptr--;
01160 #endif
01161 GETSECTION(c);
01162 if (field_width == 0)
01163 goto indxstrdon;
01164
01165 field_end++;
01166 tempbuf[0] = 0;
01167 tempbuf[1] = 0;
01168 mode = 0;
01169 (void) _iu2s(field_begin, &field_width,
01170 &field_end, &mode, tempbuf,
01171 &stat, &dummy, &dummy);
01172 if(stat < 0) {
01173 errn = FENLSTRG;
01174 return(errn);
01175 }
01176 strbegend[2] = *((_f_int8 *)tempbuf);
01177 j++;
01178 indxstrdon:
01179
01180 cup->ulineptr = field_begin + field_width;
01181 cup->ulinecnt = cup->ulinecnt - field_width;
01182 }
01183 #if !defined(__mips) && !defined(_LITTLE_ENDIAN)
01184 else {
01185 errn = FENLSTRN;
01186 return(errn);
01187 }
01188 #endif
01189 indxstrout:
01190 strbegend[0] = j;
01191 }
01192 }
01193
01194
01195
01196
01197 while (!(MATCH(c, _MASKS, MRNLREP))) {
01198 SUBGTC(c);
01199 }
01200 return(errn);
01201 }
01202
01203
01204
01205
01206
01207
01208 static void
01209 _nlrdecho(
01210 unum_t eunit,
01211 long *input_ptr,
01212 long ncrs,
01213 FIOSPTR css)
01214 {
01215 long stat;
01216 unit *echoup;
01217 long blk = BLANK;
01218 echoup = _get_cup(eunit);
01219 if (echoup == NULL) {
01220 unit *cupsave;
01221 cupsave = css->f_cu;
01222 echoup = _imp_open77(css, SEQ, FMT, eunit, 1, NULL);
01223 css->f_cu = cupsave;
01224 if (echoup == NULL)
01225 return;
01226 }
01227 else {
01228 if (echoup->ufmt == 0)
01229 _ferr(css, FEFMTTIV);
01230 if (echoup->useq == 0)
01231 _ferr(css, FESEQTIV);
01232 }
01233
01234
01235
01236
01237 (void) _fwch(echoup, &blk, 1, PARTIAL);
01238 (void) _fwch(echoup, input_ptr, ncrs, FULL);
01239 (void) _release_cup(echoup);
01240 return;
01241 }
01242
01243
01244
01245
01246
01247
01248
01249 static void
01250 _setunit(
01251 char *string,
01252 void *u)
01253 {
01254 register unum_t unum;
01255
01256 if (_is_file_name(*((long *)u)))
01257 (void) strncpy(string, (char *)u, sizeof(long) - 1);
01258 else {
01259 unum = *((unum_t *)u);
01260 (void) sprintf(string, "%lld", unum);
01261 }
01262
01263 return;
01264 }
01265
01266 static void
01267 _pr_echomsg(char *string)
01268 {
01269 (void) write(fileno(errfile), string, strlen(string));
01270
01271 return;
01272 }
01273
01274
01275
01276 static void
01277 _cnvrt_toupper(char *buf)
01278 {
01279 register char c;
01280
01281 while ((c = *buf) != '\0')
01282 *buf++ = toupper(c);
01283
01284 return;
01285 }
01286
01287
01288
01289
01290
01291
01292
01293
01294 static int
01295 _ishol(long *hlptr, unit *cup)
01296 {
01297 char hlval;
01298
01299 hlval = (char) *(hlptr - 1);
01300 if (isdigit(hlval) && ((hlval - '0') <= (sizeof(_f_int))) && ((hlval - '0') > 0)) {
01301
01302
01303
01304
01305 if (((hlval - '0') + hlptr) >= ((cup->ulineptr) - 1)) {
01306
01307 if (hlptr > &cup->ulinebuf[3]) {
01308 hlval = (char) *(hlptr - 2);
01309 if (!ISBLANK(hlval) && hlval != '*' &&
01310 !MATCH(hlval, _MASKS, MRNLREP) &&
01311 !MATCH(hlval, _MASKS, MRNLSEP) )
01312 return(0);
01313 }
01314 return(1);
01315 }
01316 return(0);
01317 }
01318 return(0);
01319 }
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333 static int
01334 _nexdata(
01335 FIOSPTR css,
01336 ftype_t type,
01337 void *ptr,
01338 int cnt,
01339 int inc,
01340 char lastc,
01341 unit *cup,
01342 struct Echoinfo *echoptr,
01343 long *lval,
01344 int *lcount,
01345 int elsize,
01346 int *nullvlu)
01347 {
01348 char c, oc;
01349 int ocnt, ss;
01350 long *optr;
01351 int holcnt;
01352 long stat;
01353 char newc;
01354 int errn;
01355 *nullvlu = 0;
01356 c = lastc;
01357 while (ISBLANK(c)) {
01358 CMTSUBGT(c);
01359 }
01360 *lcount = 1;
01361 if (isdigit((int) c)) {
01362
01363
01364
01365 *lcount = c - '0';
01366 ocnt = cup->ulinecnt;
01367 optr = cup->ulineptr;
01368 oc = c;
01369 for (;;) {
01370 if (cup->ulinecnt > 0) {
01371 SUBGTC(c);
01372 } else
01373 break;
01374 if (isdigit((int) c))
01375 *lcount = (*lcount * 10) + c - '0';
01376 else
01377 break;
01378 }
01379
01380
01381
01382
01383 switch (c) {
01384 case '*':
01385
01386 CMTSUBGT(c);
01387 if (isdigit((int) c)) {
01388
01389
01390
01391 holcnt = c - '0';
01392 ocnt = cup->ulinecnt;
01393 optr = cup->ulineptr;
01394 oc = c;
01395 for (;;) {
01396 SUBGTC(c);
01397 if (isdigit((int) c))
01398 holcnt = (holcnt * 10) +
01399 c - '0';
01400 else
01401 break;
01402 }
01403 switch (c) {
01404 case 'H':
01405 case 'h':
01406 case 'R':
01407 case 'r':
01408 case 'L':
01409 case 'l':
01410 return(_get_holl(css, cup, c, holcnt,
01411 type, echoptr, lval, elsize));
01412 default:
01413
01414 cup->ulineptr = optr;
01415
01416 cup->ulinecnt = ocnt;
01417 c = oc;
01418 ocnt = 1;
01419 break;
01420 }
01421 }
01422 break;
01423 case 'H':
01424 case 'h':
01425 case 'R':
01426 case 'r':
01427 case 'L':
01428 case 'l':
01429
01430 holcnt = *lcount;
01431 *lcount = 1;
01432 return(_get_holl(css, cup, c, holcnt, type, echoptr,
01433 lval, elsize));
01434 default:
01435
01436 cup->ulineptr = optr;
01437 cup->ulinecnt = ocnt;
01438 c = oc;
01439 ocnt = 1;
01440 *lcount = 1;
01441 break;
01442 }
01443 }
01444
01445
01446
01447
01448
01449 if (MATCH(c, _MASKS, MRNLSEP)) {
01450 cup->ulineptr--;
01451 cup->ulinecnt++;
01452 *nullvlu = 1;
01453 return(0);
01454 }
01455 else if (ISBLANK(c)) {
01456 *nullvlu = 1;
01457 return(0);
01458 }
01459 else {
01460 if (MATCH(c, _MASKS, MRNLCOMM)) {
01461
01462
01463
01464 *lval = *(lval+1) = 0;
01465
01466
01467
01468 cup->ulinecnt++;
01469 cup->ulineptr--;
01470 *nullvlu = 1;
01471 return(0);
01472 }
01473 else
01474 if (MATCH(c, _MASKS, MRNLDELIM) || (c == '/')) {
01475
01476
01477
01478
01479 cup->ulineptr--;
01480 cup->ulinecnt++;
01481 *nullvlu = 2;
01482 return(0);
01483 }
01484 }
01485
01486
01487
01488
01489
01490 if (type == DVTYPE_LOGICAL) {
01491 bcont *slval;
01492 slval = (bcont*)lval;
01493
01494
01495
01496
01497
01498
01499
01500 if (c == '.') {
01501 SUBGTC(c);
01502
01503 if ((c == 'T') || (c == 't')) {
01504 switch (elsize) {
01505 #ifdef _F_REAL4
01506 case 4:
01507 *(_f_log4 *)slval = _btol(1);
01508 break;
01509 #endif
01510 case 8:
01511 *(_f_log8 *)slval = _btol(1);
01512 break;
01513 default:
01514 return(FEKNTSUP);
01515 }
01516
01517
01518 } else if ((c == 'F') || (c == 'f')) {
01519 switch (elsize) {
01520 #ifdef _F_REAL4
01521 case 4:
01522 *(_f_log4 *)slval = _btol(0);
01523 break;
01524 #endif
01525 case 8:
01526 *(_f_log8 *)slval = _btol(0);
01527 break;
01528 default:
01529 return(FEKNTSUP);
01530 }
01531 } else {
01532 errn = FENLIVLG;
01533 return(errn);
01534 }
01535 }
01536 else {
01537
01538
01539
01540
01541
01542
01543 ocnt = cup->ulinecnt;
01544 optr = cup->ulineptr;
01545 newc = *optr++;
01546 ocnt--;
01547 while (!(ISBLANK(newc))) {
01548 if (MATCH(newc, _MASKS, MRNLSEP) ||
01549 MATCH(newc, _MASKS, MRNLDELIM) ||
01550 (newc == '/'))
01551 break;
01552 if (MATCH(newc, _MASKS, MRNLREP) ||
01553 (newc == '(')) {
01554
01555
01556
01557 cup->ulineptr--;
01558 cup->ulinecnt++;
01559 *nullvlu = 2;
01560 return(0);
01561 }
01562 newc = *optr++;
01563 ocnt--;
01564 }
01565 while ((ISBLANK(newc)) && ocnt-- > 0)
01566 newc = *optr++;
01567 if (MATCH(newc, _MASKS, MRNLREP)) {
01568
01569
01570
01571
01572 cup->ulineptr--;
01573 cup->ulinecnt++;
01574 *nullvlu = 2;
01575 return(0);
01576 }
01577 if ((c == 'T') || (c == 't')) {
01578 switch (elsize) {
01579 #ifdef _F_REAL4
01580 case 4:
01581 *(_f_log4 *)slval = _btol(1);
01582 break;
01583 #endif
01584 case 8:
01585 *(_f_log8 *)slval = _btol(1);
01586 break;
01587 default:
01588 return(FEKNTSUP);
01589 }
01590 }
01591 else if ((c == 'F') || (c == 'f')) {
01592 switch (elsize) {
01593 #ifdef _F_REAL4
01594 case 4:
01595 *(_f_log4 *)slval = _btol(0);
01596 break;
01597 #endif
01598 case 8:
01599 *(_f_log8 *)slval = _btol(0);
01600 break;
01601 default:
01602 return(FEKNTSUP);
01603 }
01604 }
01605 else if (MATCH(c, _MASKS, MRNLSEP) ||
01606 ISBLANK(c) || (c == ',')) {
01607 *nullvlu = 1;
01608 return(0);
01609 }
01610 else {
01611 errn = FENLIVLG;
01612 return(errn);
01613 }
01614 }
01615
01616
01617
01618 while ( !(ISBLANK(c))) {
01619 CMTSUBGT(c);
01620
01621 if (MATCH(c, _MASKS, MRNLDELIM) || c == '/' ||
01622 MATCH(c, _MASKS, MRNLSEP)) {
01623
01624 cup->ulineptr--;
01625 cup->ulinecnt++;
01626 return(0);
01627 }
01628 }
01629 return(0);
01630 }
01631
01632 if (type == DVTYPE_ASCII)
01633 return (_g_charstr(css, cup, ptr, cnt, c, echoptr, *lcount,
01634 elsize, nullvlu));
01635
01636 if (isdigit((int) c) || c == '+' || c == '-' || c == '.') {
01637 if (type == DVTYPE_COMPLEX) {
01638 errn = FENLIVCX;
01639 return(errn);
01640 }
01641 return(_g_number(type, cup, lval, elsize));
01642 }
01643
01644
01645
01646
01647
01648
01649
01650
01651 if (c == '(') {
01652 return(_g_complx(css, cup, type, echoptr, lval, elsize));
01653 }
01654 else if ((c == '\'') || (c == '"')) {
01655 return(_get_quoholl(css, cup, c, type, echoptr, lval, elsize));
01656 }
01657 else if (c == 'O' || c == 'o') {
01658 return(_gocthex(css, cup, type, echoptr, lval, OCTAL, elsize,
01659 nullvlu));
01660 }
01661 else if (c == 'Z' || c == 'z') {
01662 return(_gocthex(css, cup, type, echoptr, lval, HEX, elsize,
01663 nullvlu));
01664 }
01665 else {
01666
01667
01668
01669
01670
01671
01672
01673 cup->ulineptr--;
01674 cup->ulinecnt++;
01675 *nullvlu = 2;
01676 return(0);
01677 }
01678 }
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688 static int
01689 _g_complx(
01690 FIOSPTR css, unit*cup, ftype_t type, struct Echoinfo *echoptr,
01691 long *lval, int elsize)
01692 {
01693 char c;
01694 long *oldp;
01695 long mode, stat;
01696 long zero = 0;
01697 long field_width;
01698 long *field_begin;
01699 long *field_end;
01700 int ss, i, errn;
01701 int nc;
01702 long *lptr;
01703 ic_func *ngcf;
01704 int inc;
01705 int ptrfw;
01706 bcont *slval;
01707
01708
01709
01710
01711 if (type != DVTYPE_COMPLEX) {
01712 errn = FENLIVCX;
01713 return(errn);
01714 }
01715
01716
01717
01718
01719 ngcf = ncf_tab77[type];
01720 mode = 0;
01721
01722 switch (elsize) {
01723 #ifdef _F_REAL4
01724 case 8:
01725 mode = MODEHP;
01726 break;
01727 #endif
01728 case 16:
01729 break;
01730 case 32:
01731 mode = MODEDP;
01732 break;
01733 default:
01734 return(FEKNTSUP);
01735 }
01736 inc = (elsize / 2) / (sizeof(bcont));
01737 slval = (bcont*)lval;
01738
01739
01740
01741
01742 if (_BLNKSEP == 0)
01743 mode |= MODEBN;
01744
01745 for (i = 0; i < 2; i++) {
01746 do {
01747 SUBGTC(c);
01748 } while (ISBLANK(c));
01749 cup->ulinecnt++;
01750 cup->ulineptr--;
01751 field_begin = cup->ulineptr;
01752 field_end = cup->ulineptr;
01753 field_width = cup->ulinecnt;
01754 nc = 0;
01755
01756
01757
01758
01759 while (nc < cup->ulinecnt && !(*field_end == ')' ||
01760 MATCH(*field_end, _MASKS, MRNLSEP) ||
01761 MATCH(*field_end, _MASKS, MRNLDELIM) ||
01762 (*field_end == '/') ||
01763 (isspace(*field_end) && (_BLNKSEP != 0)) ) ) {
01764 field_end++;
01765 nc++;
01766 }
01767
01768 field_end++;
01769 field_width = nc;
01770
01771 errn = ngcf(field_begin, &field_width, &field_end,
01772 &mode, slval + (i * inc), &stat, &zero, &zero);
01773
01774
01775
01776
01777
01778
01779 if (errn < 0) {
01780 errn = _nicverr(stat);
01781 } else
01782 errn = 0;
01783
01784
01785 if (errn == FENICVIC) {
01786 int errn2;
01787 int new_elsize;
01788 ftype_t new_type;
01789 new_type = DVTYPE_INTEGER;
01790
01791 if (elsize == 32) {
01792 return(errn);
01793 }
01794 new_elsize = elsize >> 1;
01795
01796 errn2 = _s_scan_extensions((slval + (i * inc)),
01797 new_type, new_elsize, field_begin,
01798 field_width, &ptrfw, mode);
01799
01800 cup->ulineptr += ptrfw;
01801 cup->ulinecnt -= ptrfw;
01802 if (errn2 <= 0)
01803 errn = 0;
01804 else
01805
01806
01807
01808 return(FENLIVCX);
01809 } else {
01810 cup->ulineptr = field_begin + field_width;
01811 cup->ulinecnt -= cup->ulineptr - field_begin;
01812 if (errn != 0)
01813 return(errn);
01814 }
01815 do {
01816 SUBGTC(c);
01817 } while (ISBLANK(c));
01818 if ((c != ',') && (i == 0))
01819 return(FENLIVCX);
01820 }
01821 if ( c != ')')
01822 return(FENLIVCX);
01823 return(0);
01824 }
01825
01826
01827
01828
01829
01830
01831
01832
01833 static int
01834 _g_number(
01835 ftype_t type,
01836 unit *cup,
01837 long *lval,
01838 int elsize)
01839 {
01840 long *oldp;
01841 long mode, stat;
01842 long zero = 0;
01843 long field_width;
01844 long *field_begin;
01845 long *field_end;
01846 long *s_field_end;
01847 int ss;
01848 int errn = 0;
01849 int nc;
01850 long *lptr;
01851 ic_func *ngcf;
01852 int ptrfw;
01853 bcont *slval;
01854
01855 mode = 0;
01856
01857 switch (type) {
01858 case DVTYPE_REAL:
01859 switch (elsize) {
01860 #ifdef _F_REAL4
01861 case 4:
01862 mode = MODEHP;
01863 break;
01864 #endif
01865 case 8:
01866 break;
01867 case 16:
01868 mode = MODEDP;
01869 break;
01870 default:
01871 return(FEKNTSUP);
01872 }
01873 break;
01874 case DVTYPE_INTEGER:
01875 switch (elsize) {
01876 #ifdef _F_INT4
01877 case 4:
01878 mode = MODEHP;
01879 break;
01880 #endif
01881 case 8:
01882 break;
01883 default:
01884 return(FEKNTSUP);
01885 }
01886 break;
01887 }
01888
01889
01890
01891
01892 ngcf = ncf_tab77[type];
01893
01894
01895
01896
01897
01898 if (_BLNKSEP == 0)
01899 mode |= MODEBN;
01900 cup->ulinecnt++;
01901 cup->ulineptr--;
01902 field_begin = cup->ulineptr;
01903 field_end = cup->ulineptr;
01904 field_width = cup->ulinecnt;
01905 slval = (bcont*)lval;
01906 nc = 0;
01907
01908
01909
01910
01911 while (nc < cup->ulinecnt &&
01912 !(MATCH(*field_end, _MASKS, MRNLSEP) ||
01913 MATCH(*field_end, _MASKS, MRNLDELIM) || (*field_end == '/') ||
01914 (isspace(*field_end) && (_BLNKSEP != 0)) ) ) {
01915 field_end++;
01916 nc++;
01917 }
01918
01919 field_end++;
01920 field_width = nc;
01921 s_field_end = field_end;
01922 errn = ngcf(field_begin, &field_width, &field_end,
01923 &mode, slval, &stat, &zero, &zero);
01924
01925
01926
01927
01928
01929
01930 if (errn < 0) {
01931 errn = _nicverr(stat);
01932 } else
01933 errn = 0;
01934
01935
01936 if (errn == FENICVIC) {
01937 int errn2;
01938 switch (type) {
01939 case DVTYPE_REAL:
01940 {
01941 long cmode;
01942 int new_elsize;
01943 int new_inc = 0;
01944 ftype_t new_type;
01945 new_type = DVTYPE_INTEGER;
01946 cmode = mode;
01947 new_elsize = elsize;
01948 if (elsize == 16) {
01949 new_elsize = 8;
01950 cmode = 0;
01951 new_inc = new_elsize / (sizeof(bcont));
01952 }
01953
01954 errn2 = _s_scan_extensions((slval + new_inc),
01955 new_type, new_elsize, field_begin,
01956 field_width, &ptrfw, cmode);
01957
01958
01959 if ((elsize == 16) && (errn2 == 0))
01960 *(_f_int8 *)slval = 0;
01961 if (errn2 >= 0)
01962 errn = 0;
01963 else
01964 errn = FENLUNKI;
01965 break;
01966 }
01967 case DVTYPE_INTEGER:
01968 errn2 = _s_scan_extensions(slval, type, elsize,
01969 field_begin, field_width, &ptrfw, mode);
01970
01971
01972
01973
01974 if (errn2 >= 0) {
01975 errn = 0;
01976 } else if (errn == FENICVIC) {
01977 errn2 = 0;
01978 ngcf = ncf_tab77[DVTYPE_REAL];
01979 field_end = s_field_end;
01980 errn2 = ngcf(field_begin, &field_width,
01981 &field_end, &mode, slval, &stat,
01982 &zero, &zero);
01983 if (errn2 < 0)
01984 errn = FENLUNKI;
01985 else {
01986 errn = 0;
01987 switch (errn2) {
01988 #ifdef _F_REAL4
01989 case EX_REAL32:
01990 {
01991 _f_real4 val4;
01992 union {
01993 _f_int4 n;
01994 _f_real4 f;
01995 } uval32;
01996 if (!_TYP_CONV) {
01997 errn = FENLIVIT;
01998 break;
01999 }
02000 uval32.n = *(_f_int4 *)slval;
02001 val4 = uval32.f;
02002 *(_f_int4 *)slval = (_f_int4) val4;
02003 break;
02004 }
02005 #endif
02006 case EX_REAL64:
02007 {
02008 _f_real8 val8;
02009 union {
02010 _f_int8 n;
02011 _f_real8 f;
02012 } uval64;
02013 if (!_TYP_CONV) {
02014 errn = FENLIVIT;
02015 break;
02016 }
02017 uval64.n = *(_f_int8 *)slval;
02018 val8 = uval64.f;
02019 *(_f_int8 *)slval =
02020 (_f_int8) val8;
02021 break;
02022 }
02023 #if _F_REAL16 == 1
02024 case EX_REAL128:
02025 {
02026 _f_real16 val16;
02027 _f_int8 *int8ptr;
02028 union {
02029 _f_int8 n[2];
02030 _f_real16 f;
02031 } uval128;
02032 if (!_TYP_CONV) {
02033 errn = FENLIVIT;
02034 break;
02035 }
02036 int8ptr = (_f_int8 *)slval;
02037 uval128.n[0] = int8ptr[0];
02038 uval128.n[1] = int8ptr[1];
02039 val16 = uval128.f;
02040 *(_f_int8 *)slval = (_f_int8) val16;
02041 break;
02042 }
02043 #endif
02044 default:
02045 errn = FENLUNKI;
02046 }
02047 }
02048
02049 } else
02050 errn = FENLUNKI;
02051 break;
02052 }
02053 }
02054 cup->ulineptr = field_begin + field_width;
02055 cup->ulinecnt -= cup->ulineptr - field_begin;
02056 return(errn);
02057 }
02058
02059
02060
02061
02062
02063
02064
02065
02066
02067
02068 static int
02069 _g_charstr(
02070 FIOSPTR css,
02071 unit *cup,
02072 void *p,
02073 int cnt,
02074 char c,
02075 struct Echoinfo *echoptr,
02076 int lcount,
02077 int elsize,
02078 int *nullvlu)
02079 {
02080 int eos;
02081 int i, ch;
02082 unsigned int len77;
02083 char *cp;
02084 long stat;
02085 char enddelim;
02086 char c1;
02087 int repcount;
02088 char *cpold;
02089 int ss;
02090 int errn = 0;
02091 long *optr;
02092 int ocnt;
02093 void *fchp;
02094 *nullvlu = 0;
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125
02126
02127
02128
02129
02130
02131
02132 eos = 0;
02133 fchp = p;
02134 len77 = elsize;
02135
02136 if (len77 != 0) {
02137 cp = fchp;
02138 repcount = MIN(lcount,cnt);
02139
02140
02141
02142
02143 if ((c == '\'') || (c == '"')) {
02144 enddelim = c;
02145
02146 for (i = 0; i < len77 && eos == 0; i++) {
02147 GETSTR77();
02148 if (eos == 0)
02149 *cp++ = ch;
02150 }
02151 if (eos == -1)
02152 i--;
02153 i = len77 - i;
02154 if ( i > 0 )
02155 (void) memset(cp, BLANK, i);
02156 cp = cp + i;
02157 while (eos != -1) {
02158
02159
02160
02161
02162 GETSTR77();
02163 }
02164 while (--repcount) {
02165
02166
02167
02168
02169
02170 cpold = fchp;
02171 (void) memcpy(cp, cpold, len77);
02172 cp = cp + len77;
02173 }
02174 }
02175 else {
02176
02177
02178
02179
02180
02181
02182
02183
02184 if (lcount > 1) {
02185 return(FENLNOVL);
02186 }
02187
02188
02189
02190
02191 ocnt = cup->ulinecnt;
02192 optr = cup->ulineptr;
02193 c1 = *optr++;
02194 ocnt--;
02195
02196 while (!(ISBLANK(c1))) {
02197
02198
02199
02200 if (MATCH(c1, _MASKS, MRNLSEP) ||
02201 MATCH(c1, _MASKS, MRNLDELIM))
02202 break;
02203 if (MATCH(c1, _MASKS, MRNLREP) ||
02204 c1 == '(') {
02205
02206
02207
02208 cup->ulineptr--;
02209 cup->ulinecnt++;
02210 *nullvlu = 2;
02211 return(0);
02212 }
02213 c1 = *optr++;
02214 ocnt--;
02215 }
02216 while ((ISBLANK(c1)) && ocnt-- > 0)
02217 c1 = *optr++;
02218 if (MATCH(c1, _MASKS, MRNLREP) || c1 == '(') {
02219
02220
02221
02222
02223 cup->ulineptr--;
02224 cup->ulinecnt++;
02225 *nullvlu = 2;
02226 return(0);
02227 }
02228 i = 0;
02229 c1 = c;
02230 while (!(ISBLANK(c1))) {
02231 if (i < len77) {
02232 *cp++ = c1;
02233 i++;
02234 }
02235 SUBGTC(c1);
02236 if (MATCH(c1, _MASKS, MRNLSEP) ||
02237 MATCH(c1, _MASKS, MRNLCOMM)) {
02238
02239 cup->ulineptr--;
02240 cup->ulinecnt++;
02241 break;
02242 }
02243 }
02244
02245 i = len77 - i;
02246 (void) memset(cp, BLANK, i);
02247 cp = cp + i;
02248 }
02249 }
02250 else {
02251
02252 return(FENLIOER);
02253 }
02254 return(errn);
02255 }
02256
02257
02258
02259
02260
02261
02262
02263
02264 static int
02265 _get_holl(
02266 FIOSPTR css,
02267 unit *cup,
02268 char holltype,
02269 int count,
02270 ftype_t type,
02271 struct Echoinfo *echoptr,
02272 long *lval,
02273 int elsize)
02274 {
02275 int i;
02276 char *holbufptr;
02277 char c;
02278 long stat;
02279 int ss;
02280 int errn = 0;
02281 int fill;
02282
02283
02284
02285
02286
02287
02288
02289
02290
02291
02292
02293
02294
02295
02296
02297
02298
02299 if (type == DVTYPE_COMPLEX || type == DVTYPE_ASCII ||
02300 ((type == DVTYPE_REAL) && elsize == sizeof(_f_real16))) {
02301 return(FENLUNKI);
02302 }
02303 if (count > elsize) {
02304 return(FENLIOER);
02305 }
02306 fill = BLANK;
02307 holbufptr = (char *)lval;
02308 if (holltype == 'R' || holltype == 'r') {
02309
02310 fill = NULLC;
02311 holbufptr = holbufptr + (elsize - count);
02312 }
02313 else
02314 if (holltype == 'L' || holltype == 'l')
02315 fill = NULLC;
02316
02317
02318
02319 for (i = 0; i < count && (cup->ulinecnt > 1) ; i++) {
02320 SUBGTC(c);
02321
02322 *holbufptr++ = c;
02323 }
02324 if (i == count) {
02325
02326 if (holltype == 'R' || holltype == 'r')
02327 holbufptr = (char *)lval;
02328 (void) memset(holbufptr, fill, elsize - count);
02329 }
02330 else {
02331
02332
02333
02334
02335 return(FENLIOER);
02336 }
02337 return(errn);
02338 }
02339
02340
02341
02342
02343
02344
02345
02346
02347
02348
02349 static int
02350 _get_quoholl(
02351 FIOSPTR css,
02352 unit *cup,
02353 char cdelim,
02354 ftype_t type,
02355 struct Echoinfo *echoptr,
02356 long *lval,
02357 int elsize)
02358 {
02359 int numchar;
02360 int j;
02361 int fill;
02362 long holbuf;
02363
02364 char *holbufptr;
02365 char c;
02366 long stat;
02367 char *lvalcharptr;
02368 int ss;
02369 int errn = 0;
02370
02371
02372
02373
02374
02375
02376
02377
02378
02379
02380
02381
02382
02383 if (type == DVTYPE_COMPLEX || type == DVTYPE_ASCII ||
02384 (type == DVTYPE_REAL && elsize == sizeof(_f_real16))) {
02385 return(FENLUNKI);
02386 }
02387 lvalcharptr = (char *)lval;
02388 holbufptr = (char *) &holbuf;
02389
02390 numchar = 0;
02391 for (;;) {
02392 SUBGTC(c);
02393 if (c == cdelim) {
02394
02395 SUBGTC(c);
02396 if (c != cdelim)
02397 break;
02398
02399
02400
02401
02402 }
02403 if (++numchar > elsize) {
02404 return(FENLIOER);
02405 }
02406 *holbufptr++ = c;
02407
02408
02409
02410
02411 if (cup->ulinecnt <= 1) {
02412 return(FENLIOER);
02413 }
02414 }
02415 if (c == 'L' || c == 'l')
02416 fill = NULLC;
02417 else if (c == 'R' || c == 'r') {
02418
02419 holbufptr = holbufptr - 1;
02420 lvalcharptr = lvalcharptr + (elsize - 1);
02421 j = elsize - numchar;
02422 while (numchar-- > 0)
02423 *lvalcharptr-- = *holbufptr--;
02424
02425
02426 while (j-- > 0)
02427 *lvalcharptr-- = '\0';
02428 return(0);
02429 }
02430 else {
02431
02432 fill = BLANK;
02433 if (c != 'H' && c != 'h') {
02434
02435
02436 cup->ulineptr--;
02437 cup->ulinecnt++;
02438 }
02439 }
02440
02441 (void) memset(holbufptr, fill, elsize - numchar);
02442 *lval = holbuf;
02443 return(errn);
02444 }
02445
02446
02447
02448
02449
02450
02451
02452
02453
02454
02455
02456
02457
02458
02459
02460
02461
02462 static int
02463 _gocthex(
02464 FIOSPTR css,
02465 unit *cup,
02466 ftype_t type,
02467 struct Echoinfo *echoptr,
02468 long *lval,
02469 int base,
02470 int elsize,
02471 int *nullvlu)
02472 {
02473 char c;
02474 long stat;
02475 char strbuf[2];
02476 int ss;
02477 int errn = 0;
02478 int octshift = OCTSHFT;
02479 int hexshift = HEXSHFT;
02480
02481 #if defined(_F_REAL4) && defined(_F_INT4)
02482 if (elsize <= 4) {
02483 octshift = OCTSHFT4;
02484 hexshift = HEXSHFT4;
02485 }
02486 #endif
02487 *nullvlu = 0;
02488 if (*cup->ulineptr != '\'') {
02489
02490 cup->ulineptr--;
02491 cup->ulinecnt++;
02492 *nullvlu = 2;
02493 return(0);
02494 }
02495
02496 if (type == DVTYPE_COMPLEX || (type == DVTYPE_REAL &&
02497 elsize == sizeof(_f_real16))) {
02498 return(FENLUNKI);
02499 }
02500 SUBGTC(c);
02501 SUBGTC(c);
02502 *lval = 0;
02503 strbuf[1] = '\0';
02504 while (!(ISBLANK(c)) && c != '\'') {
02505 if (base == OCTAL) {
02506 if ((!isdigit((int) c)) || (c == '9') ||
02507 (*lval >> octshift)) {
02508 return(FENICVIC);
02509 }
02510 *lval = (*lval * (sizeof(_f_int))) + c - '0';
02511 }
02512 else {
02513 if ((!isxdigit(c)) || (*lval >> hexshift)) {
02514 return(FENICVIC);
02515 }
02516 strbuf[0] = c;
02517 *lval = (*lval * 16) +
02518 (int) strtol(strbuf, (char **)NULL, 16);
02519 }
02520 CMTSUBGT(c);
02521 if (MATCH(c, _MASKS, MRNLSEP)) {
02522 cup->ulineptr--;
02523 cup->ulinecnt++;
02524 break;
02525 }
02526 }
02527 return(errn);
02528 }