com_ff(): Avoid "unsigned i".
authorAndre Noll <maan@tuebingen.mpg.de>
Tue, 1 May 2018 12:04:57 +0000 (14:04 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Tue, 31 Jul 2018 16:14:36 +0000 (18:14 +0200)
It's an act of violence. The change should have no visible effect in
the common cases

ff n and ff n-

where n is a (small) non-negative integer. The behaviour of the command
changes for negative values of n, but this case was never documented.

After this patch negative arguments instruct the subcommand to jump
backwards, which should meet the expected behaviour.

command.c

index 6adb945555d32e101fdd24bc7255133e33f0bd1b..45840755a37aef29c32afa7e425c3bcb4c443c7a 100644 (file)
--- a/command.c
+++ b/command.c
@@ -663,8 +663,7 @@ EXPORT_SERVER_CMD_HANDLER(nomore);
 static int com_ff(struct command_context *cc, struct lls_parse_result *lpr)
 {
        long promille;
-       int ret, backwards = 0;
-       unsigned i;
+       int i, ret, backwards = 0;
        char c, *errctx;
 
        ret = lls(lls_check_arg_count(lpr, 1, 1, &errctx));
@@ -672,7 +671,7 @@ static int com_ff(struct command_context *cc, struct lls_parse_result *lpr)
                send_errctx(cc, errctx);
                return ret;
        }
-       if (!(ret = sscanf(lls_input(0, lpr), "%u%c", &i, &c)))
+       if (!(ret = sscanf(lls_input(0, lpr), "%i%c", &i, &c)))
                return -E_COMMAND_SYNTAX;
        if (ret > 1 && c == '-')
                backwards = 1; /* jmp backwards */
@@ -682,10 +681,14 @@ static int com_ff(struct command_context *cc, struct lls_parse_result *lpr)
                goto out;
        ret = 1;
        promille = (1000 * mmd->current_chunk) / mmd->afd.afhi.chunks_total;
+       /*
+        * We need these casts because without them the expression on the right
+        * hand side is of unsigned type.
+        */
        if (backwards)
-               promille -= 1000 * i / mmd->afd.afhi.seconds_total;
+               promille -= 1000 * i / (int)mmd->afd.afhi.seconds_total;
        else
-               promille += 1000 * i / mmd->afd.afhi.seconds_total;
+               promille += 1000 * i / (int)mmd->afd.afhi.seconds_total;
        if (promille < 0)
                promille = 0;
        if (promille > 1000) {