All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] Change type of signed int flags to unsigned
@ 2016-02-29 14:04 Saurav Sachidanand
  2016-02-29 19:26 ` Junio C Hamano
  0 siblings, 1 reply; 2+ messages in thread
From: Saurav Sachidanand @ 2016-02-29 14:04 UTC (permalink / raw)
  To: git; +Cc: Saurav Sachidanand

“pattern” and “exclude” are two structs defined in attr.c and dir.h
respectively. Each contain a “flags” field of type int that takes on
values from the set of positive integers {1, 4, 8, 16}, that are
enumerated through the macro EXC_FLAG_*.

That the most significant bit (used to store the sign) of these two
fields is not used in any special way is observed from the fact that
the "flags" fields (accessed within attr.c, dir.c, and
builtin/check-ignore.c) are either checked for their values using the
& operator (e.g.: flags & EXC_FLAG_NODIR), or assigned a value of 0
first and then assigned any one of {1, 4, 8, 16} using the | operator
(e.g.: flags |= EXC_FLAG_NODIR). Hence, change the type of "flags"
to unsigned in both structs.

Furthermore, “flags” of both structs is passed by value or by reference
to the functions parse_exclude_pattern, match_basename and
match_pathname (declared in dir.h), that have an “int” or “int *” type
for "flags" in their signatures. To avoid implicit conversion to types,
or pointers to types, of different sign, change the type for “flags” to
“unsigned” and “unsigned *” in the respective function signatures.

And while we’re at it, document the "flags" field of "exclude" to
explicitly state the values it’s supposed to take on.

Signed-off-by: Saurav Sachidanand <sauravsachidanand@gmail.com>
---

This patch is for the suggested microproject for GSoC 2016 titled
"Use unsigned integral type for collection of bits." It is the third
patch for this project (technically second, considering only the
subject of the email) that incorporates changes to the commit message
suggested by Moritz Neeb and Eric Sunshine, and to some function
signatures suggested by Duy Nguyen. Thanks to them for their feedback.

 attr.c | 2 +-
 dir.c  | 8 ++++----
 dir.h  | 8 ++++----
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/attr.c b/attr.c
index 086c08d..679e13c 100644
--- a/attr.c
+++ b/attr.c
@@ -124,7 +124,7 @@ struct pattern {
 	const char *pattern;
 	int patternlen;
 	int nowildcardlen;
-	int flags;		/* EXC_FLAG_* */
+	unsigned flags;		/* EXC_FLAG_* */
 };

 /*
diff --git a/dir.c b/dir.c
index 552af23..82cec7d 100644
--- a/dir.c
+++ b/dir.c
@@ -459,7 +459,7 @@ int no_wildcard(const char *string)

 void parse_exclude_pattern(const char **pattern,
 			   int *patternlen,
-			   int *flags,
+			   unsigned *flags,
 			   int *nowildcardlen)
 {
 	const char *p = *pattern;
@@ -500,7 +500,7 @@ void add_exclude(const char *string, const char *base,
 {
 	struct exclude *x;
 	int patternlen;
-	int flags;
+	unsigned flags;
 	int nowildcardlen;

 	parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen);
@@ -811,7 +811,7 @@ void add_excludes_from_file(struct dir_struct *dir, const char *fname)

 int match_basename(const char *basename, int basenamelen,
 		   const char *pattern, int prefix, int patternlen,
-		   int flags)
+		   unsigned flags)
 {
 	if (prefix == patternlen) {
 		if (patternlen == basenamelen &&
@@ -836,7 +836,7 @@ int match_basename(const char *basename, int basenamelen,
 int match_pathname(const char *pathname, int pathlen,
 		   const char *base, int baselen,
 		   const char *pattern, int prefix, int patternlen,
-		   int flags)
+		   unsigned flags)
 {
 	const char *name;
 	int namelen;
diff --git a/dir.h b/dir.h
index 3ec3fb0..e942b50 100644
--- a/dir.h
+++ b/dir.h
@@ -28,7 +28,7 @@ struct exclude {
 	int nowildcardlen;
 	const char *base;
 	int baselen;
-	int flags;
+	unsigned flags;		/* EXC_FLAG_* */

 	/*
 	 * Counting starts from 1 for line numbers in ignore files,
@@ -229,10 +229,10 @@ struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname,
  * attr.c:path_matches()
  */
 extern int match_basename(const char *, int,
-			  const char *, int, int, int);
+			  const char *, int, int, unsigned);
 extern int match_pathname(const char *, int,
 			  const char *, int,
-			  const char *, int, int, int);
+			  const char *, int, int, unsigned);

 extern struct exclude *last_exclude_matching(struct dir_struct *dir,
 					     const char *name, int *dtype);
@@ -244,7 +244,7 @@ extern struct exclude_list *add_exclude_list(struct dir_struct *dir,
 extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen,
 					  struct exclude_list *el, int check_index);
 extern void add_excludes_from_file(struct dir_struct *, const char *fname);
-extern void parse_exclude_pattern(const char **string, int *patternlen, int *flags, int *nowildcardlen);
+extern void parse_exclude_pattern(const char **string, int *patternlen, unsigned *flags, int *nowildcardlen);
 extern void add_exclude(const char *string, const char *base,
 			int baselen, struct exclude_list *el, int srcpos);
 extern void clear_exclude_list(struct exclude_list *el);
--
2.7.1.339.g0233b80

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] Change type of signed int flags to unsigned
  2016-02-29 14:04 [PATCH v2] Change type of signed int flags to unsigned Saurav Sachidanand
@ 2016-02-29 19:26 ` Junio C Hamano
  0 siblings, 0 replies; 2+ messages in thread
From: Junio C Hamano @ 2016-02-29 19:26 UTC (permalink / raw)
  To: Saurav Sachidanand; +Cc: git

Saurav Sachidanand <sauravsachidanand@gmail.com> writes:

> “pattern” and “exclude” are two structs defined in attr.c and dir.h
> respectively. Each contain a “flags” field of type int that takes on
> values from the set of positive integers {1, 4, 8, 16}, that are
> enumerated through the macro EXC_FLAG_*.
>
> That the most significant bit (used to store the sign) of these two
> fields is not used in any special way is observed from the fact that
> the "flags" fields (accessed within attr.c, dir.c, and
> builtin/check-ignore.c) are either checked for their values using the
> & operator (e.g.: flags & EXC_FLAG_NODIR), or assigned a value of 0
> first and then assigned any one of {1, 4, 8, 16} using the | operator
> (e.g.: flags |= EXC_FLAG_NODIR). Hence, change the type of "flags"
> to unsigned in both structs.
>
> Furthermore, “flags” of both structs is passed by value or by reference
> to the functions parse_exclude_pattern, match_basename and
> match_pathname (declared in dir.h), that have an “int” or “int *” type
> for "flags" in their signatures. To avoid implicit conversion to types,
> or pointers to types, of different sign, change the type for “flags” to
> “unsigned” and “unsigned *” in the respective function signatures.
>
> And while we’re at it, document the "flags" field of "exclude" to
> explicitly state the values it’s supposed to take on.

The above is overly verbose for two reasons, I think.

 * You seem to start from "I have to change the type of struct
   fields", which leads you to describe "these fields are passed as
   parameters to functions, so their signatures also need to change"
   cascade of changes.  Instead, think of this change is about
   "store EXC_FLAG_* flags in an unsigned integer" (which can be the
   title of the patch).  Then the first and the third paragraphs do
   not have to even exist ;-)

 * The second paragraph could just be:

     No variable (or structure field) that hold these bits is tested
     for its MSB with (variable < 0), so there is no reason to hold
     them in a signed integer.

   Here, also notice that your version stressed "of these two
   fields" too much; the reasoning applies equally to any variable
   that holds copies of values from these fields (or in general,
   anything that holds combination of EXC_FLAG_* flags).

Otherwise it looks good to me.

Thanks.


> Signed-off-by: Saurav Sachidanand <sauravsachidanand@gmail.com>
> ---
>
> This patch is for the suggested microproject for GSoC 2016 titled
> "Use unsigned integral type for collection of bits." It is the third
> patch for this project (technically second, considering only the
> subject of the email) that incorporates changes to the commit message
> suggested by Moritz Neeb and Eric Sunshine, and to some function
> signatures suggested by Duy Nguyen. Thanks to them for their feedback.
>
>  attr.c | 2 +-
>  dir.c  | 8 ++++----
>  dir.h  | 8 ++++----
>  3 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/attr.c b/attr.c
> index 086c08d..679e13c 100644
> --- a/attr.c
> +++ b/attr.c
> @@ -124,7 +124,7 @@ struct pattern {
>  	const char *pattern;
>  	int patternlen;
>  	int nowildcardlen;
> -	int flags;		/* EXC_FLAG_* */
> +	unsigned flags;		/* EXC_FLAG_* */
>  };
>
>  /*
> diff --git a/dir.c b/dir.c
> index 552af23..82cec7d 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -459,7 +459,7 @@ int no_wildcard(const char *string)
>
>  void parse_exclude_pattern(const char **pattern,
>  			   int *patternlen,
> -			   int *flags,
> +			   unsigned *flags,
>  			   int *nowildcardlen)
>  {
>  	const char *p = *pattern;
> @@ -500,7 +500,7 @@ void add_exclude(const char *string, const char *base,
>  {
>  	struct exclude *x;
>  	int patternlen;
> -	int flags;
> +	unsigned flags;
>  	int nowildcardlen;
>
>  	parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen);
> @@ -811,7 +811,7 @@ void add_excludes_from_file(struct dir_struct *dir, const char *fname)
>
>  int match_basename(const char *basename, int basenamelen,
>  		   const char *pattern, int prefix, int patternlen,
> -		   int flags)
> +		   unsigned flags)
>  {
>  	if (prefix == patternlen) {
>  		if (patternlen == basenamelen &&
> @@ -836,7 +836,7 @@ int match_basename(const char *basename, int basenamelen,
>  int match_pathname(const char *pathname, int pathlen,
>  		   const char *base, int baselen,
>  		   const char *pattern, int prefix, int patternlen,
> -		   int flags)
> +		   unsigned flags)
>  {
>  	const char *name;
>  	int namelen;
> diff --git a/dir.h b/dir.h
> index 3ec3fb0..e942b50 100644
> --- a/dir.h
> +++ b/dir.h
> @@ -28,7 +28,7 @@ struct exclude {
>  	int nowildcardlen;
>  	const char *base;
>  	int baselen;
> -	int flags;
> +	unsigned flags;		/* EXC_FLAG_* */
>
>  	/*
>  	 * Counting starts from 1 for line numbers in ignore files,
> @@ -229,10 +229,10 @@ struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname,
>   * attr.c:path_matches()
>   */
>  extern int match_basename(const char *, int,
> -			  const char *, int, int, int);
> +			  const char *, int, int, unsigned);
>  extern int match_pathname(const char *, int,
>  			  const char *, int,
> -			  const char *, int, int, int);
> +			  const char *, int, int, unsigned);
>
>  extern struct exclude *last_exclude_matching(struct dir_struct *dir,
>  					     const char *name, int *dtype);
> @@ -244,7 +244,7 @@ extern struct exclude_list *add_exclude_list(struct dir_struct *dir,
>  extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen,
>  					  struct exclude_list *el, int check_index);
>  extern void add_excludes_from_file(struct dir_struct *, const char *fname);
> -extern void parse_exclude_pattern(const char **string, int *patternlen, int *flags, int *nowildcardlen);
> +extern void parse_exclude_pattern(const char **string, int *patternlen, unsigned *flags, int *nowildcardlen);
>  extern void add_exclude(const char *string, const char *base,
>  			int baselen, struct exclude_list *el, int srcpos);
>  extern void clear_exclude_list(struct exclude_list *el);
> --
> 2.7.1.339.g0233b80

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-02-29 19:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-29 14:04 [PATCH v2] Change type of signed int flags to unsigned Saurav Sachidanand
2016-02-29 19:26 ` Junio C Hamano

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.