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 6adb945..4584075 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) {