Annotation of researchv10dc/libI77/notused/nio.c, revision 1.1

1.1     ! root        1: /*     @(#)nio.c       1.1     */
        !             2: #include <stdio.h>
        !             3: #include <ctype.h>
        !             4: #include "fio.h"
        !             5: #include "fmt.h"
        !             6: #include "lio.h"
        !             7: 
        !             8: /*
        !             9:  *     namelist io
        !            10:  *
        !            11:  *     see f77's proc.c at namelist() for description
        !            12:  */
        !            13: 
        !            14: typedef struct {
        !            15:        int     ndims;                  /* # of dimensions */
        !            16:        int     nels;                   /* # of elements */
        !            17:        int     baseoff;                /* how to get to (0,...,0) element */
        !            18:        int     span[7];                /* span of each dimension +1+ */
        !            19: } Dims;                                        /* dimension descriptor */
        !            20: 
        !            21: 
        !            22:                                        /* +1+ note: only # of dimensions
        !            23:                                        applies here, i.e. actual array
        !            24:                                        is between 0 and 7 elements based
        !            25:                                        on ndims */
        !            26: 
        !            27: typedef union {
        !            28:        char    *pchar;
        !            29:        short   *pshort;
        !            30:        int     *pint;
        !            31:        long    *plong;
        !            32:        float   *pfloat;
        !            33:        double  *pdouble;
        !            34:        char    **pptr;
        !            35: } Pointer;                             /* pointer to all sorts of things */
        !            36: 
        !            37: 
        !            38: typedef struct {
        !            39:        char    varname[18];            /* name of variable */
        !            40:        Pointer varaddr;                /* where it is */
        !            41:        int     type;                   /* its type */
        !            42:        Dims    *dimp;                  /* dimension descriptor */
        !            43: } Nlentry;                             /* namelist entry: 1 for each var */
        !            44: 
        !            45: 
        !            46: typedef struct {
        !            47:        char    nlname[18];             /* name of namelist */
        !            48:        Nlentry nlvnames[1];            /* array of variable descriptors +2+*/
        !            49: } Namelist;
        !            50: 
        !            51:                                        /* +2+ note: this array is not bounded
        !            52:                                        but is terminated by an entry with a
        !            53:                                        null varname */
        !            54: 
        !            55: /*
        !            56:  * s_rsne - start read namelist external
        !            57:  *
        !            58:  * s_rsne
        !            59:  *     if (file not initialized)
        !            60:  *             intialize it
        !            61:  *     if (file doesn't jive with namelist io)
        !            62:  *             return error
        !            63:  *     initialize some global variables
        !            64:  *     if (not currently reading on file OR not capable of doing so)
        !            65:  *             return error
        !            66:  *     read namelist name
        !            67:  *     if (not correct namelist name)
        !            68:  *             error
        !            69:  *     determine number of variables in namelist
        !            70:  *     read variable name
        !            71:  *     while (variable name is not "&end")
        !            72:  *             if (variable is in namelist)
        !            73:  *                     read value(s) for it
        !            74:  *             else
        !            75:  *                     error
        !            76:  *     if (not correct number of variables read)
        !            77:  *             error
        !            78:  * end s_rsne
        !            79:  */
        !            80: 
        !            81: #define BSIZ 50
        !            82: 
        !            83: static char nlrs[] = "namelist read";
        !            84: 
        !            85: s_rsne(pnlarg)
        !            86: cilist *pnlarg;
        !            87: {
        !            88:        Namelist *pnl;
        !            89:        Nlentry *pnlent, *findit();
        !            90:        int nvars, n;
        !            91:        char buf[BSIZ], *getword();
        !            92: 
        !            93:        if (!init)
        !            94:                f_init();
        !            95:        if (n = c_nle(pnlarg))
        !            96:                return (n);
        !            97:        reading = external = sequential = 1;
        !            98:        formatted = 0;
        !            99:        if (curunit->uwrt && nowreading(curunit))
        !           100:                return (1);
        !           101:        pnl = (Namelist *) pnlarg->cifmt;
        !           102:        if (getc(cf) != ' ' || getc(cf) != '&')
        !           103:                err(pnlarg->cierr, 115, nlrs);
        !           104:        if (strcmp(pnl->nlname, getword(buf, strlen(pnl->nlname))))
        !           105:                err(pnlarg->cierr, 118, buf);
        !           106:        n = getc(cf);
        !           107:        if (!isspace(n))
        !           108:                err(pnlarg->cierr, 115, nlrs);
        !           109:        for (nvars=0, pnlent = pnl->nlvnames; strlen(pnlent->varname); ++pnlent)
        !           110:                ++nvars;
        !           111:        n = 0;
        !           112:        elist = pnlarg;
        !           113:        while (nvars--)
        !           114:                {
        !           115:                if (!getword(buf, BSIZ - 1))
        !           116:                        err(pnlarg->cierr, 120, nlrs);
        !           117:                if (!strcmp(buf, "&end"))
        !           118:                        err(pnlarg->cierr, 121, nlrs);
        !           119:                if (!(pnlent = findit(buf, pnl->nlvnames)))
        !           120:                        err(pnlarg->cierr, 119, buf);
        !           121:                if (getvar(pnlent))
        !           122:                        err(pnlarg->cierr, 120, nlrs);
        !           123:                }
        !           124:        if (!getword(buf, BSIZ - 1))
        !           125:                err(pnlarg->cierr, 120, nlrs);
        !           126:        if (strcmp(buf, "&end"))
        !           127:                err(pnlarg->cierr, 121, nlrs);
        !           128:        return (0);
        !           129: }
        !           130: 
        !           131: /* miscellaneous utility functions for namelist read */
        !           132: 
        !           133: /* getword - get a "word" text string from current file */
        !           134: 
        !           135: char *getword(s, n)
        !           136: char *s;
        !           137: int n;
        !           138: {
        !           139:        int i;
        !           140:        char *p;
        !           141: 
        !           142:        p = s;
        !           143:        i = getc(cf);
        !           144:        while (isspace(i) || (ispunct(i) && i != '&'))
        !           145:                i = getc(cf);
        !           146:        while (n--)
        !           147:                {
        !           148:                if (i != EOF && i != '=' && !isspace(i))
        !           149:                        if (isupper(i))
        !           150:                                *p++ = tolower(i);
        !           151:                        else
        !           152:                                *p++ = i;
        !           153:                else
        !           154:                        break;
        !           155:                i = getc(cf);
        !           156:                }
        !           157:        if (feof(cf) && p == s)
        !           158:                return (NULL);
        !           159:        *p = '\0';
        !           160:        return (s);
        !           161: }
        !           162: 
        !           163: /* findit - find key in list of Nlentrys */
        !           164: 
        !           165: Nlentry *findit(key, list)
        !           166: char *key;
        !           167: Nlentry *list;
        !           168: {
        !           169:        while (strlen(list->varname))
        !           170:                {
        !           171:                if (!strcmp(key, list->varname))
        !           172:                        return (list);
        !           173:                else
        !           174:                        ++list;
        !           175:                }
        !           176:        return (NULL);
        !           177: }
        !           178: 
        !           179: /* getvar - read values for namelist io
        !           180:  *
        !           181:  * getvar uses l_read of list io to do all the dirty work, therefore
        !           182:  * it should be inserted into the library before lread.c (on UNIX
        !           183:  * systems with barbaric topologically sorted libraries)
        !           184:  *
        !           185:  * It sets the cierr flag so that l_read (and its subordinates) will
        !           186:  * not report errors, but pass them back so that the diagnostic message
        !           187:  * will appear to come from "namelist read".
        !           188:  */
        !           189: 
        !           190: getvar(pnlent)
        !           191: Nlentry *pnlent;
        !           192: {
        !           193:        int n, i, size;
        !           194: 
        !           195:        if (pnlent->dimp)
        !           196:                n = pnlent->dimp->nels;
        !           197:        else
        !           198:                n = 1;
        !           199:        elist->cierr = 1;
        !           200:        switch (pnlent->type)
        !           201:                {
        !           202:                case TYADDR:
        !           203:                        size = sizeof(char *);
        !           204:                        break;
        !           205:                case TYSHORT:
        !           206:                        size = sizeof(short);
        !           207:                        break;
        !           208:                case TYLOGICAL:
        !           209:                case TYLONG:
        !           210:                        size = sizeof(long);
        !           211:                        break;
        !           212:                case TYREAL:
        !           213:                case TYCOMPLEX:
        !           214:                        size = sizeof(float);
        !           215:                        break;
        !           216:                case TYDREAL:
        !           217:                case TYDCOMPLEX:
        !           218:                        size = sizeof(double);
        !           219:                        break;
        !           220:                default:
        !           221:                        if (pnlent->type < 0)
        !           222:                                {
        !           223:                                if (n = l_read(&n, pnlent->varaddr,
        !           224:                                            -pnlent->type, TYCHAR))
        !           225:                                        err(elist->cierr = 0, n, nlrs);
        !           226:                                return (0);
        !           227:                                }
        !           228:                        else
        !           229:                                err(elist->cierr = 0, 117, nlrs);
        !           230:                }
        !           231:        if (n = l_read(&n, pnlent->varaddr, size, pnlent->type))
        !           232:                err(0, n, nlrs);
        !           233:        elist->cierr = 0;
        !           234:        return (0);
        !           235: }
        !           236: 
        !           237: /*
        !           238:  * s_wsne - start write namelist external
        !           239:  *
        !           240:  * s_wsne
        !           241:  *     if (file not initialized)
        !           242:  *             initialize it
        !           243:  *     if (file doesn't jive with namelist io)
        !           244:  *             return error
        !           245:  *     initialize some global variables
        !           246:  *     if (not currently writing on file OR not capable of doing so)
        !           247:  *             return error
        !           248:  *     set up namelist and entry pointers
        !           249:  *     output namelist name in proper format
        !           250:  *     do
        !           251:  *             output variable name
        !           252:  *             output value based on type
        !           253:  *             point to next entry
        !           254:  *     while (there are more to do AND sneakily output a comma separator
        !           255:  *     output end line
        !           256:  * end s_wsne
        !           257:  */
        !           258: 
        !           259: s_wsne(pnlarg)
        !           260: cilist *pnlarg;
        !           261: {
        !           262:        Namelist *pnl;
        !           263:        Nlentry *pnlent;
        !           264:        Pointer ptr;
        !           265:        int i, n, vtype;
        !           266:        char *pch, buf[BSIZ];
        !           267: 
        !           268:        if (!init)
        !           269:                f_init();
        !           270:        if (n = c_nle(pnlarg))
        !           271:                return(n);
        !           272:        reading = formatted = 0;
        !           273:        external = sequential = 1;
        !           274:        if (!curunit->uwrt && nowwriting(curunit))
        !           275:                return(1);
        !           276:        pnl = (Namelist *) pnlarg->cifmt;
        !           277:        (void) putc(' ', cf);
        !           278:        (void) putc('&', cf);
        !           279:        (void) fputs(pnl->nlname, cf);
        !           280:        (void) putc('\n', cf);
        !           281:        (void) putc(' ', cf);
        !           282:        pnlent = pnl->nlvnames;
        !           283:        do {
        !           284:                (void) fputs(pnlent->varname, cf);
        !           285:                (void) putc('=', cf);
        !           286:                if (pnlent->dimp)
        !           287:                        n = pnlent->dimp->nels;
        !           288:                else
        !           289:                        n = 1;
        !           290:                if ((vtype = pnlent->type) < 0 && (pch = pnlent->varaddr.pchar))
        !           291:                        do {
        !           292:                                (void) putc('\'', cf);
        !           293:                                for (i = vtype; i; ++i)
        !           294:                                        (void) putc(*pch++, cf);
        !           295:                                (void) putc('\'', cf);
        !           296:                        } while (--n && !t_putc(','));
        !           297:                else
        !           298:                        {
        !           299:                        ptr.pchar = pnlent->varaddr.pchar;
        !           300:                        do { switch (vtype)
        !           301:                                {
        !           302:                                case TYADDR:
        !           303:                                        (void) sprintf(buf,"0x%x", *ptr.pptr++);
        !           304:                                        break;
        !           305:                                case TYSHORT:
        !           306:                                        (void) sprintf(buf,"%d", *ptr.pshort++);
        !           307:                                        break;
        !           308:                                case TYLONG:
        !           309:                                        (void) sprintf(buf,"%ld", *ptr.plong++);
        !           310:                                        break;
        !           311:                                case TYREAL:
        !           312:                                        (void)sprintf(buf,"%.8f",*ptr.pfloat++);
        !           313:                                        break;
        !           314:                                case TYDREAL:
        !           315:                                        (void) sprintf(buf, "%.18e",
        !           316:                                            *ptr.pdouble++);
        !           317:                                        break;
        !           318:                                case TYCOMPLEX:
        !           319:                                        (void) sprintf(buf, "(%.8f,%.8f)",
        !           320:                                            *ptr.pfloat, *(ptr.pfloat+1));
        !           321:                                        ptr.pfloat += 2;
        !           322:                                        break;
        !           323:                                case TYDCOMPLEX:
        !           324:                                        (void) sprintf(buf, "(%.18e,%.18e)",
        !           325:                                            *ptr.pdouble, *(ptr.pdouble+1));
        !           326:                                        ptr.pdouble += 2;
        !           327:                                        break;
        !           328:                                case TYCHAR:
        !           329:                                        (void) sprintf(buf, "%c", *ptr.pchar++);
        !           330:                                        break;
        !           331:                                case TYLOGICAL:
        !           332:                                        (void) sprintf(buf, ".%s.",
        !           333:                                            (*ptr.plong ? "TRUE" : "FALSE"));
        !           334:                                        break;
        !           335:                                default:
        !           336:                                        err(pnlarg->cierr, 117, "namelist io");
        !           337:                                }
        !           338:                                (void) fputs(buf, cf);
        !           339:                        } while (--n && !t_putc(','));
        !           340:                        }
        !           341:                ++pnlent;
        !           342:        } while (strlen(pnlent->varname) && !t_putc(','));
        !           343:        (void) fputs("\n &end\n", cf);
        !           344:        return (0);
        !           345: }
        !           346: 
        !           347: /*
        !           348:  * c_nle - check namelist external
        !           349:  *
        !           350:  * c_nle
        !           351:  *     set up global variables
        !           352:  *     if (bogus unit)
        !           353:  *             fatal error
        !           354:  *     if (unit is unitialized AND can't be)
        !           355:  *             fatal error
        !           356:  *     if (can't do unformatted io on unit)
        !           357:  *             fatal error
        !           358:  * end c_nle
        !           359:  */
        !           360: 
        !           361: 
        !           362: c_nle(pcl)
        !           363: cilist *pcl;
        !           364: {
        !           365:        fmtbuf = "namelist io";
        !           366:        if (0 > pcl->ciunit || pcl->ciunit >= MXUNIT)
        !           367:                err(pcl->cierr, 101, "start namelist io");
        !           368:        scale = recpos = 0;
        !           369:        curunit = &units[pcl->ciunit];
        !           370:        if (curunit->ufd == NULL && fk_open(SEQ, FMT, pcl->ciunit))
        !           371:                err(pcl->cierr, 102, "namelist io");
        !           372:        cf = curunit->ufd;
        !           373:        if (!curunit->ufmt)
        !           374:                err(pcl->cierr, 103, "namelist io");
        !           375:        return(0);
        !           376: }

unix.superglobalmegacorp.com

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