- path[lnklen] = '\0';
- (void)printf(" -> %s", path);
-}
-
-namecmp(a, b)
- LS *a, *b;
-{
- return(strcmp(a->name, b->name));
-}
-
-revnamecmp(a, b)
- LS *a, *b;
-{
- return(strcmp(b->name, a->name));
-}
-
-modcmp(a, b)
- LS *a, *b;
-{
- return(a->lstat.st_mtime < b->lstat.st_mtime);
-}
-
-revmodcmp(a, b)
- LS *a, *b;
-{
- return(b->lstat.st_mtime < a->lstat.st_mtime);
-}
-
-acccmp(a, b)
- LS *a, *b;
-{
- return(a->lstat.st_atime < b->lstat.st_atime);
-}
-
-revacccmp(a, b)
- LS *a, *b;
-{
- return(b->lstat.st_atime < a->lstat.st_atime);
-}
-
-statcmp(a, b)
- LS *a, *b;
-{
- return(a->lstat.st_ctime < b->lstat.st_ctime);
-}
-
-revstatcmp(a, b)
- LS *a, *b;
-{
- return(b->lstat.st_ctime < a->lstat.st_ctime);
-}
-
-char
-*emalloc(size)
- u_int size;
-{
- char *retval, *malloc();
-
- if ((retval = malloc(size)) == NULL) {
- (void)fprintf(stderr, "ls: out of memory.\n");
- exit(1);
+ blocks = maxentry = maxlen = 0;
+ stats = NULL;
+ for (cnt = 0; dp = readdir(dirp);) {
+ /* this does -A and -a */
+ p = dp->d_name;
+ if (p[0] == '.') {
+ if (!f_listdot)
+ continue;
+ if (!f_listalldot && (!p[1] || p[1] == '.' && !p[2]))
+ continue;
+ }
+ if (cnt == maxentry) {
+ if (!maxentry)
+ *s_names = names =
+ emalloc((u_int)lp->lstat.st_size);
+#define DEFNUM 256
+ maxentry += DEFNUM;
+ if (!(*s_stats = stats = (LS *)realloc((char *)stats,
+ (u_int)maxentry * sizeof(LS))))
+ nomem();
+ }
+ if (f_needstat && lstat(dp->d_name, &stats[cnt].lstat)) {
+ (void)fprintf(stderr, "ls: %s: %s\n",
+ dp->d_name, strerror(errno));
+ if (errno == ENOENT)
+ continue;
+ exit(1);
+ }
+ stats[cnt].name = names;
+
+ if (f_nonprint)
+ prcopy(dp->d_name, names, (int)dp->d_namlen);
+ else
+ bcopy(dp->d_name, names, (int)dp->d_namlen);
+ names += dp->d_namlen;
+ *names++ = '\0';
+
+ /*
+ * get the inode from the directory, so the -f flag
+ * works right.
+ */
+ stats[cnt].lstat.st_ino = dp->d_ino;
+
+ /* save name length for -C format */
+ stats[cnt].len = dp->d_namlen;
+
+ /* calculate number of blocks if -l/-s formats */
+ if (f_longform || f_size)
+ blocks += stats[cnt].lstat.st_blocks;
+
+ /* save max length if -C format */
+ if (f_column && maxlen < (int)dp->d_namlen)
+ maxlen = dp->d_namlen;
+ ++cnt;