Annotation of 43BSDTahoe/new/jove/scandir.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************
                      2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
                      3:  * is provided to you without charge, and with no warranty.  You may give  *
                      4:  * away copies of JOVE, including sources, provided that this notice is    *
                      5:  * included in all the files.                                              *
                      6:  ***************************************************************************/
                      7: 
                      8: #include "jove.h"
                      9: 
                     10: #ifdef F_COMPLETION
                     11: 
                     12: #ifdef MSDOS
                     13: # include <dos.h>
                     14: # include <search.h>
                     15: #endif
                     16: 
                     17: #ifdef UNIX
                     18: # include <sys/stat.h>
                     19: # ifdef M_XENIX
                     20: #  include <sys/ndir.h>
                     21: # else
                     22: #  include <sys/dir.h>
                     23: # endif /* M_XENIX */
                     24: #endif
                     25: 
                     26: #ifdef UNIX
                     27: 
                     28: #if defined(BSD4_2) || defined(M_XENIX)
                     29: # define DIRSIZE(entry)        DIRSIZ(entry)
                     30: #else
                     31: # define DIRSIZE(entry)        (entry->d_name[DIRSIZ-1]=='\0' ? strlen(entry->d_name) : DIRSIZ)
                     32: 
                     33: typedef struct {
                     34:        int     d_fd;           /* File descriptor for this directory */
                     35: } DIR;
                     36: 
                     37: DIR *
                     38: opendir(dir)
                     39: char   *dir;
                     40: {
                     41:        DIR     *dp = (DIR *) malloc(sizeof *dp);
                     42:        struct stat     stbuf;
                     43: 
                     44:        if ((dp->d_fd = open(dir, 0)) == -1)
                     45:                return 0;
                     46:        if ((fstat(dp->d_fd, &stbuf) == -1) || !(stbuf.st_mode & S_IFDIR)) {
                     47:                closedir(dp);
                     48:                return 0;       /* this isn't a directory! */
                     49:        }
                     50:        return dp;
                     51: }
                     52: 
                     53: closedir(dp)
                     54: DIR    *dp;
                     55: {
                     56:        (void) close(dp->d_fd);
                     57:        free((char *) dp);
                     58: }
                     59: 
                     60: struct direct *
                     61: readdir(dp)
                     62: DIR    *dp;
                     63: {
                     64:        static struct direct    dir;
                     65: 
                     66:        do
                     67:                if (read(dp->d_fd, &dir, sizeof dir) != sizeof dir)
                     68:                        return 0;
                     69: #if defined(elxsi) && defined(SYSV)
                     70:        /*
                     71:         * Elxsi has a BSD4.2 implementation which may or may not use
                     72:         * `twisted inodes' ...  Anyone able to check?
                     73:         */
                     74:        while (*(unsigned short *)&dir.d_ino == 0);
                     75: #else
                     76:        while (dir.d_ino == 0);
                     77: #endif
                     78: 
                     79:        return &dir;
                     80: }
                     81: 
                     82: #endif /* BSD4_2 */
                     83: 
                     84: /* Scandir returns the number of entries or -1 if the directory cannoot
                     85:    be opened or malloc fails. */
                     86: 
                     87: int
                     88: scandir(dir, nmptr, qualify, sorter)
                     89: char   *dir;
                     90: char   ***nmptr;
                     91: int    (*qualify)();
                     92: int    (*sorter)();
                     93: {
                     94:        DIR     *dirp;
                     95:        struct direct   *entry;
                     96:        char    **ourarray;
                     97:        unsigned int    nalloc = 10,
                     98:                        nentries = 0;
                     99: 
                    100:        if ((dirp = opendir(dir)) == 0)
                    101:                return -1;
                    102:        if ((ourarray = (char **) malloc(nalloc * sizeof (char *))) == 0)
                    103: memfail:       complain("[Malloc failed: cannot scandir]");
                    104:        while ((entry = readdir(dirp)) != 0) {
                    105:                if (qualify != 0 && (*qualify)(entry->d_name) == 0)
                    106:                        continue;
                    107:                if (nentries == nalloc) {
                    108:                        ourarray = (char **) realloc((char *) ourarray, (nalloc += 10) * sizeof (char *));
                    109:                        if (ourarray == 0)
                    110:                                goto memfail;
                    111:                }
                    112:                ourarray[nentries] = (char *) malloc(DIRSIZE(entry) + 1);
                    113:                null_ncpy(ourarray[nentries], entry->d_name, (int) DIRSIZE(entry));
                    114:                nentries += 1;
                    115:        }
                    116:        closedir(dirp);
                    117:        if ((nentries + 1) != nalloc)
                    118:                ourarray = (char **) realloc((char *) ourarray,
                    119:                                        ((nentries + 1) * sizeof (char *)));
                    120:        if (sorter != 0)
                    121:                qsort((char *) ourarray, nentries, sizeof (char **), sorter);
                    122:        *nmptr = ourarray;
                    123:        ourarray[nentries] = 0;         /* guaranteed 0 pointer */
                    124: 
                    125:        return nentries;
                    126: }
                    127: 
                    128: #endif /* UNIX */
                    129: 
                    130: #ifdef MSDOS
                    131: # define DIRSIZ        13
                    132: # define DIRSIZE(entry)        strlen(entry.name)
                    133: 
                    134: /* Scandir returns the number of entries or -1 if the directory cannoot
                    135:    be opened or malloc fails. */
                    136: 
                    137: unsigned int fmask = _A_NORMAL|_A_RDONLY|_A_HIDDEN|_A_SUBDIR;
                    138: 
                    139: int
                    140: scandir(dir, nmptr, qualify, sorter)
                    141: char   *dir;
                    142: char   ***nmptr;
                    143: int    (*qualify)();
                    144: int    (*sorter)();
                    145: {
                    146:        char dirname[FILESIZE];
                    147:        struct find_t entry;
                    148:        char *ptr;
                    149:        char    **ourarray;
                    150:        unsigned int    nalloc = 10,
                    151:                        nentries = 0;
                    152: 
                    153:        strcpy(dirname, dir);
                    154:        ptr = &dirname[strlen(dirname)-1];
                    155:        if ((dirname[1] == ':' && !dirname[2]) || (*ptr == '/') || (*ptr == '\\'))
                    156:           strcat(dirname, "*.*");
                    157:        else
                    158:           strcat(dirname, "/*.*");
                    159: 
                    160:        if (_dos_findfirst(dirname, fmask, &entry))
                    161:           return -1;
                    162:        if ((ourarray = (char **) malloc(nalloc * sizeof (char *))) == 0)
                    163: memfail:       complain("[Malloc failed: cannot scandir]");
                    164:        do  {
                    165:                if ((fmask == 0x10) && !(entry.attrib&fmask))
                    166:                        goto skip;
                    167:                strlwr(entry.name);
                    168:                if (qualify != (int (*)())0 && (*qualify)(entry.name) == 0)
                    169:                        goto skip;
                    170:                if (nentries == nalloc) {
                    171:                        ourarray = (char **) realloc((char *) ourarray, (nalloc += 10) * sizeof (char *));
                    172:                        if (ourarray == 0)
                    173:                                goto memfail;
                    174:                }
                    175:                ourarray[nentries] = (char *) malloc(DIRSIZE(entry) + 1);
                    176:                null_ncpy(ourarray[nentries], entry.name, (int) DIRSIZE(entry));
                    177:                nentries++;
                    178: skip:  ;
                    179:     }
                    180:     while (_dos_findnext(&entry) == 0);
                    181: 
                    182:        if ((nentries + 1) != nalloc)
                    183:                ourarray = (char **) realloc((char *) ourarray,
                    184:                                        ((nentries + 1) * sizeof (char *)));
                    185:        if (sorter != (int (*)())0)
                    186:                qsort((char *) ourarray, nentries, sizeof (char **), sorter);
                    187:        *nmptr = ourarray;
                    188:        ourarray[nentries] = 0;         /* guaranteed 0 pointer */
                    189: 
                    190:        return nentries;
                    191: }
                    192: 
                    193: #endif /* MSDOS */
                    194: 
                    195: void
                    196: freedir(nmptr, nentries)
                    197: char   ***nmptr;
                    198: {
                    199:        char    **ourarray = *nmptr;
                    200: 
                    201:        while (--nentries >= 0)
                    202:                free(*ourarray++);
                    203:        free((char *) *nmptr);
                    204:        *nmptr = 0;
                    205: }
                    206: 
                    207: int
                    208: alphacomp(a, b)
                    209: char   **a,
                    210:        **b;
                    211: {
                    212:        return strcmp(*a, *b);
                    213: }
                    214: #endif

unix.superglobalmegacorp.com

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