Stuf
authorEric Andersen <andersen@codepoet.org>
Tue, 9 Nov 1999 01:51:02 +0000 (01:51 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 9 Nov 1999 01:51:02 +0000 (01:51 -0000)
Changelog
utility.c

index 750768b61c7e9187cd6a0c307ce2a54bc802ca6b..8d141277315e29a52a71c1f29c4230ae913620e1 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -7,6 +7,7 @@
            thanks to Eric Delaunay.
        * more started to read from stdin after the last file was finished, and 
            options were not parsed correctly (fix thanks to Eric Delaunay).
+       * more will now use the terminal size if BB_FEATURE_AUTOWIDTH is on.
        * rm wouldn't remove a symlink unless the symlink was valid.  This was
            a side effect of the busybox 0.32 recursiveAction() fix.  Things 
            should now work correctly.
index 59ac36197a7bed4f5b2423e726ae8399565a4303..cdf027a029f5628d69b2e5b2c9f493b2d1f5a3b5 100644 (file)
--- a/utility.c
+++ b/utility.c
@@ -236,7 +236,30 @@ copyFile( const char *srcName, const char *destName,
 
 
 
-#ifdef BB_TAR
+#if defined BB_TAR || defined BB_LS
+
+#define TYPEINDEX(mode) (((mode) >> 12) & 0x0f)
+#define TYPECHAR(mode)  ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)])
+
+/* The special bits. If set, display SMODE0/1 instead of MODE0/1 */
+static const mode_t SBIT[] = {
+    0, 0, S_ISUID,
+    0, 0, S_ISGID,
+    0, 0, S_ISVTX
+};
+
+/* The 9 mode bits to test */
+static const mode_t MBIT[] = {
+    S_IRUSR, S_IWUSR, S_IXUSR,
+    S_IRGRP, S_IWGRP, S_IXGRP,
+    S_IROTH, S_IWOTH, S_IXOTH
+};
+
+#define MODE1  "rwxrwxrwx"
+#define MODE0  "---------"
+#define SMODE1 "..s..s..t"
+#define SMODE0 "..S..S..T"
+
 /*
  * Return the standard ls-like mode string from a file mode.
  * This is static and so is overwritten on each call.
@@ -245,64 +268,25 @@ const char *modeString(int mode)
 {
     static char buf[12];
 
-    strcpy(buf, "----------");
-
-    /*
-     * Fill in the file type.
-     */
-    if (S_ISDIR(mode))
-       buf[0] = 'd';
-    if (S_ISCHR(mode))
-       buf[0] = 'c';
-    if (S_ISBLK(mode))
-       buf[0] = 'b';
-    if (S_ISFIFO(mode))
-       buf[0] = 'p';
-    if (S_ISLNK(mode))
-       buf[0] = 'l';
-    if (S_ISSOCK(mode))
-       buf[0] = 's';
-    /*
-     * Now fill in the normal file permissions.
-     */
-    if (mode & S_IRUSR)
-       buf[1] = 'r';
-    if (mode & S_IWUSR)
-       buf[2] = 'w';
-    if (mode & S_IXUSR)
-       buf[3] = 'x';
-    if (mode & S_IRGRP)
-       buf[4] = 'r';
-    if (mode & S_IWGRP)
-       buf[5] = 'w';
-    if (mode & S_IXGRP)
-       buf[6] = 'x';
-    if (mode & S_IROTH)
-       buf[7] = 'r';
-    if (mode & S_IWOTH)
-       buf[8] = 'w';
-    if (mode & S_IXOTH)
-       buf[9] = 'x';
-
-    /*
-     * Finally fill in magic stuff like suid and sticky text.
-     */
-    if (mode & S_ISUID)
-       buf[3] = ((mode & S_IXUSR) ? 's' : 'S');
-    if (mode & S_ISGID)
-       buf[6] = ((mode & S_IXGRP) ? 's' : 'S');
-    if (mode & S_ISVTX)
-       buf[9] = ((mode & S_IXOTH) ? 't' : 'T');
-
+    int i;
+    buf[0] = TYPECHAR(mode);
+    for (i=0; i<9; i++) {
+       if (mode & SBIT[i])
+           buf[i+1] = (mode & MBIT[i])? 
+               SMODE1[i] : SMODE0[i];
+       else
+           buf[i+1] = (mode & MBIT[i])? 
+               MODE1[i] : MODE0[i];
+    }
     return buf;
 }
+#endif
 
 
+#ifdef BB_TAR
 /*
- * Get the time string to be used for a file.
- * This is down to the minute for new files, but only the date for old files.
- * The string is returned from a static buffer, and so is overwritten for
- * each call.
+ * Return the standard ls-like time string from a time_t
+ * This is static and so is overwritten on each call.
  */
 const char *timeString(time_t timeVal)
 {
@@ -325,7 +309,6 @@ const char *timeString(time_t timeVal)
     return buf;
 }
 
-
 /*
  * Write all of the supplied buffer out to a file.
  * This does multiple writes as necessary.