At Tue, 12 Oct 2021 15:06:11 +0900 (JST), Kyotaro Horiguchi 
<horikyota....@gmail.com> wrote in 
> "%4%5%6%7p" is converted to "57p".  Do we need to imitate that bug
> with this patch?

So.. I try to describe the behavior for exhaustive patterns..

current:
 A. "^-?[0-9]+.*" : returns valid padding. p goes after the last digit.
 B. "^[^0-9-].*"  : padding = 0, p doesn't advance.
 C. "^-[^0-9].*"  : padding = 0, p advances by 1 byte.
 D. "^-"          : padding = 0, p advances by 1 byte.
  (if *p == 0 then breaks)

I think the patterns covers the all possibilities.

If we code as the following:
        if (*p == '-' ? isdigit(p[1]) : isdigit(p[0]))
                {
                        char *endptr;
                        padding = strtol(p, &endptr, 10);
                        Assert(endptr > p);
                        if (*endptr == '\0')
                                break;
                        p = endptr;
                }
                else
          padding = 0;

  A. "^-?[0-9]+.*" : same to the current
  B. "^[^0-9-].*"  : same to the current
  C. "^-[^0-9].*"  : padding = 0, p doesn't advance.
  D. "^-"          : padding = 0, p doesn't advance.

If we wan to make the behaviors C and D same with the current, the
else clause should be like the follows, but I don't think we need to
do that.

                else
                {
          padding = 0;
                  if (*p == '-')
                    p++;
            }

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center


Reply via email to