coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/3] maint: prohibit an operator at end of line


From: Jim Meyering
Subject: Re: [PATCH 3/3] maint: prohibit an operator at end of line
Date: Wed, 02 May 2012 10:35:36 +0200

Eric Blake wrote:
> On 04/30/2012 08:25 AM, Eric Blake wrote:
>> On 04/30/2012 07:08 AM, Jim Meyering wrote:
>>> Here's a new syntax-check rule (patch 3/3).
>>> 1 and 2 fix violations so that the new check passes.
>>>
>>> For now, this is only in coreutils (grep had only two violations),
>>> but given the long list of violations in gnulib's lib/ directory,
>>> it may not be generally appealing enough to be added to gnulib's maint.mk:
>>>
>>>     $ git grep -lE '(. [-/+]|&&|\|\|)$' lib
>>
>> Is it worth adding some more operators, such as *, ^, &, and |?
>>
>> (. [-/+*^]|&&?|\|\|?)$
>
> Also <<, >>, ==, !=, and for that matter, all of the op= operators:
>
> (. [-/+*^=!<>]=?|&&?|\|\|?|<<=?|>>=?)$

Good point.
Here's a more complete patch that also makes the
regular expression overridable.

I'm still omitting "*" and "=" from the default.

>From b8a6996e258a2c30de40fb20cab0d17a38c3eff2 Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Sun, 1 Jan 2012 01:46:34 +0100
Subject: [PATCH 1/3] maint: with split lines, don't leave an operator at end
 of line

* src/copy.c (copy_reg): Split an expression before a binary operator,
not after it.
* src/cut.c (set_fields): Likewise.
* src/id.c (main): Likewise.
* src/install.c (setdefaultfilecon): Likewise.
* src/join.c (ignore_case): Likewise.
* src/pr.c (cols_ready_to_print, init_parameters, print_page): Likewise.
* src/stty.c (set_window_size): Likewise.
* src/wc.c (SUPPORT_OLD_MBRTOWC): Likewise.
* src/who.c (scan_entries): Likewise.
* src/test.c (binary_operator): Join a split line.
* src/extent-scan.c (extent_scan_read): Move an ">" from end of line
to beginning of the following.
Likewise for two other expressions.
---
 src/copy.c        |    4 ++--
 src/cut.c         |    4 ++--
 src/extent-scan.c |   12 ++++++------
 src/id.c          |    4 ++--
 src/install.c     |    4 ++--
 src/join.c        |    2 +-
 src/pr.c          |   22 +++++++++++-----------
 src/stty.c        |    4 ++--
 src/test.c        |    4 ++--
 src/wc.c          |    2 +-
 src/who.c         |    6 +++---
 11 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/src/copy.c b/src/copy.c
index 414fbe0..26bbcf2 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -1055,8 +1055,8 @@ copy_reg (char const *src_name, char const *dst_name,
                           make_holes, src_name, dst_name,
                           UINTMAX_MAX, &n_read,
                           &wrote_hole_at_eof)
-           || (wrote_hole_at_eof &&
-               ftruncate (dest_desc, n_read) < 0))
+           || (wrote_hole_at_eof
+               && ftruncate (dest_desc, n_read) < 0))
         {
           error (0, errno, _("failed to extend %s"), quote (dst_name));
           return_val = false;
diff --git a/src/cut.c b/src/cut.c
index fed9616..87380ac 100644
--- a/src/cut.c
+++ b/src/cut.c
@@ -372,8 +372,8 @@ set_fields (const char *fieldstr)
           initial = (lhs_specified ? value : 1);
           value = 0;
         }
-      else if (*fieldstr == ',' ||
-               isblank (to_uchar (*fieldstr)) || *fieldstr == '\0')
+      else if (*fieldstr == ','
+               || isblank (to_uchar (*fieldstr)) || *fieldstr == '\0')
         {
           in_digits = false;
           /* Ending the string, or this field/byte sublist. */
diff --git a/src/extent-scan.c b/src/extent-scan.c
index e269f54..0c25c57 100644
--- a/src/extent-scan.c
+++ b/src/extent-scan.c
@@ -133,11 +133,11 @@ extent_scan_read (struct extent_scan *scan)
       unsigned int i = 0;
       for (i = 0; i < fiemap->fm_mapped_extents; i++)
         {
-          assert (fm_extents[i].fe_logical <=
-                  OFF_T_MAX - fm_extents[i].fe_length);
+          assert (fm_extents[i].fe_logical
+                  <= OFF_T_MAX - fm_extents[i].fe_length);

-          if (si && last_ei->ext_flags ==
-              (fm_extents[i].fe_flags & ~FIEMAP_EXTENT_LAST)
+          if (si && last_ei->ext_flags
+              == (fm_extents[i].fe_flags & ~FIEMAP_EXTENT_LAST)
               && (last_ei->ext_logical + last_ei->ext_length
                   == fm_extents[i].fe_logical))
             {
@@ -147,8 +147,8 @@ extent_scan_read (struct extent_scan *scan)
               last_ei->ext_flags = fm_extents[i].fe_flags;
             }
           else if ((si == 0 && scan->scan_start > fm_extents[i].fe_logical)
-                   || (si && last_ei->ext_logical + last_ei->ext_length >
-                       fm_extents[i].fe_logical))
+                   || (si && (last_ei->ext_logical + last_ei->ext_length
+                              > fm_extents[i].fe_logical)))
             {
               /* BTRFS before 2.6.38 could return overlapping extents
                  for sparse files.  We adjust the returned extents
diff --git a/src/id.c b/src/id.c
index 158715e..41ae024 100644
--- a/src/id.c
+++ b/src/id.c
@@ -191,8 +191,8 @@ main (int argc, char **argv)
      invalid value that will be not displayed in print_full_info().  */
   if (selinux_enabled
       && n_ids == 0
-      && (just_context ||
-          (default_format && ! getenv ("POSIXLY_CORRECT"))))
+      && (just_context
+          || (default_format && ! getenv ("POSIXLY_CORRECT"))))
     {
       /* Report failure only if --context (-Z) was explicitly requested.  */
       if (getcon (&context) && just_context)
diff --git a/src/install.c b/src/install.c
index 5468d26..854436a 100644
--- a/src/install.c
+++ b/src/install.c
@@ -359,8 +359,8 @@ setdefaultfilecon (char const *file)

   /* If there's an error determining the context, or it has none,
      return to allow default context */
-  if ((matchpathcon (file, st.st_mode, &scontext) != 0) ||
-      STREQ (scontext, "<<none>>"))
+  if ((matchpathcon (file, st.st_mode, &scontext) != 0)
+      || STREQ (scontext, "<<none>>"))
     {
       if (scontext != NULL)
         freecon (scontext);
diff --git a/src/join.c b/src/join.c
index b92c1f8..e39ed87 100644
--- a/src/join.c
+++ b/src/join.c
@@ -173,7 +173,7 @@ static struct line uni_blank;
 /* If nonzero, ignore case when comparing join fields.  */
 static bool ignore_case;

-/* If nonzero, treat the first line of each file as column headers -
+/* If nonzero, treat the first line of each file as column headers --
    join them without checking for ordering */
 static bool join_header_lines;

diff --git a/src/pr.c b/src/pr.c
index f1e310f..2ea586d 100644
--- a/src/pr.c
+++ b/src/pr.c
@@ -781,9 +781,9 @@ cols_ready_to_print (void)

   n = 0;
   for (q = column_vector, i = 0; i < columns; ++q, ++i)
-    if (q->status == OPEN ||
-        q->status == FF_FOUND ||       /* With -b: To print a header only */
-        (storing_columns && q->lines_stored > 0 && q->lines_to_print > 0))
+    if (q->status == OPEN
+        || q->status == FF_FOUND       /* With -b: To print a header only */
+        || (storing_columns && q->lines_stored > 0 && q->lines_to_print > 0))
       ++n;
   return n;
 }
@@ -1275,13 +1275,13 @@ init_parameters (int number_of_files)

       /* To allow input tab-expansion (-e sensitive) use:
          if (number_separator == input_tab_char)
-           number_width = chars_per_number +
-             TAB_WIDTH (chars_per_input_tab, chars_per_number);   */
+           number_width = chars_per_number
+             + TAB_WIDTH (chars_per_input_tab, chars_per_number);   */

       /* Estimate chars_per_text without any margin and keep it constant. */
       if (number_separator == '\t')
-        number_width = chars_per_number +
-          TAB_WIDTH (chars_per_default_tab, chars_per_number);
+        number_width = (chars_per_number
+                        + TAB_WIDTH (chars_per_default_tab, chars_per_number));
       else
         number_width = chars_per_number + 1;

@@ -1297,8 +1297,8 @@ init_parameters (int number_of_files)
         power_10 = 10 * power_10;
     }

-  chars_per_column = (chars_per_line - chars_used_by_number -
-                     (columns - 1) * col_sep_length) / columns;
+  chars_per_column = (chars_per_line - chars_used_by_number
+                      - (columns - 1) * col_sep_length) / columns;

   if (chars_per_column < 1)
     error (EXIT_FAILURE, 0, _("page width too narrow"));
@@ -1836,8 +1836,8 @@ print_page (void)
                 {
                   if (empty_line)
                     align_empty_cols = true;
-                  else if (p->status == CLOSED ||
-                           (p->status == ON_HOLD && FF_only))
+                  else if (p->status == CLOSED
+                           || (p->status == ON_HOLD && FF_only))
                     align_column (p);
                 }
             }
diff --git a/src/stty.c b/src/stty.c
index 8e36593..eb07f85 100644
--- a/src/stty.c
+++ b/src/stty.c
@@ -1344,8 +1344,8 @@ set_window_size (int rows, int cols, char const 
*device_name)
      it's almost certainly a "struct winsize" instead.

      At any rate, the bug manifests itself when ws_row == 0; the symptom is
-     that ws_row is set to ws_col, and ws_col is set to (ws_xpixel<<16) +
-     ws_ypixel.  Since GNU stty sets rows and columns separately, this bug
+     that ws_row is set to ws_col, and ws_col is set to (ws_xpixel<<16)
+     + ws_ypixel.  Since GNU stty sets rows and columns separately, this bug
      caused "stty rows 0 cols 0" to set rows to cols and cols to 0, while
      "stty cols 0 rows 0" would do the right thing.  On a little-endian
      machine like the sun386i, the problem is the same, but for ws_col == 0.
diff --git a/src/test.c b/src/test.c
index 2d562d9..31a6420 100644
--- a/src/test.c
+++ b/src/test.c
@@ -367,8 +367,8 @@ binary_operator (bool l_is_l)
       test_syntax_error (_("unknown binary operator"), argv[op]);
     }

-  if (argv[op][0] == '=' && (!argv[op][1] ||
-       ((argv[op][1] == '=') && !argv[op][2])))
+  if (argv[op][0] == '='
+      && (!argv[op][1] || ((argv[op][1] == '=') && !argv[op][2])))
     {
       bool value = STREQ (argv[pos], argv[pos + 2]);
       pos += 3;
diff --git a/src/wc.c b/src/wc.c
index 1b8a7a4..5017377 100644
--- a/src/wc.c
+++ b/src/wc.c
@@ -292,7 +292,7 @@ wc (int fd, char const *file_x, struct fstatus *fstatus)
       /* Back-up the state before each multibyte character conversion and
          move the last incomplete character of the buffer to the front
          of the buffer.  This is needed because we don't know whether
-         the 'mbrtowc' function updates the state when it returns -2, -
+         the 'mbrtowc' function updates the state when it returns -2, --
          this is the ISO C 99 and glibc-2.2 behaviour - or not - amended
          ANSI C, glibc-2.1 and Solaris 5.7 behaviour.  We don't have an
          autoconf test for this, yet.  */
diff --git a/src/who.c b/src/who.c
index 84c68d7..c875b1d 100644
--- a/src/who.c
+++ b/src/who.c
@@ -590,9 +590,9 @@ scan_entries (size_t n, const STRUCT_UTMP *utmp_buf)

   while (n--)
     {
-      if (!my_line_only ||
-          strncmp (ttyname_b, utmp_buf->ut_line,
-                   sizeof (utmp_buf->ut_line)) == 0)
+      if (!my_line_only
+          || strncmp (ttyname_b, utmp_buf->ut_line,
+                      sizeof (utmp_buf->ut_line)) == 0)
         {
           if (need_users && IS_USER_PROCESS (utmp_buf))
             print_user (utmp_buf, boottime);
--
1.7.10.420.g9768c


>From 57e0a882ef70712f79e7255aa5c1f8ba27b4c33e Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Mon, 30 Apr 2012 10:55:18 +0200
Subject: [PATCH 2/3] maint: adjust comments to avoid FP match on
 binary-operator-at-EOL

* src/ls.c (print_long_format): Reformat comment to avoid "=="
at end of line.
Also, "sortkey" is not a word: s/sortkey/sort key/.
* src/ioblksize.h: Likewise, for "|" from a shell snippet.
* src/runcon.c: Likewise, for "|" in grammar-like usage.
---
 src/ioblksize.h |    4 ++--
 src/ls.c        |   20 ++++++++++----------
 src/runcon.c    |    6 +++---
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/ioblksize.h b/src/ioblksize.h
index ffd6ff3..aaea9ff 100644
--- a/src/ioblksize.h
+++ b/src/ioblksize.h
@@ -28,8 +28,8 @@
      bs=$((1024*2**$i))
      printf "%7s=" $bs
      timeout --foreground -sINT 2 \
-       dd bs=$bs if=/dev/zero of=/dev/null 2>&1 |
-        sed -n 's/.* \([0-9.]* [GM]B\/s\)/\1/p'
+       dd bs=$bs if=/dev/zero of=/dev/null 2>&1 \
+         | sed -n 's/.* \([0-9.]* [GM]B\/s\)/\1/p'
    done

    With the results shown for these systems:
diff --git a/src/ls.c b/src/ls.c
index 800f813..397e4ea 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -3443,13 +3443,13 @@ static int rev_xstrcoll_df_version (V a, V b)
 { DIRFIRST_CHECK (a, b); return cmp_version (b, a); }


-/* We have 2^3 different variants for each sortkey function
+/* We have 2^3 different variants for each sort-key function
    (for 3 independent sort modes).
    The function pointers stored in this array must be dereferenced as:

     sort_variants[sort_key][use_strcmp][reverse][dirs_first]

-   Note that the order in which sortkeys are listed in the function pointer
+   Note that the order in which sort keys are listed in the function pointer
    array below is defined by the order of the elements in the time_type and
    sort_type enums!  */

@@ -3493,14 +3493,14 @@ static qsortFunc const sort_functions[][2][2][2] =
     LIST_SORTFUNCTION_VARIANTS (atime)
   };

-/* The number of sortkeys is calculated as
-     the number of elements in the sort_type enum (i.e. sort_numtypes) +
+/* The number of sort keys is calculated as the sum of
+     the number of elements in the sort_type enum (i.e. sort_numtypes)
      the number of elements in the time_type enum (i.e. time_numtypes) - 1
    This is because when sort_type==sort_time, we have up to
-   time_numtypes possible sortkeys.
+   time_numtypes possible sort keys.

    This line verifies at compile-time that the array of sort functions has been
-   initialized for all possible sortkeys. */
+   initialized for all possible sort keys. */
 verify (ARRAY_CARDINALITY (sort_functions)
         == sort_numtypes + time_numtypes - 1 );

@@ -3918,10 +3918,10 @@ print_long_format (const struct fileinfo *f)
           gettime (&current_time);
         }

-      /* Consider a time to be recent if it is within the past six
-         months.  A Gregorian year has 365.2425 * 24 * 60 * 60 ==
-         31556952 seconds on the average.  Write this value as an
-         integer constant to avoid floating point hassles.  */
+      /* Consider a time to be recent if it is within the past six months.
+         A Gregorian year has 365.2425 * 24 * 60 * 60 == 31556952 seconds
+         on the average.  Write this value as an integer constant to
+         avoid floating point hassles.  */
       six_months_ago.tv_sec = current_time.tv_sec - 31556952 / 2;
       six_months_ago.tv_nsec = current_time.tv_nsec;

diff --git a/src/runcon.c b/src/runcon.c
index 29bf0e5..875441f 100644
--- a/src/runcon.c
+++ b/src/runcon.c
@@ -15,9 +15,9 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

 /*
- * runcon [ context |
- *         ( [ -c ] [ -r role ] [-t type] [ -u user ] [ -l levelrange ] )
- *         command [arg1 [arg2 ...] ]
+ * runcon [ context
+ *          | ( [ -c ] [ -r role ] [-t type] [ -u user ] [ -l levelrange ] )
+ *          command [arg1 [arg2 ...] ]
  *
  * attempt to run the specified command with the specified context.
  *
--
1.7.10.420.g9768c


>From e744f4b7b7de9b76fdd314aa406e9fb150b9168d Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Mon, 30 Apr 2012 10:37:14 +0200
Subject: [PATCH 3/3] maint: prohibit an operator at end of line

Many coding standards, including GNU's, advocate that when
splitting a line near a binary operator, one should put the
operator at the beginning of the continued line, rather than
at the end of the preceding one.  This is for readability:
such operators are relatively important to readability, and
they are more apparent at the beginning of a line than
at the varying-column end of line,
* cfg.mk (sc_prohibit_operator_at_end_of_line): New rule.
Exempt test.c and head.c.
---
 cfg.mk |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/cfg.mk b/cfg.mk
index c3ddb42..923785e 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -200,6 +200,18 @@ sc_no_exec_perl_coreutils:
              exit 1; } || :;                                           \
        fi

+# With split lines, don't leave an operator at end of line.
+# Instead, put it on the following line, where it is more apparent.
+# Don't bother checking for "*" at end of line, since it provokes
+# far too many false positives, matching constructs like "TYPE *".
+# Similarly, omit "=" (initializers).
+binop_re_ ?= [-/+^!<>]|[-/+*^!<>=]=|&&?|\|\|?|<<=?|>>=?
+sc_prohibit_operator_at_end_of_line:
+       @prohibit='. ($(binop_re_))$$'                                  \
+       in_vc_files='\.[chly]$$'                                        \
+       halt='found operator at end of line'                            \
+         $(_sc_search_regexp)
+
 # Don't use "readlink" or "readlinkat" directly
 sc_prohibit_readlink:
        @prohibit='\<readlink(at)? \('                                  \
@@ -456,3 +468,7 @@ 
exclude_file_name_regexp--sc_prohibit_continued_string_alpha_in_column_1 = \

 exclude_file_name_regexp--sc_prohibit_test_backticks = \
   ^tests/(init\.sh|check\.mk|misc/stdbuf)$$
+
+# Exempt test.c, since it's nominally shared, and relatively static.
+exclude_file_name_regexp--sc_prohibit_operator_at_end_of_line = \
+  ^src/(ptx|test|head)\.c$$
--
1.7.10.420.g9768c



reply via email to

[Prev in Thread] Current Thread [Next in Thread]