Annotation of 43BSD/contrib/spms/src/bin/mkproject/mkproject.c, revision 1.1.1.1

1.1       root        1: static char *rcsid = "$Header";
                      2: /*
                      3:  * mkproject - make a project root directory
                      4:  *
                      5:  * Author: Peter J. Nicklin
                      6:  */
                      7: #include <signal.h>
                      8: #include <stdio.h>
                      9: #include <sys/types.h>
                     10: #include <sys/stat.h>
                     11: #include "getarg.h"
                     12: #include "macro.h"
                     13: #include "null.h"
                     14: #include "path.h"
                     15: #include "pdb.h"
                     16: #include "pld.h"
                     17: #include "slist.h"
                     18: #include "spms.h"
                     19: #include "system.h"
                     20: #include "yesno.h"
                     21: 
                     22: char CWD[PATHSIZE];                    /* current working directory */
                     23: char *CWP;                             /* current working project */
                     24: char *PGN = "mkproject";               /* program name */
                     25: int WANT_TO_EXIT = 0;                  /* advisory exit flag */
                     26: 
                     27: main(argc, argv)
                     28:        int argc;
                     29:        char **argv;
                     30: {
                     31:        extern int PPDEBUG;             /* project pathname debug flag */
                     32:        char *alias = NULL;             /* alternative project directory name */
                     33:        char *getcwp();                 /* get current working project */
                     34:        char *getwd();                  /* get current working directory */
                     35:        int addtyp();                   /* make project directory type labels */
                     36:        int chalias();                  /* change project directory alias */
                     37:        int chdesc();                   /* change project directory descrip */
                     38:        int isfg();                     /* is process in foreground? */
                     39:        int minusdflag = YES;           /* project directory description flag */
                     40:        int mkproject();                /* make a project root directory */
                     41:        int mustexist = 0;              /* existing directories flag */
                     42:        int plusdflag = NO;             /* project directory description flag */
                     43:        int typargtolist();             /* type labels -> pdirtyp list */
                     44:        int xppath();                   /* expand project pathname */
                     45:        PATH pathbuf;                   /* pathname struct buffer */
                     46:        SLIST *pdirtyp;                 /* project directory type labels list */
                     47:        SLIST *slinit();                /* initialize singly-linked list */
                     48:        int onintr();                   /* process signals */
                     49:        int status = 0;                 /* exit status */
                     50: 
                     51:        pdirtyp = slinit();
                     52:        {
                     53:        register char *s;               /* option pointer */
                     54:        while (--argc > 0 && (**++argv == '-' || **argv == '+'))
                     55:                {
                     56:                if (**argv == '-')
                     57:                        {
                     58:                        for (s = argv[0]+1; *s != '\0'; s++)
                     59:                                switch (*s)
                     60:                                        {
                     61:                                        case 'D':
                     62:                                                PPDEBUG = YES;
                     63:                                                break;
                     64:                                        case 'N':
                     65:                                                alias = GETARG(s);
                     66:                                                if (*alias == '\0')
                     67:                                                        status = 1;
                     68:                                                goto endif;
                     69:                                        case 'T':
                     70:                                                if (typargtolist(GETARG(s),pdirtyp)==NO)
                     71:                                                        status = 1;
                     72:                                                else if (*s == '\0')
                     73:                                                        status = 1;
                     74:                                                goto endif;
                     75:                                        case 'd':
                     76:                                                minusdflag = NO;
                     77:                                                break;
                     78:                                        default:
                     79:                                                warn("bad option -%c", *s);
                     80:                                                status = 1;
                     81:                                                goto endif;
                     82:                                        }
                     83:                        }
                     84:                else    {
                     85:                        mustexist = 1;
                     86:                        for (s = argv[0]+1; *s != '\0'; s++)
                     87:                                switch (*s)
                     88:                                        {
                     89:                                        case 'N':
                     90:                                                alias = GETARG(s);
                     91:                                                if (*alias == '\0')
                     92:                                                        status = 1;
                     93:                                                goto endif;
                     94:                                        case 'T':
                     95:                                                if (typargtolist(GETARG(s),pdirtyp)==NO)
                     96:                                                        status = 1;
                     97:                                                else if (*s == '\0')
                     98:                                                        status = 1;
                     99:                                                goto endif;
                    100:                                        case 'd':
                    101:                                                plusdflag = YES;
                    102:                                                break;
                    103:                                        default:
                    104:                                                warn("bad option +%c", *s);
                    105:                                                status = 1;
                    106:                                                goto endif;
                    107:                                        }
                    108:                        }
                    109:                endif: continue;
                    110:                }
                    111:        if (status == 1 || argc < 1)
                    112:                fatal("usage: mkproject [{+-}d] [{+-}N alias] %s",
                    113:                      "[{+-}T type[,type...]]\n           projectname ...");
                    114:        }
                    115: 
                    116:        if (getwd(CWD) == NULL)
                    117:                fatal("can't find current working directory");
                    118:        CWP = getcwp();
                    119:        if (isfg() == YES)
                    120:                {
                    121:                signal(SIGINT, onintr);
                    122:                signal(SIGQUIT, onintr);
                    123:                signal(SIGHUP, onintr);
                    124:                }
                    125: 
                    126:        for (; argc > 0; argv++, argc--)
                    127:                {
                    128:                if (xppath(*argv, &pathbuf) == -1)
                    129:                        {
                    130:                        patherr(*argv);
                    131:                        status = 1;
                    132:                        continue;
                    133:                        }
                    134:                if (CWP == NULL && (pathbuf.p_mode&P_IFMT) != P_IFHOME)
                    135:                        fatal("no project environment");
                    136:                if (mustexist)
                    137:                        switch (pathbuf.p_mode & P_IFMT)
                    138:                                {
                    139:                                case P_IFHOME:
                    140:                                case P_IFPROOT:
                    141:                                        if (SLNUM(pdirtyp) > 0)
                    142:                                                status |= addtyp(*argv, pdirtyp,
                    143:                                                          &pathbuf);
                    144:                                        if (plusdflag == YES)
                    145:                                                status |= chdesc(*argv, &pathbuf);
                    146:                                        if (alias != NULL)
                    147:                                                status |= chalias(*argv, alias,
                    148:                                                           &pathbuf);
                    149:                                        break;
                    150:                                case P_IFPDIR:
                    151:                                        warn("%s is a project directory", *argv);
                    152:                                        status = 1;
                    153:                                        break;
                    154:                                case P_IFNEW:
                    155:                                case P_IFREG:
                    156:                                        warn("%s: no such project", *argv);
                    157:                                        status = 1;
                    158:                                        break;
                    159:                                }
                    160:                else    {
                    161:                        status |= mkproject(*argv, alias, pdirtyp, minusdflag, &pathbuf);
                    162:                        }
                    163:                if (WANT_TO_EXIT)
                    164:                        exit(1);
                    165:                }
                    166:        exit(status);
                    167: }
                    168: 
                    169: 
                    170: 
                    171: /*
                    172:  * addtyp() adds type labels to an existing project directory.
                    173:  */
                    174: addtyp(ppathname, pdirtyp, pb)
                    175:        char *ppathname;                /* project directory pathname */
                    176:        SLIST *pdirtyp;                 /* project directory type labels list */
                    177:        PATH *pb;                       /* pathname struct buffer */
                    178: {
                    179:        char *pbfndkey();               /* find key */
                    180:        int closepdb();                 /* close database */
                    181:        int errpdb();                   /* print database error */
                    182:        int pgetent();                  /* load next entry into buffer */
                    183:        int pputent();                  /* write buffer to database */
                    184:        PDB *openpdb();                 /* open database */
                    185:        PDB *pldp;                      /* project link directory stream */
                    186:        void pbaddtyp();                /* add type labels to buffer */
                    187: 
                    188:        if ((pldp = openpdb(PLDNAME, pb->p_project, "rw")) == NULL)
                    189:                return(errpdb((PDB *) NULL));
                    190:        while (pgetent(pldp) != EOF)
                    191:                {
                    192:                if (pbfndkey(CURPROJECT) != NULL)
                    193:                        pbaddtyp(ppathname, pdirtyp);
                    194:                pputent(pldp);
                    195:                }
                    196:        return(closepdb(pldp));
                    197: }
                    198: 
                    199: 
                    200: 
                    201: /*
                    202:  * badtyp() prints a bad format type label message.
                    203:  */
                    204: void
                    205: badtyp(type)
                    206:        char *type;                     /* type label */
                    207: {
                    208:        warn("\"%s\" type label is badly formatted", type);
                    209: }
                    210: 
                    211: 
                    212: 
                    213: /*
                    214:  * chalias() changes an existing project directory alias.
                    215:  */
                    216: chalias(ppathname, newalias, pb)
                    217:        char *ppathname;                /* project directory pathname */
                    218:        char *newalias;                 /* new project directory alias */
                    219:        PATH *pb;                       /* pathname struct buffer */
                    220: {
                    221:        char *pbfndkey();               /* find key */
                    222:        char *ppathcat();               /* project pathname concatenation */
                    223:        char pppathname[PPATHSIZE];     /* parent project pathname */
                    224:        int _closepdb();                /* close database without updating */
                    225:        int closepdb();                 /* close database */
                    226:        int errpdb();                   /* print database error */
                    227:        int pbchgkey();                 /* change existing key */
                    228:        int pgetent();                  /* load next entry into buffer */
                    229:        int pputent();                  /* write buffer to database */
                    230:        int xppath();                   /* expand project pathname */
                    231:        PATH ppathbuf;                  /* parent pathname struct buffer */
                    232:        PDB *openpdb();                 /* open database */
                    233:        PDB *pldp;                      /* project link directory stream */
                    234: 
                    235:        ppathcat(pppathname, ppathname, PARENTPROJECT);
                    236:        xppath(pppathname, &ppathbuf);
                    237:        if ((pldp = openpdb(PLDNAME, ppathbuf.p_path, "rw")) == NULL)
                    238:                return(errpdb((PDB *) NULL));
                    239:        while (pgetent(pldp) != EOF)
                    240:                {
                    241:                if (pbfndkey(newalias) != NULL)
                    242:                        {
                    243:                        warn("%s: %s exists", ppathname, newalias);
                    244:                        _closepdb(pldp);
                    245:                        return(1);
                    246:                        }
                    247:                pbchgkey(pb->p_alias, newalias);
                    248:                pputent(pldp);
                    249:                }
                    250:        return(closepdb(pldp));
                    251: }
                    252: 
                    253: 
                    254: 
                    255: /*
                    256:  * chdesc() changes an existing project directory description.
                    257:  */
                    258: chdesc(ppathname, pb)
                    259:        char *ppathname;                /* project directory pathname */
                    260:        PATH *pb;                       /* pathname struct buffer */
                    261: {
                    262:        char *pbfndkey();               /* find key */
                    263:        int closepdb();                 /* close database */
                    264:        int errpdb();                   /* print database error */
                    265:        int pgetent();                  /* load next entry into buffer */
                    266:        int pputent();                  /* write buffer to database */
                    267:        PDB *openpdb();                 /* open database */
                    268:        PDB *pldp;                      /* project link directory stream */
                    269:        void pbadddesc();               /* add project directory description */
                    270: 
                    271:        if ((pldp = openpdb(PLDNAME, pb->p_project, "rw")) == NULL)
                    272:                return(errpdb((PDB *) NULL));
                    273:        while (pgetent(pldp) != EOF)
                    274:                {
                    275:                if (pbfndkey(CURPROJECT) != NULL)
                    276:                        pbadddesc(ppathname);
                    277:                pputent(pldp);
                    278:                }
                    279:        return(closepdb(pldp));
                    280: }
                    281: 
                    282: 
                    283: 
                    284: /*
                    285:  * mkpld() creates a project link directory. If PLDNAME already exists,
                    286:  * the database is altered accordingly.
                    287:  */
                    288: mkpld(pathname, ppathname, ptp, pdirtyp, dflag)
                    289:        char *pathname;                 /* project root directory pathname */
                    290:        char *ppathname;                /* project directory pathname */
                    291:        char *ptp;                      /* path to parent project */
                    292:        SLIST *pdirtyp;                 /* project directory type labels list */
                    293:        int dflag;                      /* project directory description flag */
                    294: {
                    295:        char *pathcat();                /* pathname concatenation */
                    296:        char *pbfndkey();               /* find key */
                    297:        char pldpath[PATHSIZE];         /* project link directory pathname */
                    298:        int closepdb();                 /* close database */
                    299:        int errpdb();                   /* print database error message */
                    300:        int pbaddflag();                /* add flag field */
                    301:        int pbaddkey();                 /* add key */
                    302:        int pbaddstring();              /* add string field */
                    303:        int pgetent();                  /* load database entry into buffer */
                    304:        int pputent();                  /* write buffer to database */
                    305:        PDB *openpdb();                 /* open database */
                    306:        PDB *pldp;                      /* project link directory stream */
                    307:        void pbclear();                 /* clear buffer */
                    308:        void resetpdb();                /* reset current database pointer */
                    309:        void pbadddesc();               /* add project directory description */
                    310:        void pbaddtyp();                /* add type labels to buffer */
                    311: 
                    312:        if (FILEXIST(pathcat(pldpath, pathname, PLDNAME)))
                    313:                {
                    314:                if ((pldp = openpdb(PLDNAME, pathname, "rw")) == NULL)
                    315:                        return(errpdb((PDB *) NULL));
                    316:                while (pgetent(pldp) != EOF)
                    317:                        {
                    318:                        if (pbfndkey(CURPROJECT) != NULL)
                    319:                                {
                    320:                                pbaddtyp(ppathname, pdirtyp);
                    321:                                if (dflag == YES)
                    322:                                        pbadddesc(ppathname);
                    323:                                }
                    324:                        else if (pbfndkey(PARENTPROJECT) != NULL)
                    325:                                pbaddstring(PDIRPATH, ptp);
                    326:                        pputent(pldp);
                    327:                        }
                    328:                }
                    329:        else    {
                    330:                if ((pldp = openpdb(PLDNAME, pathname, "w")) == NULL)
                    331:                        return(errpdb((PDB *) NULL));
                    332: 
                    333:                /* create current project entry */
                    334:                resetpdb(pldp);
                    335:                pbclear();
                    336:                pbaddkey(CURPROJECT);
                    337:                pbaddflag(PROOTDIR);
                    338:                pbaddstring(PDIRPATH, CURDIR);
                    339:                pbaddtyp(ppathname, pdirtyp);
                    340:                if (dflag == YES)
                    341:                        pbadddesc(ppathname);
                    342:                else
                    343:                        pbaddstring(PDIRDESC, "");
                    344:                pputent(pldp);
                    345: 
                    346:                /* create parent project entry */
                    347:                pbclear();
                    348:                pbaddkey(PARENTPROJECT);
                    349:                pbaddflag(PROOTDIR);
                    350:                pbaddstring(PDIRPATH, ptp);
                    351:                pputent(pldp);
                    352:                }
                    353:        return(closepdb(pldp));
                    354: }
                    355: 
                    356: 
                    357: 
                    358: /*
                    359:  * mkproject() makes a project root directory.
                    360:  */
                    361: mkproject(ppathname, alias, pdirtyp, dflag, pb)
                    362:        char *ppathname;                /* project root directory pathname */
                    363:        char *alias;                    /* alternative project directory name */
                    364:        int dflag;                      /* project directory description flag */
                    365:        SLIST *pdirtyp;                 /* project directory type labels list */
                    366:        PATH *pb;                       /* pathname struct buffer */
                    367: {
                    368:        char apathname[PATHSIZE];       /* absolute regular pathname */
                    369:        char *mkalias();                /* construct alias from pathname */
                    370:        char *mkptp();                  /* make path to parent project */
                    371:        char *optpath();                /* optimize pathname */
                    372:        char *pathcat();                /* pathname concatenation */
                    373:        char *pbfndkey();               /* find database key */
                    374:        char *rdp;                      /* relative project directory path */
                    375:        char rpathname[PATHSIZE];       /* project root directory pathname */
                    376:        char *strcpy();                 /* string copy */
                    377:        char *xorpath();                /* remove subpathname */
                    378:        int _closepdb();                /* close database without updating */
                    379:        int closepdb();                 /* close database */
                    380:        int errpdb();                   /* print database error message */
                    381:        int mkpld();                    /* make project link directory */
                    382:        int mkrootproject();            /* make root project root directory */
                    383:        int pbaddflag();                /* add flag field */
                    384:        int pbaddkey();                 /* add key */
                    385:        int pbaddstring();              /* add string field */
                    386:        int pgetent();                  /* load next entry into buffer */
                    387:        int pputent();                  /* write buffer to database */
                    388:        PDB *openpdb();                 /* open database */
                    389:        PDB *pldp;                      /* project link directory stream */
                    390:        void pbadddesc();               /* add project directory description */
                    391:        void pbclear();                 /* clear buffer */
                    392: 
                    393:        switch (pb->p_mode & P_IFMT)
                    394:                {
                    395:                case P_IFNEW:
                    396:                case P_IFREG:
                    397:                        break;
                    398:                case P_IFHOME:
                    399:                        return(mkrootproject(ppathname, pdirtyp, dflag, pb));
                    400:                case P_IFPDIR:
                    401:                case P_IFPROOT:
                    402:                        warn("%s exists", ppathname);
                    403:                        return(1);
                    404:                }
                    405: 
                    406:        /* create pathname relative to project root directory */
                    407:        strcpy(rpathname, pb->p_project);
                    408:        if (*pb->p_path == _RDIRC)
                    409:                {
                    410:                rdp = xorpath(rpathname, pb->p_path);
                    411:                }
                    412:        else    {
                    413:                optpath(pathcat(apathname, CWD, pb->p_path));
                    414:                rdp = xorpath(rpathname, apathname);
                    415:                }
                    416: 
                    417:        /* open project link directory */
                    418:        if ((pldp = openpdb(PLDNAME, rpathname, "rw")) == NULL)
                    419:                return(errpdb((PDB *) NULL));
                    420: 
                    421:        /*
                    422:         * check for existing aliases while preparing project link
                    423:         * directory for new entry
                    424:         */
                    425:        if (alias == NULL)
                    426:                if (EQUAL(pb->p_alias, CURDIR) || EQUAL(pb->p_alias, PARENTDIR))
                    427:                        alias = mkalias(rdp);
                    428:                else
                    429:                        alias = pb->p_alias;
                    430:        while (pgetent(pldp) != EOF)
                    431:                {
                    432:                if (pbfndkey(alias) != NULL)
                    433:                        {
                    434:                        warn("%s: %s exists", ppathname, alias);
                    435:                        _closepdb(pldp);
                    436:                        return(1);
                    437:                        }
                    438:                pputent(pldp);
                    439:                }
                    440: 
                    441:        /* make the directory if non-existent */
                    442:        if ((pb->p_mode & P_IFMT) == P_IFREG)
                    443:                {
                    444:                if ((pb->p_mode & S_IFMT) != S_IFDIR)
                    445:                        {
                    446:                        warn("%s: not a directory", ppathname);
                    447:                        _closepdb(pldp);
                    448:                        return(1);
                    449:                        }
                    450:                }
                    451:        else if (MK_DIR(pb->p_path) != 0)
                    452:                {
                    453:                _closepdb(pldp);
                    454:                return(1);
                    455:                }
                    456: 
                    457:        /* update database */
                    458:        pbclear();
                    459:        pbaddkey(alias);
                    460:        pbaddflag(PROOTDIR);
                    461:        pbaddstring(PDIRPATH, rdp);
                    462:        pputent(pldp);
                    463:        if (mkpld(pb->p_path, ppathname, mkptp(rpathname, rdp), pdirtyp, dflag) != 0)
                    464:                {
                    465:                _closepdb(pldp);
                    466:                return(1);
                    467:                }
                    468:        return(closepdb(pldp));
                    469: }
                    470: 
                    471: 
                    472: 
                    473: /*
                    474:  * mkptp() returns a pathname to the parent project root directory.
                    475:  * It attempts to create a relative pathname if possible, otherwise
                    476:  * the parent root directory pathname is used.
                    477:  */
                    478: char *
                    479: mkptp(rpathname, rdp)
                    480:        char *rpathname;                /* parent project root directory */
                    481:        register char *rdp;             /* pathname to project being created */
                    482: {
                    483:        register char *rp;              /* parent project root directory ptr */
                    484:        char *strpcpy();                /* string copy and update pointer */
                    485: 
                    486:        if (*rdp == _RDIRC)
                    487:                return(rpathname);
                    488:        for(rp = rpathname; *rdp != '\0'; rdp++)
                    489:                if (*rdp == _PSC)
                    490:                        rp = strpcpy(strpcpy(rp, PARENTDIR), PATHSEP);
                    491:        rp = strpcpy(rp, PARENTDIR);
                    492:        return(rpathname);
                    493: }
                    494: 
                    495: 
                    496: 
                    497: /*
                    498:  * mkrootproject creates a project link directory in the user's home
                    499:  * directory. Returns zero if successful, otherwise 1.
                    500:  */
                    501: mkrootproject(ppathname, pdirtyp, dflag, pb)
                    502:        char *ppathname;                /* project pathname */
                    503:        SLIST *pdirtyp;                 /* project directory type labels list */
                    504:        int dflag;                      /* project directory description flag */
                    505:        PATH *pb;                       /* pathname struct buffer */
                    506: {
                    507:        char *pathcat();                /* pathname concatenation */
                    508:        char pldpath[PATHSIZE];         /* project link directory pathname */
                    509:        int mkpld();                    /* make a project link directory */
                    510:        
                    511:        if (FILEXIST(pathcat(pldpath, pb->p_path, PLDNAME)))
                    512:                {
                    513:                warn("%s exists", ppathname);
                    514:                return(1);
                    515:                }
                    516:        return(mkpld(pb->p_path, ROOTPROJECT, CURDIR, pdirtyp, dflag));
                    517: }
                    518: 
                    519: 
                    520: 
                    521: /*
                    522:  * onintr() resets interrupt, quit, and hangup signals, and sets a flag
                    523:  * which advises the process to exit at the first opportunity.
                    524:  */
                    525: onintr()
                    526: {
                    527:        signal(SIGINT, onintr);
                    528:        signal(SIGQUIT, onintr);
                    529:        signal(SIGHUP, onintr);
                    530: 
                    531:        WANT_TO_EXIT = 1;
                    532: }
                    533: 
                    534: 
                    535: 
                    536: /*
                    537:  * pbadddesc() fetchs a project directory description from stdin and
                    538:  * adds to database buffer.
                    539:  */
                    540: void
                    541: pbadddesc(ppathname)
                    542:        char *ppathname;                /* project directory pathname */
                    543: {
                    544:        char dirdesc[DIRDESCSIZE];      /* project directory description */
                    545:        char *gets();                   /* get a line from stdin */
                    546:        int pbaddstring();              /* add string field */
                    547: 
                    548:        printf("%s: description? (1 line): ", ppathname);
                    549:        gets(dirdesc);
                    550:        pbaddstring(PDIRDESC, dirdesc);
                    551: }
                    552: 
                    553: 
                    554: 
                    555: 
                    556: /*
                    557:  * pbaddtyp() adds type labels to database buffer.
                    558:  */
                    559: void
                    560: pbaddtyp(ppathname, typlist)
                    561:        char *ppathname;                /* project pathname */
                    562:        SLIST *typlist;                 /* type labels list */
                    563: {
                    564:        char *pbgetstring();            /* get specified string field */
                    565:        char *pdtfind();                /* find type label in buffer */
                    566:        char *pfxcpy();                 /* copy string prefix */
                    567:        char *slget();                  /* get next key from list */
                    568:        char *tp;                       /* pointer to type label */
                    569:        char type[TYPESIZE];            /* type label buffer */
                    570:        char typbuf[TYPBUFSIZE];        /* project directory types buffer */
                    571:        int pbaddstring();              /* add string field */
                    572:        void pdtinsert();               /* insert type label */
                    573:        void slrewind();                /* rewind list */
                    574: 
                    575:        pbgetstring(PDIRTYPE, typbuf);
                    576:        slrewind(typlist);
                    577:        while ((tp = slget(typlist)) != NULL)
                    578:                {
                    579:                if (pdtfind(pfxcpy(type, tp), typbuf) == NULL)
                    580:                        pdtinsert(tp, typbuf);
                    581:                else
                    582:                        warn("%s: \"%s\" type label exists", ppathname, type);
                    583:                }
                    584:        pbaddstring(PDIRTYPE, typbuf);
                    585: }
                    586: 
                    587: 
                    588: 
                    589: /*
                    590:  * typargtolist() prepends comma-separated type labels specified in typarg
                    591:  * to typlist. Returns NO if type labels are badly formatted, otherwise
                    592:  * YES.
                    593:  */
                    594: typargtolist(typarg, typlist)
                    595:        register char *typarg;          /* type labels argument */
                    596:        SLIST *typlist;                 /* type labels list */
                    597: {
                    598:        register char *t;               /* type label argument pointer */
                    599:        char *slprepend();              /* prepend singly-linked list key */
                    600:        int ispdt();                    /* is project dir type label legal? */
                    601:        int status = YES;               /* return status */
                    602:        void badtyp();                  /* print bad type label message */
                    603: 
                    604:        for (t = typarg; *t != '\0'; t++)
                    605:                continue;
                    606:        for (; t >= typarg; t--)
                    607:                if (t[0] == ',')
                    608:                        {
                    609:                        if (t[1] != '\0')
                    610:                                if (ispdt(t+1))
                    611:                                        slprepend(t+1, typlist);
                    612:                                else    {
                    613:                                        badtyp(t+1);
                    614:                                        status = NO;
                    615:                                        }
                    616:                        t[0] = '\0';
                    617:                        }
                    618:        if (ispdt(typarg))
                    619:                slprepend(typarg, typlist);
                    620:        else    {
                    621:                badtyp(typarg);
                    622:                status = NO;
                    623:                }
                    624:        return(status);
                    625: }

unix.superglobalmegacorp.com

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