Annotation of 43BSD/contrib/spms/src/bin/pfind/Pfind.c, revision 1.1.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.