* mktime.c (not_equal_tm): Remove redundant check.
[gnulib.git] / lib / modechange.c
index 6fb9832..991235b 100644 (file)
@@ -1,5 +1,7 @@
 /* modechange.c -- file mode manipulation
-   Copyright (C) 1989, 1990, 1997, 1998, 1999, 2001 Free Software Foundation, Inc.
+
+   Copyright (C) 1989, 1990, 1997, 1998, 1999, 2001, 2003, 2004 Free
+   Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #include "modechange.h"
 #include <sys/stat.h>
 #include "xstrtol.h"
-
-#if STDC_HEADERS
-# include <stdlib.h>
-#else
-char *malloc ();
-#endif
-
-#ifndef NULL
-# define NULL 0
-#endif
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
 
 #if STAT_MACROS_BROKEN
 # undef S_ISDIR
@@ -194,18 +189,18 @@ mode_compile (const char *mode_string, unsigned int masked_ops)
               && S_IRGRP == RGRP && S_IWGRP == WGRP && S_IXGRP == XGRP
               && S_IROTH == ROTH && S_IWOTH == WOTH && S_IXOTH == XOTH)
              ? octal_value
-             : ((octal_value & SUID ? S_ISUID : 0)
-                | (octal_value & SGID ? S_ISGID : 0)
-                | (octal_value & SVTX ? S_ISVTX : 0)
-                | (octal_value & RUSR ? S_IRUSR : 0)
-                | (octal_value & WUSR ? S_IWUSR : 0)
-                | (octal_value & XUSR ? S_IXUSR : 0)
-                | (octal_value & RGRP ? S_IRGRP : 0)
-                | (octal_value & WGRP ? S_IWGRP : 0)
-                | (octal_value & XGRP ? S_IXGRP : 0)
-                | (octal_value & ROTH ? S_IROTH : 0)
-                | (octal_value & WOTH ? S_IWOTH : 0)
-                | (octal_value & XOTH ? S_IXOTH : 0)));
+             : (mode_t) ((octal_value & SUID ? S_ISUID : 0)
+                         | (octal_value & SGID ? S_ISGID : 0)
+                         | (octal_value & SVTX ? S_ISVTX : 0)
+                         | (octal_value & RUSR ? S_IRUSR : 0)
+                         | (octal_value & WUSR ? S_IWUSR : 0)
+                         | (octal_value & XUSR ? S_IXUSR : 0)
+                         | (octal_value & RGRP ? S_IRGRP : 0)
+                         | (octal_value & WGRP ? S_IWGRP : 0)
+                         | (octal_value & XGRP ? S_IXGRP : 0)
+                         | (octal_value & ROTH ? S_IROTH : 0)
+                         | (octal_value & WOTH ? S_IWOTH : 0)
+                         | (octal_value & XOTH ? S_IXOTH : 0)));
 
       p = make_node_op_equals (mode);
       if (p == NULL)
@@ -216,24 +211,21 @@ mode_compile (const char *mode_string, unsigned int masked_ops)
 
   umask_value = umask (0);
   umask (umask_value);         /* Restore the old value. */
-  --mode_string;
 
   /* One loop iteration for each "ugoa...=+-rwxXstugo...[=+-rwxXstugo...]". */
-  do
+  for (;; mode_string++)
     {
       /* Which bits in the mode are operated on. */
       mode_t affected_bits = 0;
       /* `affected_bits' modified by umask. */
       mode_t affected_masked;
       /* Operators to actually use umask on. */
-      unsigned ops_to_mask = 0;
+      unsigned int ops_to_mask = 0;
 
-      int who_specified_p;
+      bool who_specified_p;
 
-      affected_bits = 0;
-      ops_to_mask = 0;
       /* Turn on all the bits in `affected_bits' for each group given. */
-      for (++mode_string;; ++mode_string)
+      for (;; mode_string++)
        switch (*mode_string)
          {
          case 'u':
@@ -256,10 +248,10 @@ mode_compile (const char *mode_string, unsigned int masked_ops)
       /* If none specified, affect all bits, except perhaps those
         set in the umask. */
       if (affected_bits)
-       who_specified_p = 1;
+       who_specified_p = true;
       else
        {
-         who_specified_p = 0;
+         who_specified_p = false;
          affected_bits = CHMOD_MODE_BITS;
          ops_to_mask = masked_ops;
        }
@@ -356,7 +348,11 @@ mode_compile (const char *mode_string, unsigned int masked_ops)
              }
        no_more_values:;
        }
-  } while (*mode_string == ',');
+
+      if (*mode_string != ',')
+       break;
+    }
+
   if (*mode_string == 0)
     return head;
 invalid: