On Sun, 1 Aug 1999, Keith Stevenson wrote:

> the features that were requested.  I honestly haven't figured out how to
> implement the display of selected fields yet.  I realize that this isn't a

Attached is a diff that takes care of that.  Basically, the user can
specify a format that looks like "%f\t%U\t%A" to get the files name, the
username of the owner, and the last access time seperated by tabs
followed by a new line. All of the supported format specifiers are
documented in the man page. I looked around for another version of stat
that does this but could not locate one; therefore the format specifiers
are what made sense to me.  There is also limited support for C-style
escape sequences (no \nnn).

Have a nice day!

Jamie




diff -c stat/stat.1 stat-jph/stat.1
*** stat/stat.1 Sun Aug  1 23:18:48 1999
--- stat-jph/stat.1     Sun Aug  1 23:50:31 1999
***************
*** 42,71 ****
  The options are as follows:
  .Bl -tag -width Fl
  .It Fl d
! dereference symlinks
  .It Fl f
! read filenames to be stat-ed from file ( - means stdin)
  .It Fl g
! show time elements in GMT time zone.  (implies -s)
  .It Fl h
! print usage summary
  .It Fl i
! ignore errors
  .It Fl l
! display one element per line
  .It Fl s
! print mode, uid, gid, and times as strings
  .It Fl t
! terse output
  .It Fl o Ar opts
! output only selected elements of struct stat
  .It Fl f Ar file
! read filenames to be stat-ed from file ( - means stdin)
  .El
  .Sh EXAMPLES
  An example or two will go here
  .Pp
  .Sh SEE ALSO
  .Xr stat 2
  .Rs
  .Sh AUTHORS
--- 42,107 ----
  The options are as follows:
  .Bl -tag -width Fl
  .It Fl d
! Follow symbolic links.
  .It Fl f
! Read filenames to be stat-ed from file ( - means stdin).
  .It Fl g
! Show time elements in GMT time zone.  (implies -s)
  .It Fl h
! Print usage summary.
  .It Fl i
! Ignore errors.
  .It Fl l
! Display one element per line.
  .It Fl s
! Print mode, uid, gid, and times as strings.
  .It Fl t
! Terse output.
  .It Fl o Ar opts
! Output only selected elements of struct stat.  The following
! formatting tags are permitted:
! .Bl -tag -width Fl
! .It Ar %A
! last access time
! .It Ar %C
! file creation time
! .It Ar %G
! file group (group name)
! .It Ar %M
! last modify time
! .It Ar %P
! file permission mode (symbolic)
! .It Ar %U
! file owner (username)
! .It Ar %b
! blocks allocated for file
! .It Ar %d
! device file is on
! .It Ar %f 
! file name
! .It Ar %g
! file group (gid)
! .It Ar %i
! inode
! .It Ar %l
! number of hard links to file
! .It Ar %p
! file permission mode (octal)
! .It Ar %s
! file size in blocks 
! .It Ar %t 
! type of file
! .It Ar %u
! file owner (uid)
! .El
  .It Fl f Ar file
! Read filenames to be stat-ed from file ( - means stdin).
  .El
  .Sh EXAMPLES
  An example or two will go here
  .Pp
  .Sh SEE ALSO
+ .Xr ls 1 ,
  .Xr stat 2
  .Rs
  .Sh AUTHORS
***************
*** 73,76 ****
  .Sh DIAGNOSTICS
  Most errors are the result of bad filenames.
  .Sh BUGS
! Some features (-f, -i, & -o) are currently unimplemented
--- 109,112 ----
  .Sh DIAGNOSTICS
  Most errors are the result of bad filenames.
  .Sh BUGS
! Some features (-f and -i) are currently unimplemented
diff -c stat/stat.c stat-jph/stat.c
*** stat/stat.c Sun Aug  1 23:17:14 1999
--- stat-jph/stat.c     Sun Aug  1 23:34:29 1999
***************
*** 57,62 ****
--- 57,65 ----
  void terseprint(const char*, const char*, const char*, const char*,
                struct stat*, struct group*, struct passwd*, struct tm*,
                struct tm*, struct tm*, int);
+ void customprint(const char *, const char*, const char*, const char*, 
+                const char*, struct stat*, struct group*, struct passwd*, 
+                struct tm*, struct tm*, struct tm*, int);
  int vstat(const char*, struct stat*, int);
  
  
***************
*** 78,85 ****
        struct stat     inode;
        struct tm       *atime, *mtime, *ctime;
  
!       extern char     *optarg;
!       extern int      optind;
  
  
        /* flags */
--- 81,87 ----
        struct stat     inode;
        struct tm       *atime, *mtime, *ctime;
  
!       char *oformat;
  
  
        /* flags */
***************
*** 113,122 ****
                                f_listout = 1;
                                break;
                        case 'o':
-                               printf("Unimplemented.\n");
-                               exit(EX_OK);
                                f_customout = 1;
                                f_listout = 1;
                                break;
                        case 's':
                                f_stringout = 1;
--- 115,123 ----
                                f_listout = 1;
                                break;
                        case 'o':
                                f_customout = 1;
                                f_listout = 1;
+                               oformat = optarg;
                                break;
                        case 's':
                                f_stringout = 1;
***************
*** 253,264 ****
                                strcat(fflags, " sunlnk");
  
                        /* Generate output */
!                       if ((!f_customout) && (!f_listout) && (!f_terseout)) {
                                prettyprint(argv[count], ftype, fmode, fflags,
                                    &inode, gp, pw, atime, mtime, ctime);
                        } 
!                       if (f_listout && (!f_terseout)) {
                                listprint(argv[count], ftype, fmode, fflags,
                                    &inode, gp, pw, atime, mtime, ctime,
                                    f_stringout);
                        }
--- 254,270 ----
                                strcat(fflags, " sunlnk");
  
                        /* Generate output */
!                       if ((!f_customout) && (!f_listout) && (!f_terseout) && 
(!f_customout)) {
                                prettyprint(argv[count], ftype, fmode, fflags,
                                    &inode, gp, pw, atime, mtime, ctime);
                        } 
!                       if (f_listout && (!f_terseout) && (!f_customout)) {
                                listprint(argv[count], ftype, fmode, fflags,
+                                   &inode, gp, pw, atime, mtime, ctime,
+                                   f_stringout);
+                       }
+                       if (f_customout && (!f_terseout)) {
+                               customprint(oformat, argv[count], ftype, fmode, fflags,
                                    &inode, gp, pw, atime, mtime, ctime,
                                    f_stringout);
                        }
diff -c stat/util.c stat-jph/util.c
*** stat/util.c Sun Aug  1 23:18:11 1999
--- stat-jph/util.c     Sun Aug  1 23:41:04 1999
***************
*** 205,210 ****
--- 205,326 ----
          }
  }
  
+ /* customprint: Print in a user specified format */
+ void
+ customprint(const char *fmt, const char *path, const char *ftype, 
+           const char *fmode, const char *fflags, struct stat *inode, 
+           struct group *gp, struct passwd *pw, struct tm *atime, 
+           struct tm *mtime, struct tm *ctime, int f_stringout)
+ {
+     int i, l, newline;
+     char c;
+ 
+     newline = 1;
+     l = strlen(fmt);
+     for (i = 0; i < l; i++) {
+       c = fmt[i];
+       if (c == '%') {
+           i++;
+           c = fmt[i];
+           switch (c) {
+           case 'A':
+               printf("%s", asctime(atime));
+               break;
+           case 'C':
+               printf("%s\n", asctime(ctime));
+               break;
+           case 'M':
+               printf("%s", asctime(mtime));
+               break;
+           case 'G':
+               if (gp != NULL)
+                   printf("%s", gp->gr_name);
+               break;
+           case 'P':
+               printf("%s", fmode);
+               break;
+           case 'U':
+               if (pw != NULL)
+                         printf("%s", pw->pw_name);
+               break;
+           case 'b':
+               printf("%qd", inode->st_blocks);
+               break;
+           case 'd':
+               printf("%u", inode->st_dev);
+               break;
+           case 'f':
+               printf("%s", path);
+               break;
+           case 'g':
+               printf("%hu", inode->st_gid);
+               break;
+           case 'i':
+               printf("%u", inode->st_ino);
+               break;
+           case 'l':
+               printf("%hu", inode->st_nlink);
+               break;
+           case 'p':
+                 printf("%.4o", inode->st_mode & 07777);
+               break;
+           case 's':
+               printf("%qu", inode->st_size);
+               break;
+           case 't':
+               printf("%s", ftype);
+               break;
+           case 'u':
+               printf("%hu", inode->st_uid);
+               break;
+           default:
+               printf("%c", c);
+           }
+           continue;
+       }
+ 
+       if (c == '\\') {
+           i++;
+           c = fmt[i];
+           switch (c) {
+           case 'a':
+               putchar('\a');
+               break;
+           case 'b':
+               putchar('\b');
+               break;
+           case 'c':
+               newline = 0;
+               break;
+           case 'f':
+               putchar('\f');
+               break;
+           case 'n':
+               putchar('\n');
+               break;
+           case 'r':
+               putchar('\r');
+               break;
+           case 't':
+               putchar('\t');
+               break;
+           case 'v':
+               putchar('\v');
+               break;
+           default:
+               putchar(c);
+           }
+           continue;
+       }
+       putchar(c);
+     }
+ 
+     if (newline)
+       putchar('\n');
+ 
+     return;
+ }
+ 
  
  /* vstat: Do either a stat(2) or lstat(2) depending on the value of deref */
  int



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to