Annotation of 43BSD/contrib/spms/src/bin/pfind/Pfind.c, revision 1.1

1.1     ! root        1: static char *rcsid = "$Header$";
        !             2: /*
        !             3:  * pfind - find files in projects
        !             4:  *
        !             5:  * Author: Peter J. Nicklin
        !             6:  */
        !             7: #include <sys/types.h>
        !             8: #include <sys/dir.h>
        !             9: #include <stdio.h>
        !            10: #include "getarg.h"
        !            11: #include "macro.h"
        !            12: #include "null.h"
        !            13: #include "path.h"
        !            14: #include "pdb.h"
        !            15: #include "pdtyp.h"
        !            16: #include "pld.h"
        !            17: #include "slslist.h"
        !            18: #include "spms.h"
        !            19: #include "yesno.h"
        !            20: 
        !            21: char *PGN = "pfind";                   /* program name */
        !            22: int LONGFORMAT = 0;                    /* absolute regular pathname of file? */
        !            23: PDTYP PDIRTYP;                         /* project directory type labels list */
        !            24: 
        !            25: main(argc, argv)
        !            26:        int argc;
        !            27:        char **argv;
        !            28: {
        !            29:        extern int PPDEBUG;             /* project pathname debug flag */
        !            30:        char *getcwp();                 /* get current working project */
        !            31:        char *ppathname = NULL;         /* project pathname */
        !            32:        int dirsearch();                /* search a directory for files */
        !            33:        int pdtparse();                 /* parse boolean type label expr */
        !            34:        int projectsearch();            /* search a project for files */
        !            35:        int status = 0;                 /* exit status */
        !            36:        int xppath();                   /* expand project pathname */
        !            37:        PATH pathbuf;                   /* pathname struct buffer */
        !            38:        void bininit();                 /* initialize args for binary search */
        !            39: 
        !            40:        {
        !            41:        register char *s;               /* option pointer */
        !            42:        while (--argc > 0 && **++argv == '-')
        !            43:                {
        !            44:                for (s = argv[0]+1; *s != '\0'; s++)
        !            45:                        switch (*s)
        !            46:                                {
        !            47:                                case 'D':
        !            48:                                        PPDEBUG = YES;
        !            49:                                        break;
        !            50:                                case 'P':
        !            51:                                        ppathname = GETARG(s);
        !            52:                                        if (*ppathname == '\0')
        !            53:                                                {
        !            54:                                                warn("missing project name");
        !            55:                                                status = 1;
        !            56:                                                }
        !            57:                                        goto endfor;
        !            58:                                case 'T':
        !            59:                                        if (pdtparse(GETARG(s), &PDIRTYP) == NO)
        !            60:                                                status = 1;
        !            61:                                        goto endfor;
        !            62:                                case 'l':
        !            63:                                        LONGFORMAT++;
        !            64:                                        break;
        !            65:                                default:
        !            66:                                        warn("bad option -%c", *s);
        !            67:                                        status = 1;
        !            68:                                        goto endfor;
        !            69:                                }
        !            70:                endfor: continue;
        !            71:                }
        !            72:        }
        !            73:        if (status == 1 || argc < 1)
        !            74:                fatal("usage: pfind [-l] [-P pdirname] [-T typexpr] file ...");
        !            75: 
        !            76:        if (ppathname == NULL)
        !            77:                {
        !            78:                if (getcwp() == NULL)
        !            79:                        fatal("no project environment");
        !            80:                ppathname = CURPROJECT;
        !            81:                }
        !            82: 
        !            83:        /* initialize arguments for binary searching */
        !            84:        bininit(argc, argv);
        !            85: 
        !            86:        /*
        !            87:         * convert project pathname to regular pathname and search
        !            88:         * project or directory.
        !            89:         */
        !            90:         if (xppath(ppathname, &pathbuf) == -1)
        !            91:                {
        !            92:                patherr(ppathname);
        !            93:                exit(1);
        !            94:                }
        !            95:        switch (pathbuf.p_mode & P_IFMT)
        !            96:                {
        !            97:                case P_IFNEW:
        !            98:                case P_IFREG:
        !            99:                        fatal("%s: no such project or project directory", ppathname);
        !           100:                case P_IFPDIR:
        !           101:                        status |= dirsearch(ppathname, pathbuf.p_path);
        !           102:                        break;
        !           103:                case P_IFHOME:
        !           104:                case P_IFPROOT:
        !           105:                        status |= projectsearch(ppathname, pathbuf.p_path);
        !           106:                        break;
        !           107:                }
        !           108:        exit(status);
        !           109: }
        !           110: 
        !           111: 
        !           112: 
        !           113: /*
        !           114:  * dirsearch() searches a directory for filenames. Returns 1 if can't
        !           115:  * open directory, otherwise 0.
        !           116:  */
        !           117: dirsearch(ppathname, pathname)
        !           118:        char *ppathname;                /* project pathname */
        !           119:        char *pathname;                 /* directory pathname */
        !           120: {
        !           121:        DIR *dirp;                      /* directory stream */
        !           122:        DIR *opendir();                 /* open directory stream */
        !           123:        int binsearch();                /* binary search */
        !           124:        struct direct *dp;              /* directory entry pointer */
        !           125:        struct direct *readdir();       /* read a directory entry */
        !           126: 
        !           127:        if ((dirp = opendir(pathname)) == NULL)
        !           128:                {
        !           129:                warn("can't open %s", pathname);
        !           130:                return(1);
        !           131:                }
        !           132:        for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
        !           133:                if (binsearch(dp->d_name) == YES)
        !           134:                        if (LONGFORMAT)
        !           135:                                printf("%s/%s\n", pathname, dp->d_name);
        !           136:                        else
        !           137:                                printf("%s/%s\n", ppathname, dp->d_name);
        !           138:        closedir(dirp);
        !           139:        return(0);
        !           140: }
        !           141: 
        !           142: 
        !           143: 
        !           144: /*
        !           145:  * projectsearch() searches a project for specified filenames.
        !           146:  */
        !           147: projectsearch(ppathname, pathname)
        !           148:        char *ppathname;                /* project pathname */
        !           149:        char *pathname;                 /* project root directory pathname */
        !           150: {
        !           151:        char ppathbuf[PPATHSIZE];       /* project pathname buffer */
        !           152:        char *ppathcat();               /* project pathname concatenation */
        !           153:        char *slsprepend();             /* append key+string */
        !           154:        int closepdb();                 /* close database */
        !           155:        int dirsearch();                /* search a directory for files */
        !           156:        int errpdb();                   /* print database error message */
        !           157:        int pdtmatch();                 /* match project dir type label expr */
        !           158:        int status = 0;                 /* return status */
        !           159:        PATH *pd;                       /* pathname struct pointer */
        !           160:        PATH *readpld();                /* read project link directory entry */
        !           161:        PDB *openpdb();                 /* open database */
        !           162:        PDB *pldp;                      /* project link directory stream */
        !           163:        SLSBLK *pblk;                   /* project list block */
        !           164:        SLSLIST *plist;                 /* project list */
        !           165:        SLSLIST *slsinit();             /* initialize key+string list */
        !           166:        void slsrm();                   /* remove key+string list */
        !           167: 
        !           168:        plist = slsinit();
        !           169: 
        !           170:        /* read PLDNAME project link directory */
        !           171:        if ((pldp = openpdb(PLDNAME, pathname, "r")) == NULL)
        !           172:                return(errpdb((PDB *) NULL));
        !           173:        while ((pd = readpld(pldp)) != NULL)
        !           174:                {
        !           175:                if (EQUAL(pd->p_alias, PARENTPROJECT))
        !           176:                        continue;
        !           177:                else if (EQUAL(pd->p_alias, CURPROJECT))
        !           178:                        {
        !           179:                        if (PDIRTYP.pfxsize==0 || pdtmatch(&PDIRTYP,pd->p_type)==YES)
        !           180:                                status |= dirsearch(ppathname, pd->p_path);
        !           181:                        }
        !           182:                else if (pd->p_mode == P_IFPROOT)
        !           183:                        {
        !           184:                        if (slsprepend(pd->p_alias, pd->p_path, plist) == NULL)
        !           185:                                exit(1);
        !           186:                        }
        !           187:                else if (PDIRTYP.pfxsize==0 || pdtmatch(&PDIRTYP,pd->p_type)==YES)
        !           188:                        {
        !           189:                        ppathcat(ppathbuf, ppathname, pd->p_alias);
        !           190:                        status |= dirsearch(ppathbuf, pd->p_path);
        !           191:                        }
        !           192:                }
        !           193:        status |= closepdb(pldp);
        !           194: 
        !           195:        for (pblk = plist->head; pblk != NULL; pblk = pblk->next)
        !           196:                {
        !           197:                ppathcat(ppathbuf, ppathname,  pblk->key);
        !           198:                status |= projectsearch(ppathbuf, pblk->string);
        !           199:                }
        !           200:        slsrm(CNULL, plist);
        !           201: 
        !           202:        return(status);
        !           203: }

unix.superglobalmegacorp.com

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