[PATCH] diff: Clean up diff_scoreopt_parse().
authorJunio C Hamano <junkio@cox.net>
Fri, 3 Jun 2005 08:37:54 +0000 (01:37 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 3 Jun 2005 18:23:03 +0000 (11:23 -0700)
This cleans up diff_scoreopt_parse() function that is used to
parse the fractional notation -B, -C and -M option takes.  The
callers are modified to check for errors and complain.  Earlier
they silently ignored malformed input and falled back on the
default.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff-cache.c
diff-files.c
diff-tree.c
diff.c
diffcore-rename.c

index 8e5f72b..e95fd70 100644 (file)
@@ -191,17 +191,20 @@ int main(int argc, const char **argv)
                        continue;
                }
                if (!strncmp(arg, "-B", 2)) {
-                       diff_break_opt = diff_scoreopt_parse(arg);
+                       if ((diff_break_opt = diff_scoreopt_parse(arg)) == -1)
+                               usage(diff_cache_usage);
                        continue;
                }
                if (!strncmp(arg, "-M", 2)) {
                        detect_rename = DIFF_DETECT_RENAME;
-                       diff_score_opt = diff_scoreopt_parse(arg);
+                       if ((diff_score_opt = diff_scoreopt_parse(arg)) == -1)
+                               usage(diff_cache_usage);
                        continue;
                }
                if (!strncmp(arg, "-C", 2)) {
                        detect_rename = DIFF_DETECT_COPY;
-                       diff_score_opt = diff_scoreopt_parse(arg);
+                       if ((diff_score_opt = diff_scoreopt_parse(arg)) == -1)
+                               usage(diff_cache_usage);
                        continue;
                }
                if (!strcmp(arg, "-z")) {
index a425112..5c895cc 100644 (file)
@@ -61,14 +61,21 @@ int main(int argc, const char **argv)
                        orderfile = argv[1] + 2;
                else if (!strcmp(argv[1], "--pickaxe-all"))
                        pickaxe_opts = DIFF_PICKAXE_ALL;
-               else if (!strncmp(argv[1], "-B", 2))
-                       diff_break_opt = diff_scoreopt_parse(argv[1]);
+               else if (!strncmp(argv[1], "-B", 2)) {
+                       if ((diff_break_opt =
+                            diff_scoreopt_parse(argv[1])) == -1)
+                               usage(diff_files_usage);
+               }
                else if (!strncmp(argv[1], "-M", 2)) {
-                       diff_score_opt = diff_scoreopt_parse(argv[1]);
+                       if ((diff_score_opt =
+                            diff_scoreopt_parse(argv[1])) == -1)
+                               usage(diff_files_usage);
                        detect_rename = DIFF_DETECT_RENAME;
                }
                else if (!strncmp(argv[1], "-C", 2)) {
-                       diff_score_opt = diff_scoreopt_parse(argv[1]);
+                       if ((diff_score_opt =
+                            diff_scoreopt_parse(argv[1])) == -1)
+                               usage(diff_files_usage);
                        detect_rename = DIFF_DETECT_COPY;
                }
                else
index c3a5617..3881c23 100644 (file)
@@ -459,16 +459,19 @@ int main(int argc, const char **argv)
                }
                if (!strncmp(arg, "-M", 2)) {
                        detect_rename = DIFF_DETECT_RENAME;
-                       diff_score_opt = diff_scoreopt_parse(arg);
+                       if ((diff_score_opt = diff_scoreopt_parse(arg)) == -1)
+                               usage(diff_tree_usage);
                        continue;
                }
                if (!strncmp(arg, "-C", 2)) {
                        detect_rename = DIFF_DETECT_COPY;
-                       diff_score_opt = diff_scoreopt_parse(arg);
+                       if ((diff_score_opt = diff_scoreopt_parse(arg)) == -1)
+                               usage(diff_tree_usage);
                        continue;
                }
                if (!strncmp(arg, "-B", 2)) {
-                       diff_break_opt = diff_scoreopt_parse(arg);
+                       if ((diff_break_opt = diff_scoreopt_parse(arg)) == -1)
+                               usage(diff_tree_usage);
                        continue;
                }
                if (!strcmp(arg, "-z")) {
diff --git a/diff.c b/diff.c
index 5513632..7ccc1ed 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -589,6 +589,45 @@ void diff_setup(int flags)
        
 }
 
+static int parse_num(const char **cp_p)
+{
+       int num, scale, ch, cnt;
+       const char *cp = *cp_p;
+
+       cnt = num = 0;
+       scale = 1;
+       while ('0' <= (ch = *cp) && ch <= '9') {
+               if (cnt++ < 5) {
+                       /* We simply ignore more than 5 digits precision. */
+                       scale *= 10;
+                       num = num * 10 + ch - '0';
+               }
+               *cp++;
+       }
+       *cp_p = cp;
+
+       /* user says num divided by scale and we say internally that
+        * is MAX_SCORE * num / scale.
+        */
+       return (MAX_SCORE * num / scale);
+}
+
+int diff_scoreopt_parse(const char *opt)
+{
+       int opt1, cmd;
+
+       if (*opt++ != '-')
+               return -1;
+       cmd = *opt++;
+       if (cmd != 'M' && cmd != 'C' && cmd != 'B')
+               return -1; /* that is not a -M, -C nor -B option */
+
+       opt1 = parse_num(&opt);
+       if (*opt != 0)
+               return -1;
+       return opt1;
+}
+
 struct diff_queue_struct diff_queued_diff;
 
 void diff_q(struct diff_queue_struct *queue, struct diff_filepair *dp)
index eac782b..19325f2 100644 (file)
@@ -229,24 +229,6 @@ static int score_compare(const void *a_, const void *b_)
        return b->score - a->score;
 }
 
-int diff_scoreopt_parse(const char *opt)
-{
-       int diglen, num, scale, i;
-       if (opt[0] != '-' || (opt[1] != 'M' && opt[1] != 'C' && opt[1] != 'B'))
-               return -1; /* that is not a -M, -C nor -B option */
-       diglen = strspn(opt+2, "0123456789");
-       if (diglen == 0 || strlen(opt+2) != diglen)
-               return 0; /* use default */
-       sscanf(opt+2, "%d", &num);
-       for (i = 0, scale = 1; i < diglen; i++)
-               scale *= 10;
-
-       /* user says num divided by scale and we say internally that
-        * is MAX_SCORE * num / scale.
-        */
-       return MAX_SCORE * num / scale;
-}
-
 void diffcore_rename(int detect_rename, int minimum_score)
 {
        struct diff_queue_struct *q = &diff_queued_diff;