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/lread.c 92.3 06/18/99 15:49:57"
00043
00044 #include <limits.h>
00045 #include <ctype.h>
00046 #ifndef _ABSOFT
00047 #include <malloc.h>
00048 #else
00049 #include <stdlib.h>
00050 #endif
00051 #include <string.h>
00052 #include <fortran.h>
00053 #include <cray/fmtconv.h>
00054 #include <cray/nassert.h>
00055 #ifdef _CRAYT3D
00056 #include <cray/mppsdd.h>
00057 #define MAXSH 512
00058 #else
00059 #define MAXSH 1
00060 #endif
00061 #include "fio.h"
00062 #include "lio.h"
00063 #include "f90io.h"
00064
00065
00066
00067
00068
00069 #if defined(_CRAYMPP) || (defined(_ABSOFT) && defined(_LD64))
00070 #if defined _F_REAL16 && _F_REAL16 == (-1)
00071 #define FAKE_REAL16
00072 #endif
00073 #endif
00074
00075
00076
00077 extern int
00078 _nicverr(const int _Nicverror);
00079
00080 extern void
00081 _set_stride(void *dest, void *src, long count, int elsize, long inc);
00082
00083
00084
00085
00086
00087 extern
00088 #ifndef KEY
00089 const
00090 #endif
00091 ic_func *_ilditab[DVTYPE_NTYPES];
00092
00093
00094
00095
00096
00097
00098 #if !defined(_F_REAL16) || defined(FAKE_REAL16)
00099 typedef _f_real8 _gen_real;
00100 #else
00101 typedef _f_real16 _gen_real;
00102 #endif
00103
00104
00105
00106
00107
00108 struct repdata {
00109
00110 long repcnt;
00111
00112 enum reptypes {
00113
00114 REPNONE = 0,
00115 REPLINE,
00116
00117 REPCHAR,
00118 REPCPLX,
00119 REPNULL
00120
00121 } reptype;
00122
00123 union {
00124
00125 struct {
00126 long *lptr;
00127 int lcnt;
00128 } line;
00129
00130 struct {
00131 char *repchr;
00132
00133
00134
00135 long repsize;
00136
00137 } rchr;
00138
00139 struct {
00140 _gen_real r[2];
00141 } cplx;
00142 } u;
00143 };
00144
00145
00146
00147
00148 void
00149 _cmplx_convert(void *dest, int size, _gen_real src[2]);
00150
00151 long
00152 _get_repcount(long *ptr, int limit, long *width);
00153
00154 int
00155 _get_value( long *lptr, int lcnt, void *ptr, ftype_t type, int elsize,
00156 long *width);
00157
00158 int
00159 _mr_scan_char(FIOSPTR css, unit *cup, char *ptr, int elsize,
00160 char **chptr, long *slen);
00161
00162 int
00163 _mr_scan_complex(FIOSPTR css, unit *cup, void *cpxptr, int elsize,
00164 short is_mult);
00165
00166 int
00167 _s_scan_extensions(void *ptr, ftype_t type, int elsize, long *begin,
00168 int left, long *size, long cmode);
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 #ifdef FAKE_REAL16
00179 #define GENREALTO8(x) (*x)
00180
00181 #elif !defined(_UNICOS)
00182 #define GENREALTO8(x) ((_f_real8)(*x))
00183
00184 #else
00185 #define SNGLR _SNGLR_
00186
00187 #endif
00188
00189 #ifdef SNGLR
00190 #define GENREALTO8 SNGLR
00191 extern _f_real SNGLR(_f_real16 *);
00192 #endif
00193
00194
00195
00196
00197
00198 #ifdef _F_REAL4
00199 #define GENREALTO4(x) ((_f_real4)(*x))
00200 #endif
00201
00202
00203
00204
00205
00206
00207 #define ADVANCE_INPUT(css, cup, lptr, lcnt) \
00208 for (;;) { \
00209 while (lcnt == 0) { \
00210 errn = css->u.fmt.endrec(css, cup, 1); \
00211 if (errn != 0) { \
00212 if (errn > 0) RERROR(errn); \
00213 if (errn < 0) REND(errn); \
00214 } \
00215 lptr = cup->ulineptr; \
00216 lcnt = cup->ulinecnt; \
00217 } \
00218 if (! IS_WHITESPACE(*lptr)) \
00219 break; \
00220 lptr = lptr + 1; \
00221 lcnt = lcnt - 1; \
00222 }
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 int
00236 _ld_read(
00237 FIOSPTR css,
00238 unit *cup,
00239 void *dptr,
00240 type_packet *tip,
00241 int _Unused)
00242 {
00243 register short reptype;
00244 register ftype_t type;
00245 register int elsize;
00246 register int errn;
00247 register int lcnt;
00248 register long count;
00249 register long repcnt;
00250 register long stride;
00251 register long vinc;
00252 long *lptr;
00253 char *cptr;
00254 struct repdata *rptr;
00255 #ifdef _CRAYT3D
00256 register short shared;
00257 register int elwords;
00258 register int offset;
00259 register int tcount;
00260 long shrd[MAXSH];
00261 #endif
00262
00263
00264
00265 assert ( css != NULL );
00266 assert ( cup != NULL );
00267 assert ( dptr != NULL );
00268 assert ( tip != NULL );
00269
00270 cptr = (char *) dptr;
00271 errn = 0;
00272
00273 lcnt = cup->ulinecnt;
00274 lptr = cup->ulineptr;
00275
00276 type = tip->type90;
00277 count = tip->count;
00278 elsize = tip->elsize;
00279 vinc = tip->stride;
00280
00281
00282
00283
00284
00285
00286
00287 rptr = cup->urepdata;
00288
00289 if (css->u.fmt.lcomma == 0 && rptr != NULL)
00290 rptr->repcnt = 0;
00291
00292 if (rptr != NULL && rptr->repcnt != 0) {
00293
00294
00295
00296
00297
00298
00299 reptype = rptr->reptype;
00300 repcnt = rptr->repcnt;
00301
00302 assert ( reptype == REPNONE || reptype == REPLINE ||
00303 reptype == REPCHAR || reptype == REPCPLX ||
00304 reptype == REPNULL );
00305 assert ( repcnt > 0 );
00306 }
00307 else {
00308 reptype = REPNONE;
00309 repcnt = 1;
00310 }
00311
00312 #ifdef _CRAYT3D
00313 if (_issddptr(dptr)) {
00314 offset = 0;
00315 elwords = elsize / sizeof(long);
00316 tcount = count;
00317 vinc = 1;
00318 shared = 1;
00319 css->f_shrdput = 1;
00320 }
00321 else
00322 shared = 0;
00323
00324 do {
00325 if (shared) {
00326
00327
00328 count = MIN(MAXSH / elwords, (tcount - offset));
00329 cptr = (char *) shrd;
00330 }
00331 #endif
00332
00333 stride = elsize * vinc;
00334
00335
00336
00337
00338
00339 while (count > 0) {
00340 register short is_mult;
00341 register short is_null;
00342 register long nitems;
00343 long width;
00344
00345 if (css->u.fmt.slash)
00346 break;
00347
00348 is_null = 0;
00349 is_mult = 1;
00350
00351
00352
00353
00354
00355
00356
00357 if (reptype == REPNONE) {
00358
00359
00360
00361
00362
00363
00364 advance:
00365 ADVANCE_INPUT(css, cup, lptr, lcnt);
00366
00367
00368
00369
00370
00371
00372 if (*lptr == COMMA && css->u.fmt.lcomma == 1) {
00373 css->u.fmt.lcomma = 0;
00374 lptr = lptr + 1;
00375 lcnt = lcnt - 1;
00376 goto advance;
00377 }
00378
00379 css->u.fmt.lcomma = 1;
00380 repcnt = 1;
00381
00382 if (*lptr == SLASH) {
00383 css->u.fmt.slash = 1;
00384 goto done;
00385 }
00386
00387
00388
00389 if (IS_DIGIT(*lptr)) {
00390
00391 repcnt = _get_repcount(lptr, lcnt, &width);
00392
00393 lcnt = lcnt - width;
00394 lptr = lptr + width;
00395 }
00396 }
00397 else if (reptype == REPLINE) {
00398
00399
00400
00401
00402
00403
00404 lptr = rptr->u.line.lptr;
00405 lcnt = rptr->u.line.lcnt;
00406
00407
00408
00409 is_mult = 0;
00410 }
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420 if (reptype == REPNONE || reptype == REPLINE) {
00421
00422
00423
00424 if (lcnt == 0 || IS_SEPARATOR(*lptr))
00425 is_null = 1;
00426
00427 if (repcnt <= count || reptype == REPLINE) {
00428
00429
00430
00431
00432
00433
00434 if (is_null)
00435 errn = 0;
00436 else switch (type) {
00437
00438 default:
00439 errn = _get_value(
00440 lptr,
00441 lcnt,
00442 cptr,
00443 type,
00444 elsize,
00445 &width);
00446
00447 lcnt = lcnt - width;
00448 lptr = lptr + width;
00449 break;
00450
00451 case DVTYPE_COMPLEX:
00452 cup->ulinecnt = lcnt;
00453 cup->ulineptr = lptr;
00454
00455 errn = _mr_scan_complex(
00456 css,
00457 cup,
00458 cptr,
00459 elsize,
00460 is_mult);
00461
00462 lcnt = cup->ulinecnt;
00463 lptr = cup->ulineptr;
00464 break;
00465
00466 case DVTYPE_ASCII:
00467 cup->ulinecnt = lcnt;
00468 cup->ulineptr = lptr;
00469
00470 errn = _mr_scan_char(
00471 css,
00472 cup,
00473 cptr,
00474 elsize,
00475 NULL,
00476 NULL);
00477
00478 lcnt = cup->ulinecnt;
00479 lptr = cup->ulineptr;
00480 break;
00481
00482 }
00483
00484 if (errn != 0)
00485 goto done;
00486 }
00487
00488
00489
00490
00491
00492
00493
00494
00495 else {
00496 if (rptr == NULL) {
00497
00498 rptr = (struct repdata *)
00499 malloc(sizeof(struct repdata));
00500
00501 if (rptr == NULL) {
00502 errn = FENOMEMY;
00503 goto done;
00504 }
00505
00506 cup->urepdata = rptr;
00507 }
00508
00509 if (is_null) {
00510 errn = 0;
00511 reptype = REPNULL;
00512 }
00513 else switch (type) {
00514
00515 default:
00516 errn = _get_value(
00517 lptr,
00518 lcnt,
00519 cptr,
00520 type,
00521 elsize,
00522 &width);
00523
00524 reptype = REPLINE;
00525 rptr->u.line.lcnt = lcnt;
00526 rptr->u.line.lptr = lptr;
00527 lcnt = lcnt - width;
00528 lptr = lptr + width;
00529 break;
00530
00531 case DVTYPE_COMPLEX:
00532 reptype = REPCPLX;
00533 cup->ulinecnt = lcnt;
00534 cup->ulineptr = lptr;
00535
00536 errn = _mr_scan_complex(
00537 css,
00538 cup,
00539 &rptr->u.cplx,
00540 sizeof(rptr->u.cplx),
00541 is_mult);
00542
00543 lcnt = cup->ulinecnt;
00544 lptr = cup->ulineptr;
00545
00546 _cmplx_convert(
00547 cptr,
00548 elsize,
00549 rptr->u.cplx.r);
00550 break;
00551
00552 case DVTYPE_ASCII:
00553 rptr->u.rchr.repchr = NULL;
00554 cup->ulinecnt = lcnt;
00555 cup->ulineptr = lptr;
00556
00557 errn = _mr_scan_char(
00558 css,
00559 cup,
00560 cptr,
00561 elsize,
00562 &rptr->u.rchr.repchr,
00563 &rptr->u.rchr.repsize);
00564
00565 if (rptr->u.rchr.repchr != NULL)
00566 reptype = REPCHAR;
00567 else {
00568 reptype = REPLINE;
00569 rptr->u.line.lptr = lptr;
00570 rptr->u.line.lcnt = lcnt;
00571 }
00572
00573 lcnt = cup->ulinecnt;
00574 lptr = cup->ulineptr;
00575 break;
00576
00577 }
00578
00579 if (errn != 0)
00580 goto done;
00581 }
00582 }
00583
00584
00585
00586
00587
00588
00589 else {
00590 if (reptype == REPNULL) {
00591 errn = 0;
00592 is_null = 1;
00593 }
00594 else switch (type) {
00595
00596 case DVTYPE_COMPLEX:
00597
00598 if (reptype != REPCPLX)
00599 errn = FELDNOCX;
00600 else
00601 _cmplx_convert(
00602 cptr,
00603 elsize,
00604 rptr->u.cplx.r);
00605 break;
00606
00607 case DVTYPE_ASCII:
00608 if (reptype != REPCHAR)
00609 errn = FELDUNKI;
00610 else {
00611 register int xfersz;
00612
00613 xfersz = MIN(elsize,
00614 rptr->u.rchr.repsize);
00615
00616 if (xfersz > 0)
00617 (void) memcpy(
00618 cptr,
00619 rptr->u.rchr.repchr,
00620 xfersz);
00621
00622 if (xfersz < elsize)
00623 (void) memset(
00624 cptr + xfersz,
00625 BLANK,
00626 elsize - xfersz);
00627 }
00628 break;
00629
00630 default:
00631 errn = FELDUNKI;
00632 break;
00633
00634 }
00635
00636 if (errn != 0)
00637 goto done;
00638 }
00639
00640
00641
00642
00643
00644
00645
00646 nitems = MIN(repcnt, count);
00647
00648 if (nitems > 1 && is_null == 0)
00649 _set_stride(cptr + stride, cptr, nitems - 1,
00650 elsize, stride);
00651
00652 cptr = cptr + (nitems * stride);
00653 count = count - nitems;
00654 repcnt = repcnt - nitems;
00655
00656 if (repcnt == 0) {
00657
00658 if (reptype == REPCHAR)
00659 free(rptr->u.rchr.repchr);
00660
00661 reptype = REPNONE;
00662 }
00663 }
00664
00665 done:
00666 #ifdef _CRAYT3D
00667 if (shared && (long *)cptr != shrd) {
00668 register int items;
00669
00670
00671
00672 items = ((long *) cptr - shrd) / elwords;
00673
00674 _cpytosdd(dptr, shrd, items, elwords, tip->stride, offset);
00675
00676 offset = offset + items;
00677 }
00678
00679 if (css->u.fmt.slash)
00680 break;
00681
00682 } while (errn == 0 && shared && offset < tcount);
00683 #endif
00684
00685
00686
00687
00688
00689 cup->ulinecnt = lcnt;
00690 cup->ulineptr = lptr;
00691
00692 if (rptr != NULL) {
00693
00694 if (repcnt == 0) {
00695
00696 if (reptype == REPCHAR)
00697 free(rptr->u.rchr.repchr);
00698
00699 reptype = REPNONE;
00700 }
00701
00702 rptr->repcnt = repcnt;
00703 rptr->reptype = (enum reptypes) reptype;
00704 }
00705
00706 if (errn > 0)
00707 RERROR(errn);
00708
00709 return(errn);
00710 }
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721 long
00722 _get_repcount(
00723 long *ptr,
00724 int limit,
00725 long *width)
00726 {
00727 register int nchars;
00728 register long chr;
00729 register long count;
00730
00731 chr = *ptr++;
00732 count = 0;
00733 nchars = 0;
00734
00735 while (limit > 1 && IS_DIGIT(chr)) {
00736 count = (count + count + (count << 3)) + (chr - ZERO);
00737 chr = *ptr++;
00738 nchars = nchars + 1;
00739 limit = limit - 1;
00740 }
00741
00742
00743
00744
00745
00746
00747 if (chr != STAR || count == 0) {
00748 count = 1;
00749 nchars = 0;
00750 }
00751 else
00752 nchars = nchars + 1;
00753
00754 *width = nchars;
00755
00756 return(count);
00757 }
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767 int
00768 _get_value(
00769 long *lptr,
00770 int lcnt,
00771 void *ptr,
00772 ftype_t type,
00773 int elsize,
00774 long *size)
00775 {
00776 register int errn;
00777 register int nc;
00778 long dummy;
00779 long cmode;
00780 long zero = 0;
00781 long width;
00782 long *begin;
00783 long *end;
00784 #ifndef KEY
00785 const
00786 #endif
00787 ic_func *ngcf;
00788
00789 begin = lptr;
00790 ngcf = _ilditab[type];
00791 *size = 0;
00792 nc = 0;
00793 cmode = 0;
00794
00795
00796
00797 while ( nc < lcnt && !IS_DELIMITER(*lptr) ) {
00798 lptr = lptr + 1;
00799 nc = nc + 1;
00800 }
00801
00802 end = lptr;
00803 width = nc;
00804
00805
00806
00807 switch (type) {
00808
00809 case DVTYPE_REAL:
00810
00811 switch (elsize) {
00812
00813 #ifdef _F_REAL4
00814 case 4:
00815 cmode = MODEHP;
00816 break;
00817 #endif
00818 case 8:
00819 break;
00820
00821 case 16:
00822 cmode = MODEDP;
00823 break;
00824
00825 default:
00826 return(FEKNTSUP);
00827 }
00828 break;
00829
00830 case DVTYPE_INTEGER:
00831 case DVTYPE_LOGICAL:
00832
00833 switch (elsize) {
00834
00835 #if (defined(_F_INT2) || defined(_F_LOG2)) && (defined(__mips) || \
00836 defined(_LITTLE_ENDIAN))
00837 case 1:
00838 cmode = MODEBP;
00839 break;
00840 case 2:
00841 cmode = MODEWP;
00842 break;
00843 #endif
00844 #if defined(_F_INT4) || defined(_F_LOG4)
00845 case 4:
00846 cmode = MODEHP;
00847 break;
00848 #endif
00849 case 8:
00850 break;
00851
00852 default:
00853 return(FEKNTSUP);
00854 }
00855 break;
00856
00857 default:
00858 return(FEKNTSUP);
00859 }
00860
00861
00862
00863 errn = ngcf( begin, &width, &end, &cmode, ptr, &dummy,
00864 &zero, &zero);
00865
00866 if (errn < 0)
00867 errn = _nicverr(errn);
00868 else
00869 errn = 0;
00870
00871
00872
00873
00874
00875
00876
00877 if (errn == FENICVIC || errn == FERDIVLG) {
00878 register int errn2;
00879
00880 errn2 = _s_scan_extensions(
00881 ptr,
00882 type,
00883 elsize,
00884 begin,
00885 lcnt,
00886 size,
00887 cmode);
00888
00889 if (errn2 >= 0)
00890 errn = errn2;
00891 }
00892 else
00893 *size = end - begin;
00894
00895 return(errn);
00896 }
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932 int
00933 _s_scan_extensions(
00934 void *ptr,
00935 ftype_t type,
00936 int elsize,
00937 long *begin,
00938 int left,
00939 long *size,
00940 long cmode)
00941 {
00942 register short nchars;
00943 register int errn;
00944 register int i;
00945 register int lcnt;
00946 register long delim;
00947 long dummy;
00948 long fw;
00949 long zero = 0;
00950 register char first;
00951 register char ht;
00952 _f_int8 intvalue;
00953 char cbuf[sizeof(_f_int8)];
00954 long *endptr;
00955 long *lptr;
00956 void *vptr;
00957 ic_func *ncf;
00958
00959 *size = 0;
00960 errn = 0;
00961 lptr = begin;
00962 lcnt = left;
00963 first = (char) *lptr;
00964
00965 switch (first) {
00966
00967 case 'b':
00968 case 'B':
00969 if (first == 'b' || first == 'B')
00970 return (FELDUNKI);
00971 break;
00972
00973 case 'o':
00974 case 'O':
00975 case 'z':
00976 case 'Z':
00977
00978 if (lcnt < 3 || lptr[1] != SQUOTE)
00979 return(-1);
00980
00981 lptr = lptr + 2;
00982 lcnt = lcnt - 2;
00983
00984 for (i = 0; i < lcnt; i++) {
00985 if (IS_DELIMITER(lptr[i]))
00986 break;
00987 }
00988
00989 if (lptr[i - 1] == SQUOTE)
00990 i = i - 1;
00991
00992 if (i <= 0)
00993 return (-1);
00994
00995 if (first == 'b' || first == 'B')
00996 return (FELDUNKI);
00997
00998 if (first == 'o' || first == 'O')
00999 ncf = _ou2s;
01000 else
01001 ncf = _zu2s;
01002
01003 endptr = lptr + i;
01004 fw = i;
01005
01006 errn = ncf(lptr, &fw, &endptr, &cmode, ptr, &dummy,
01007 &zero, &zero);
01008
01009 if (errn < 0) {
01010 register int estat;
01011 estat = _nicverr(errn);
01012 if (estat > 0)
01013 return(estat);
01014 }
01015
01016 lptr = lptr + fw;
01017 lcnt = lcnt - fw;
01018
01019 if (lcnt > 0 && *lptr == SQUOTE) {
01020 lptr = lptr + 1;
01021 lcnt = lcnt - 1;
01022 }
01023
01024 break;
01025
01026 case '\'':
01027 case '"':
01028 delim = (long) first;
01029 nchars = 0;
01030
01031 for (;;) {
01032 lptr = lptr + 1;
01033 lcnt = lcnt - 1;
01034
01035 if (lcnt == 0)
01036 return(-1);
01037
01038 if (*lptr == delim) {
01039 lptr = lptr + 1;
01040 lcnt = lcnt - 1;
01041
01042 if (lcnt == 0 || *lptr != delim)
01043 break;
01044 }
01045
01046 if ((nchars >= sizeof(_f_int8)) ||
01047 (nchars >= elsize))
01048 return(FELDSTRL);
01049
01050 cbuf[nchars] = (char) *lptr;
01051 nchars = nchars + 1;
01052 }
01053
01054 if (lcnt == 0)
01055 ht = 'h';
01056 else if (IS_SEPARATOR(*lptr))
01057 ht = 'h';
01058 else {
01059 switch (*lptr) {
01060 case 'h':
01061 case 'H':
01062 ht = 'h';
01063 break;
01064
01065 case 'l':
01066 case 'L':
01067 ht = 'l';
01068 break;
01069
01070 case 'r':
01071 case 'R':
01072 ht = 'r';
01073 break;
01074
01075 default:
01076 return(FELDUNKI);
01077 }
01078
01079 lptr = lptr + 1;
01080 }
01081
01082
01083
01084 switch (elsize) {
01085 #ifdef _F_REAL4
01086 case 4:
01087 *(_f_int4 *)ptr = 0;
01088 break;
01089 #endif
01090 case 8:
01091 *(_f_int8 *)ptr = 0;
01092 break;
01093 #if (defined(_F_INT2) || defined(_F_LOG2)) && (defined(__mips) || \
01094 defined(_LITTLE_ENDIAN))
01095 case 2:
01096 *(_f_int2 *)ptr = 0;
01097 break;
01098 case 1:
01099 *((char *)ptr) = '\0';
01100 break;
01101 #endif
01102 }
01103
01104 if (nchars > 0) {
01105
01106 if (ht == 'r'){
01107 memcpy((char *)ptr+elsize-nchars, cbuf, nchars);
01108 }
01109 else
01110 (void) memcpy(ptr, cbuf, nchars);
01111 }
01112
01113 if (ht == 'h' && nchars != sizeof(long)) {
01114 register int pad;
01115
01116 pad = elsize - nchars;
01117
01118 (void) memset((char *)ptr + nchars, BLANK, pad);
01119 }
01120
01121 break;
01122
01123 default:
01124 for (i = 0; i < lcnt; i++) {
01125 if (IS_DELIMITER(lptr[i]))
01126 break;
01127 }
01128
01129 i = i - 1;
01130
01131 if (i == 0)
01132 return (-1);
01133
01134 if (lptr[i] != 'B' && lptr[i] != 'b')
01135 return (-1);
01136
01137 vptr = &intvalue;
01138 endptr = lptr + i;
01139 fw = i;
01140
01141 errn = _ou2s(lptr, &fw, &endptr, &cmode, vptr, &dummy,
01142 &zero, &zero);
01143
01144 if (errn < 0) {
01145 register int estat;
01146 estat = _nicverr(errn);
01147 if (estat > 0)
01148 return(estat);
01149 }
01150
01151
01152
01153
01154
01155
01156 if (type == DVTYPE_REAL) {
01157 switch (elsize) {
01158 #ifdef _F_REAL4
01159 case 4:
01160 *(_f_real4 *)ptr = (_f_real4)intvalue;
01161 break;
01162 #endif
01163 case 8:
01164 *(_f_real8 *)ptr = (_f_real8)intvalue;
01165 break;
01166
01167 #if defined(_F_REAL16) && !defined(FAKE_REAL16)
01168 case 16:
01169 *(_f_real16 *)ptr = (_f_real16)intvalue;
01170 break;
01171 #endif
01172 default:
01173 return (FEKNTSUP);
01174 }
01175 }
01176 else {
01177 switch (elsize) {
01178 #if (defined(_F_INT2) || defined(_F_LOG2)) && (defined(__mips) || \
01179 defined(_LITTLE_ENDIAN))
01180 case 2:
01181 *(_f_int2 *)ptr = (_f_int2)intvalue;
01182 break;
01183 case 1:
01184 *(_f_int1 *)ptr = (_f_int1)intvalue;
01185 break;
01186 #endif
01187 #ifdef _F_INT4
01188 case 4:
01189 *(_f_int4 *)ptr = (_f_int4)intvalue;
01190 break;
01191 #endif
01192
01193 #ifdef _F_INT8
01194 case 8:
01195 *(_f_int8 *)ptr = intvalue;
01196 break;
01197 #endif
01198 default:
01199 return (FEKNTSUP);
01200 }
01201 }
01202
01203 lptr = lptr + fw + 1;
01204
01205 }
01206
01207 *size = lptr - begin;
01208
01209 return(0);
01210 }
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225 int
01226 _mr_scan_complex(
01227 FIOSPTR css,
01228 unit *cup,
01229 void *cpxptr,
01230 int elsize,
01231 short is_mult)
01232 {
01233 register int errn;
01234 register int lcnt;
01235 long fw;
01236 long *lptr;
01237
01238 lcnt = cup->ulinecnt;
01239 lptr = cup->ulineptr;
01240
01241 if (*lptr != LPAREN) {
01242 errn = FELDNOCX;
01243 goto done;
01244 }
01245
01246 lptr = lptr + 1;
01247 lcnt = lcnt - 1;
01248
01249
01250
01251 while (lcnt > 0 && IS_WHITESPACE(*lptr)) {
01252 lptr = lptr + 1;
01253 lcnt = lcnt - 1;
01254 }
01255
01256 if (lcnt == 0) {
01257 errn = FELDNOCX;
01258 goto done;
01259 }
01260
01261 elsize = elsize >> 1;
01262
01263 errn = _get_value(lptr, lcnt, cpxptr, DVTYPE_REAL, elsize, &fw);
01264
01265 if (errn != 0)
01266 goto done;
01267
01268 lptr = lptr + fw;
01269 lcnt = lcnt - fw;
01270
01271
01272
01273 while (lcnt > 0 && IS_WHITESPACE(*lptr)) {
01274 lptr = lptr + 1;
01275 lcnt = lcnt - 1;
01276 }
01277
01278 if (lcnt == 0) {
01279
01280 if (is_mult == 0) {
01281 errn = FELDNOCX;
01282 goto done;
01283 }
01284
01285 ADVANCE_INPUT(css, cup, lptr, lcnt);
01286 }
01287
01288 if (*lptr != COMMA) {
01289 errn = FELDNOCX;
01290 goto done;
01291 }
01292
01293 lptr = lptr + 1;
01294 lcnt = lcnt - 1;
01295
01296
01297
01298 while (lcnt > 0 && IS_WHITESPACE(*lptr)) {
01299 lptr = lptr + 1;
01300 lcnt = lcnt - 1;
01301 }
01302
01303 if (lcnt == 0) {
01304 ADVANCE_INPUT(css, cup, lptr, lcnt);
01305 }
01306
01307
01308
01309
01310 cpxptr = (char *) cpxptr + elsize;
01311
01312 errn = _get_value(lptr, lcnt, cpxptr, DVTYPE_REAL, elsize, &fw);
01313
01314 if (errn != 0)
01315 goto done;
01316
01317 lptr = lptr + fw;
01318 lcnt = lcnt - fw;
01319
01320
01321
01322 while (lcnt > 0 && *lptr != RPAREN) {
01323 lptr = lptr + 1;
01324 lcnt = lcnt - 1;
01325 }
01326
01327 if (lcnt == 0) {
01328 errn = FELDNOCX;
01329 goto done;
01330 }
01331
01332 cup->ulineptr = lptr + 1;
01333 cup->ulinecnt = lcnt - 1;
01334
01335 done:
01336 if (errn > 0)
01337 RERROR(errn);
01338
01339 return(0);
01340 }
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361
01362
01363
01364 int
01365 _mr_scan_char(
01366 FIOSPTR css,
01367 unit *cup,
01368 char *ptr,
01369 int elsize,
01370 char **chptr,
01371
01372
01373
01374
01375
01376
01377 long *slen)
01378 {
01379 register short span;
01380 register int errn;
01381 register int lcnt;
01382 register long chlen;
01383 register long delim;
01384 register long lsave;
01385 long *lptr;
01386 char *csave;
01387
01388 span = 0;
01389 chlen = 0;
01390 lsave = 0;
01391 csave = NULL;
01392 lptr = cup->ulineptr;
01393 lcnt = cup->ulinecnt;
01394 delim = *lptr;
01395
01396 if (IS_STRING_DELIMITER(delim)) {
01397
01398 for (;;) {
01399
01400 lptr = lptr + 1;
01401 lcnt = lcnt - 1;
01402
01403
01404
01405 while (lcnt == 0) {
01406 span = 1;
01407
01408 errn = css->u.fmt.endrec(css, cup, 1);
01409
01410 if (errn != 0)
01411 goto err_end_return;
01412
01413 lptr = cup->ulineptr;
01414 lcnt = cup->ulinecnt;
01415 }
01416
01417 if (*lptr == delim) {
01418
01419 if (lcnt > 1 && *(lptr + 1) == delim) {
01420 lptr = lptr + 1;
01421 lcnt = lcnt - 1;
01422 }
01423 else
01424 break;
01425 }
01426
01427 if (chlen < elsize)
01428 ptr[chlen] = (char) *lptr;
01429
01430 if (chptr != NULL) {
01431
01432 if (csave == NULL) {
01433 lsave = RECMAX;
01434 csave = (char *) malloc(lsave);
01435
01436 if (csave == NULL) {
01437 errn = FENOMEMY;
01438 goto err_end_return;
01439 }
01440 }
01441 else {
01442 if (chlen > lsave) {
01443 lsave = lsave + RECMAX;
01444 csave = (char *) realloc(csave, lsave);
01445
01446 if (csave == NULL) {
01447 errn = FENOMEMY;
01448 goto err_end_return;
01449 }
01450 }
01451 }
01452
01453 csave[chlen] = (char) *lptr;
01454 }
01455
01456 chlen = chlen + 1;
01457 }
01458
01459 lptr = lptr + 1;
01460 lcnt = lcnt - 1;
01461
01462 if (span == 0) {
01463 if (csave != NULL)
01464 free(csave);
01465 }
01466 else {
01467 if (chptr != NULL) {
01468 *chptr = csave;
01469 *slen = chlen;
01470 }
01471 }
01472 }
01473 else {
01474 while ( lcnt > 0 && !IS_SEPARATOR(*lptr) ) {
01475
01476 if (chlen < elsize)
01477 ptr[chlen] = (char) *lptr;
01478
01479 chlen = chlen + 1;
01480 lptr = lptr + 1;
01481 lcnt = lcnt - 1;
01482 }
01483 }
01484
01485
01486
01487 if (chlen < elsize)
01488 (void) memset(ptr + chlen, BLANK, elsize - chlen);
01489
01490 cup->ulineptr = lptr;
01491 cup->ulinecnt = lcnt;
01492
01493 return(0);
01494
01495 err_end_return:
01496 if (csave != NULL)
01497 free(csave);
01498
01499 if (errn < 0) {
01500 REND(errn);
01501 }
01502 else if (errn > 0) {
01503 RERROR(errn);
01504 }
01505 else
01506 _ferr(css, FEINTUNK);
01507
01508 return(0);
01509 }
01510
01511 _PRAGMA_INLINE(_cmplx_convert)
01512 void
01513 _cmplx_convert(
01514 void *dest,
01515 int size,
01516 _gen_real src[2])
01517 {
01518
01519
01520 assert ( size <= (sizeof(_gen_real) << 1) );
01521
01522 switch (size) {
01523
01524 #ifdef _F_COMP4
01525 case ( 2 * 4 ):
01526 ((_f_real4 *)dest)[0] = GENREALTO4(&src[0]);
01527 ((_f_real4 *)dest)[1] = GENREALTO4(&src[1]);
01528 break;
01529 #endif
01530
01531 case ( 2 * 8 ):
01532 ((_f_real8 *)dest)[0] = GENREALTO8(&src[0]);
01533 ((_f_real8 *)dest)[1] = GENREALTO8(&src[1]);
01534 break;
01535
01536 #ifdef _F_COMP16
01537 case ( 2 * 16 ):
01538 ((_f_real16 *)dest)[0] = src[0];
01539 ((_f_real16 *)dest)[1] = src[1];
01540 break;
01541 #endif
01542
01543 default:
01544 assert ( 0 );
01545 }
01546
01547 return;
01548 }