Annotation of researchv10dc/libI77/rdfmt.c, revision 1.1

1.1     ! root        1: #include "f2c.h"
        !             2: #include "fio.h"
        !             3: #include "fmt.h"
        !             4: #include "fp.h"
        !             5: 
        !             6: extern int f__cursor;
        !             7: #ifdef KR_headers
        !             8: extern double atof();
        !             9: #else
        !            10: #undef abs
        !            11: #undef min
        !            12: #undef max
        !            13: #include "stdlib.h"
        !            14: #endif
        !            15: 
        !            16:  static int
        !            17: #ifdef KR_headers
        !            18: rd_Z(n,w,len) Uint *n; ftnlen len;
        !            19: #else
        !            20: rd_Z(Uint *n, int w, ftnlen len)
        !            21: #endif
        !            22: {
        !            23:        long x[9];
        !            24:        char *s, *s0, *s1, *se, *t;
        !            25:        int ch, i, w1, w2;
        !            26:        static char hex[256];
        !            27:        static int one = 1;
        !            28:        int bad = 0;
        !            29: 
        !            30:        if (!hex['0']) {
        !            31:                s = "0123456789";
        !            32:                while(ch = *s++)
        !            33:                        hex[ch] = ch - '0' + 1;
        !            34:                s = "ABCDEF";
        !            35:                while(ch = *s++)
        !            36:                        hex[ch] = hex[ch + 'a' - 'A'] = ch - 'A' + 11;
        !            37:                }
        !            38:        s = s0 = (char *)x;
        !            39:        s1 = (char *)&x[4];
        !            40:        se = (char *)&x[8];
        !            41:        if (len > 4*sizeof(long))
        !            42:                return errno = 117;
        !            43:        while (w) {
        !            44:                GET(ch);
        !            45:                if (ch==',' || ch=='\n')
        !            46:                        break;
        !            47:                w--;
        !            48:                if (ch > ' ') {
        !            49:                        if (!hex[ch & 0xff])
        !            50:                                bad++;
        !            51:                        *s++ = ch;
        !            52:                        if (s == se) {
        !            53:                                /* discard excess characters */
        !            54:                                for(t = s0, s = s1; t < s1;)
        !            55:                                        *t++ = *s++;
        !            56:                                s = s1;
        !            57:                                }
        !            58:                        }
        !            59:                }
        !            60:        if (bad)
        !            61:                return errno = 115;
        !            62:        w = (int)len;
        !            63:        w1 = s - s0;
        !            64:        w2 = w1+1 >> 1;
        !            65:        t = (char *)n;
        !            66:        if (*(char *)&one) {
        !            67:                /* little endian */
        !            68:                t += w - 1;
        !            69:                i = -1;
        !            70:                }
        !            71:        else
        !            72:                i = 1;
        !            73:        for(; w > w2; t += i, --w)
        !            74:                *t = 0;
        !            75:        if (!w)
        !            76:                return 0;
        !            77:        if (w < w2)
        !            78:                s0 = s - (w << 1);
        !            79:        else if (w1 & 1) {
        !            80:                *t = hex[*s0++ & 0xff] - 1;
        !            81:                if (!--w)
        !            82:                        return 0;
        !            83:                t += i;
        !            84:                }
        !            85:        do {
        !            86:                *t = hex[*s0 & 0xff]-1 << 4 | hex[s0[1] & 0xff]-1;
        !            87:                t += i;
        !            88:                s0 += 2;
        !            89:                }
        !            90:                while(--w);
        !            91:        return 0;
        !            92:        }
        !            93: 
        !            94:  static int
        !            95: #ifdef KR_headers
        !            96: rd_I(n,w,len, base) Uint *n; int w; ftnlen len; register int base;
        !            97: #else
        !            98: rd_I(Uint *n, int w, ftnlen len, register int base)
        !            99: #endif
        !           100: {      long x;
        !           101:        int sign,ch;
        !           102:        char s[84], *ps;
        !           103:        ps=s; x=0;
        !           104:        while (w)
        !           105:        {
        !           106:                GET(ch);
        !           107:                if (ch==',' || ch=='\n') break;
        !           108:                *ps=ch; ps++; w--;
        !           109:        }
        !           110:        *ps='\0';
        !           111:        ps=s;
        !           112:        while (*ps==' ') ps++;
        !           113:        if (*ps=='-') { sign=1; ps++; }
        !           114:        else { sign=0; if (*ps=='+') ps++; }
        !           115: loop:  while (*ps>='0' && *ps<='9') { x=x*base+(*ps-'0'); ps++; }
        !           116:        if (*ps==' ') {if (f__cblank) x *= base; ps++; goto loop;}
        !           117:        if(sign) x = -x;
        !           118:        if(len==sizeof(integer)) n->il=x;
        !           119:        else if(len == sizeof(char)) n->ic = (char)x;
        !           120: #ifdef Allow_TYQUAD
        !           121:        else if (len == sizeof(longint)) n->ili = x;
        !           122: #endif
        !           123:        else n->is = (short)x;
        !           124:        if (*ps) return(errno=115); else return(0);
        !           125: }
        !           126:  static int
        !           127: #ifdef KR_headers
        !           128: rd_L(n,w,len) ftnint *n; ftnlen len;
        !           129: #else
        !           130: rd_L(ftnint *n, int w, ftnlen len)
        !           131: #endif
        !           132: {      int ch, lv;
        !           133:        char s[84], *ps;
        !           134:        ps=s;
        !           135:        while (w) {
        !           136:                GET(ch);
        !           137:                if (ch==','||ch=='\n') break;
        !           138:                *ps=ch;
        !           139:                ps++; w--;
        !           140:                }
        !           141:        *ps='\0';
        !           142:        ps=s; while (*ps==' ') ps++;
        !           143:        if (*ps=='.') ps++;
        !           144:        if (*ps=='t' || *ps == 'T')
        !           145:                lv = 1;
        !           146:        else if (*ps == 'f' || *ps == 'F')
        !           147:                lv = 0;
        !           148:        else return(errno=116);
        !           149:        switch(len) {
        !           150:                case sizeof(char):      *(char *)n = (char)lv;   break;
        !           151:                case sizeof(short):     *(short *)n = (short)lv; break;
        !           152:                default:                *n = lv;
        !           153:                }
        !           154:        return 0;
        !           155: }
        !           156: 
        !           157: #include "ctype.h"
        !           158: 
        !           159:  static int
        !           160: #ifdef KR_headers
        !           161: rd_F(p, w, d, len) ufloat *p; ftnlen len;
        !           162: #else
        !           163: rd_F(ufloat *p, int w, int d, ftnlen len)
        !           164: #endif
        !           165: {
        !           166:        char s[FMAX+EXPMAXDIGS+4];
        !           167:        register int ch;
        !           168:        register char *sp, *spe, *sp1;
        !           169:        double x;
        !           170:        int scale1, se;
        !           171:        long e, exp;
        !           172: 
        !           173:        sp1 = sp = s;
        !           174:        spe = sp + FMAX;
        !           175:        exp = -d;
        !           176:        x = 0.;
        !           177: 
        !           178:        do {
        !           179:                GET(ch);
        !           180:                w--;
        !           181:                } while (ch == ' ' && w);
        !           182:        switch(ch) {
        !           183:                case '-': *sp++ = ch; sp1++; spe++;
        !           184:                case '+':
        !           185:                        if (!w) goto zero;
        !           186:                        --w;
        !           187:                        GET(ch);
        !           188:                }
        !           189:        while(ch == ' ') {
        !           190: blankdrop:
        !           191:                if (!w--) goto zero; GET(ch); }
        !           192:        while(ch == '0')
        !           193:                { if (!w--) goto zero; GET(ch); }
        !           194:        if (ch == ' ' && f__cblank)
        !           195:                goto blankdrop;
        !           196:        scale1 = f__scale;
        !           197:        while(isdigit(ch)) {
        !           198: digloop1:
        !           199:                if (sp < spe) *sp++ = ch;
        !           200:                else ++exp;
        !           201: digloop1e:
        !           202:                if (!w--) goto done;
        !           203:                GET(ch);
        !           204:                }
        !           205:        if (ch == ' ') {
        !           206:                if (f__cblank)
        !           207:                        { ch = '0'; goto digloop1; }
        !           208:                goto digloop1e;
        !           209:                }
        !           210:        if (ch == '.') {
        !           211:                exp += d;
        !           212:                if (!w--) goto done;
        !           213:                GET(ch);
        !           214:                if (sp == sp1) { /* no digits yet */
        !           215:                        while(ch == '0') {
        !           216: skip01:
        !           217:                                --exp;
        !           218: skip0:
        !           219:                                if (!w--) goto done;
        !           220:                                GET(ch);
        !           221:                                }
        !           222:                        if (ch == ' ') {
        !           223:                                if (f__cblank) goto skip01;
        !           224:                                goto skip0;
        !           225:                                }
        !           226:                        }
        !           227:                while(isdigit(ch)) {
        !           228: digloop2:
        !           229:                        if (sp < spe)
        !           230:                                { *sp++ = ch; --exp; }
        !           231: digloop2e:
        !           232:                        if (!w--) goto done;
        !           233:                        GET(ch);
        !           234:                        }
        !           235:                if (ch == ' ') {
        !           236:                        if (f__cblank)
        !           237:                                { ch = '0'; goto digloop2; }
        !           238:                        goto digloop2e;
        !           239:                        }
        !           240:                }
        !           241:        switch(ch) {
        !           242:          default:
        !           243:                break;
        !           244:          case '-': se = 1; goto signonly;
        !           245:          case '+': se = 0; goto signonly;
        !           246:          case 'e':
        !           247:          case 'E':
        !           248:          case 'd':
        !           249:          case 'D':
        !           250:                if (!w--)
        !           251:                        goto bad;
        !           252:                GET(ch);
        !           253:                while(ch == ' ') {
        !           254:                        if (!w--)
        !           255:                                goto bad;
        !           256:                        GET(ch);
        !           257:                        }
        !           258:                se = 0;
        !           259:                switch(ch) {
        !           260:                  case '-': se = 1;
        !           261:                  case '+':
        !           262: signonly:
        !           263:                        if (!w--)
        !           264:                                goto bad;
        !           265:                        GET(ch);
        !           266:                        }
        !           267:                while(ch == ' ') {
        !           268:                        if (!w--)
        !           269:                                goto bad;
        !           270:                        GET(ch);
        !           271:                        }
        !           272:                if (!isdigit(ch))
        !           273:                        goto bad;
        !           274: 
        !           275:                e = ch - '0';
        !           276:                for(;;) {
        !           277:                        if (!w--)
        !           278:                                { ch = '\n'; break; }
        !           279:                        GET(ch);
        !           280:                        if (!isdigit(ch)) {
        !           281:                                if (ch == ' ') {
        !           282:                                        if (f__cblank)
        !           283:                                                ch = '0';
        !           284:                                        else continue;
        !           285:                                        }
        !           286:                                else
        !           287:                                        break;
        !           288:                                }
        !           289:                        e = 10*e + ch - '0';
        !           290:                        if (e > EXPMAX && sp > sp1)
        !           291:                                goto bad;
        !           292:                        }
        !           293:                if (se)
        !           294:                        exp -= e;
        !           295:                else
        !           296:                        exp += e;
        !           297:                scale1 = 0;
        !           298:                }
        !           299:        switch(ch) {
        !           300:          case '\n':
        !           301:          case ',':
        !           302:                break;
        !           303:          default:
        !           304: bad:
        !           305:                return (errno = 115);
        !           306:                }
        !           307: done:
        !           308:        if (sp > sp1) {
        !           309:                while(*--sp == '0')
        !           310:                        ++exp;
        !           311:                if (exp -= scale1)
        !           312:                        sprintf(sp+1, "e%ld", exp);
        !           313:                else
        !           314:                        sp[1] = 0;
        !           315:                x = atof(s);
        !           316:                }
        !           317: zero:
        !           318:        if (len == sizeof(real))
        !           319:                p->pf = x;
        !           320:        else
        !           321:                p->pd = x;
        !           322:        return(0);
        !           323:        }
        !           324: 
        !           325: 
        !           326:  static int
        !           327: #ifdef KR_headers
        !           328: rd_A(p,len) char *p; ftnlen len;
        !           329: #else
        !           330: rd_A(char *p, ftnlen len)
        !           331: #endif
        !           332: {      int i,ch;
        !           333:        for(i=0;i<len;i++)
        !           334:        {       GET(ch);
        !           335:                *p++=VAL(ch);
        !           336:        }
        !           337:        return(0);
        !           338: }
        !           339:  static int
        !           340: #ifdef KR_headers
        !           341: rd_AW(p,w,len) char *p; ftnlen len;
        !           342: #else
        !           343: rd_AW(char *p, int w, ftnlen len)
        !           344: #endif
        !           345: {      int i,ch;
        !           346:        if(w>=len)
        !           347:        {       for(i=0;i<w-len;i++)
        !           348:                        GET(ch);
        !           349:                for(i=0;i<len;i++)
        !           350:                {       GET(ch);
        !           351:                        *p++=VAL(ch);
        !           352:                }
        !           353:                return(0);
        !           354:        }
        !           355:        for(i=0;i<w;i++)
        !           356:        {       GET(ch);
        !           357:                *p++=VAL(ch);
        !           358:        }
        !           359:        for(i=0;i<len-w;i++) *p++=' ';
        !           360:        return(0);
        !           361: }
        !           362:  static int
        !           363: #ifdef KR_headers
        !           364: rd_H(n,s) char *s;
        !           365: #else
        !           366: rd_H(int n, char *s)
        !           367: #endif
        !           368: {      int i,ch;
        !           369:        for(i=0;i<n;i++)
        !           370:                if((ch=(*f__getn)())<0) return(ch);
        !           371:                else *s++ = ch=='\n'?' ':ch;
        !           372:        return(1);
        !           373: }
        !           374:  static int
        !           375: #ifdef KR_headers
        !           376: rd_POS(s) char *s;
        !           377: #else
        !           378: rd_POS(char *s)
        !           379: #endif
        !           380: {      char quote;
        !           381:        int ch;
        !           382:        quote= *s++;
        !           383:        for(;*s;s++)
        !           384:                if(*s==quote && *(s+1)!=quote) break;
        !           385:                else if((ch=(*f__getn)())<0) return(ch);
        !           386:                else *s = ch=='\n'?' ':ch;
        !           387:        return(1);
        !           388: }
        !           389: #ifdef KR_headers
        !           390: rd_ed(p,ptr,len) struct f__syl *p; char *ptr; ftnlen len;
        !           391: #else
        !           392: rd_ed(struct f__syl *p, char *ptr, ftnlen len)
        !           393: #endif
        !           394: {      int ch;
        !           395:        for(;f__cursor>0;f__cursor--) if((ch=(*f__getn)())<0) return(ch);
        !           396:        if(f__cursor<0)
        !           397:        {       if(f__recpos+f__cursor < 0) /*err(elist->cierr,110,"fmt")*/
        !           398:                        f__cursor = -f__recpos; /* is this in the standard? */
        !           399:                if(f__external == 0) {
        !           400:                        extern char *f__icptr;
        !           401:                        f__icptr += f__cursor;
        !           402:                }
        !           403:                else if(f__curunit && f__curunit->useek)
        !           404:                        (void) fseek(f__cf,(long) f__cursor,SEEK_CUR);
        !           405:                else
        !           406:                        err(f__elist->cierr,106,"fmt");
        !           407:                f__recpos += f__cursor;
        !           408:                f__cursor=0;
        !           409:        }
        !           410:        switch(p->op)
        !           411:        {
        !           412:        default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op);
        !           413:                sig_die(f__fmtbuf, 1);
        !           414:        case IM:
        !           415:        case I: ch = rd_I((Uint *)ptr,p->p1,len, 10);
        !           416:                break;
        !           417: 
        !           418:                /* O and OM don't work right for character, double, complex, */
        !           419:                /* or doublecomplex, and they differ from Fortran 90 in */
        !           420:                /* showing a minus sign for negative values. */
        !           421: 
        !           422:        case OM:
        !           423:        case O: ch = rd_I((Uint *)ptr, p->p1, len, 8);
        !           424:                break;
        !           425:        case L: ch = rd_L((ftnint *)ptr,p->p1,len);
        !           426:                break;
        !           427:        case A: ch = rd_A(ptr,len);
        !           428:                break;
        !           429:        case AW:
        !           430:                ch = rd_AW(ptr,p->p1,len);
        !           431:                break;
        !           432:        case E: case EE:
        !           433:        case D:
        !           434:        case G:
        !           435:        case GE:
        !           436:        case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2,len);
        !           437:                break;
        !           438: 
        !           439:                /* Z and ZM assume 8-bit bytes. */
        !           440: 
        !           441:        case ZM:
        !           442:        case Z:
        !           443:                ch = rd_Z((Uint *)ptr, p->p1, len);
        !           444:                break;
        !           445:        }
        !           446:        if(ch == 0) return(ch);
        !           447:        else if(ch == EOF) return(EOF);
        !           448:        if (f__cf)
        !           449:                clearerr(f__cf);
        !           450:        return(errno);
        !           451: }
        !           452: #ifdef KR_headers
        !           453: rd_ned(p) struct f__syl *p;
        !           454: #else
        !           455: rd_ned(struct f__syl *p)
        !           456: #endif
        !           457: {
        !           458:        switch(p->op)
        !           459:        {
        !           460:        default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op);
        !           461:                sig_die(f__fmtbuf, 1);
        !           462:        case APOS:
        !           463:                return(rd_POS(*(char **)&p->p2));
        !           464:        case H: return(rd_H(p->p1,*(char **)&p->p2));
        !           465:        case SLASH: return((*f__donewrec)());
        !           466:        case TR:
        !           467:        case X: f__cursor += p->p1;
        !           468:                return(1);
        !           469:        case T: f__cursor=p->p1-f__recpos - 1;
        !           470:                return(1);
        !           471:        case TL: f__cursor -= p->p1;
        !           472:                if(f__cursor < -f__recpos)      /* TL1000, 1X */
        !           473:                        f__cursor = -f__recpos;
        !           474:                return(1);
        !           475:        }
        !           476: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.