mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-02 22:11:54 +02:00
42332: Special case unsigned printf formats.
For constants we can avoid a conversion to signed by examining the expression before passing to math eval.
This commit is contained in:
parent
f62af4a7ef
commit
2cbf6b6a19
3 changed files with 71 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2018-01-31 Peter Stephenson <p.stephenson@samsung.com>
|
||||||
|
|
||||||
|
* 42332: Src/builtin.c, Src/utils.c: special case printf for
|
||||||
|
unsigned integers by looking for constansts, avoiding conversion
|
||||||
|
to unsigned.
|
||||||
|
|
||||||
2018-01-24 Daniel Hahler <zsh@thequod.de>
|
2018-01-24 Daniel Hahler <zsh@thequod.de>
|
||||||
|
|
||||||
* 42323: Completion/Unix/Command/_git: _git: move "local" statement
|
* 42323: Completion/Unix/Command/_git: _git: move "local" statement
|
||||||
|
|
|
@ -5243,7 +5243,10 @@ bin_print(char *name, char **args, Options ops, int func)
|
||||||
*d++ = 'l';
|
*d++ = 'l';
|
||||||
#endif
|
#endif
|
||||||
*d++ = 'l', *d++ = *c, *d = '\0';
|
*d++ = 'l', *d++ = *c, *d = '\0';
|
||||||
zulongval = (curarg) ? mathevali(curarg) : 0;
|
if (!curarg)
|
||||||
|
zulongval = (zulong)0;
|
||||||
|
else if (!zstrtoul_underscore(curarg, &zulongval))
|
||||||
|
zulongval = mathevali(curarg);
|
||||||
if (errflag) {
|
if (errflag) {
|
||||||
zulongval = 0;
|
zulongval = 0;
|
||||||
errflag &= ~ERRFLAG_ERROR;
|
errflag &= ~ERRFLAG_ERROR;
|
||||||
|
|
61
Src/utils.c
61
Src/utils.c
|
@ -2455,6 +2455,67 @@ zstrtol_underscore(const char *s, char **t, int base, int underscore)
|
||||||
return neg ? -(zlong)calc : (zlong)calc;
|
return neg ? -(zlong)calc : (zlong)calc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If s represents a complete unsigned integer (and nothing else)
|
||||||
|
* return 1 and set retval to the value. Otherwise return 0.
|
||||||
|
*
|
||||||
|
* Underscores are always allowed.
|
||||||
|
*
|
||||||
|
* Sensitive to OCTAL_ZEROES.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**/
|
||||||
|
mod_export int
|
||||||
|
zstrtoul_underscore(const char *s, zulong *retval)
|
||||||
|
{
|
||||||
|
zulong calc = 0, newcalc = 0, base;
|
||||||
|
|
||||||
|
if (*s == '+')
|
||||||
|
s++;
|
||||||
|
|
||||||
|
if (*s != '0')
|
||||||
|
base = 10;
|
||||||
|
else if (*++s == 'x' || *s == 'X')
|
||||||
|
base = 16, s++;
|
||||||
|
else if (*s == 'b' || *s == 'B')
|
||||||
|
base = 2, s++;
|
||||||
|
else
|
||||||
|
base = isset(OCTALZEROES) ? 8 : 10;
|
||||||
|
if (base < 2 || base > 36) {
|
||||||
|
return 0;
|
||||||
|
} else if (base <= 10) {
|
||||||
|
for (; (*s >= '0' && *s < ('0' + base)) ||
|
||||||
|
*s == '_'; s++) {
|
||||||
|
if (*s == '_')
|
||||||
|
continue;
|
||||||
|
newcalc = calc * base + *s - '0';
|
||||||
|
if (newcalc < calc)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
calc = newcalc;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (; idigit(*s) || (*s >= 'a' && *s < ('a' + base - 10))
|
||||||
|
|| (*s >= 'A' && *s < ('A' + base - 10))
|
||||||
|
|| *s == '_'; s++) {
|
||||||
|
if (*s == '_')
|
||||||
|
continue;
|
||||||
|
newcalc = calc*base + (idigit(*s) ? (*s - '0') : (*s & 0x1f) + 9);
|
||||||
|
if (newcalc < calc)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
calc = newcalc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*s)
|
||||||
|
return 0;
|
||||||
|
*retval = calc;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
mod_export int
|
mod_export int
|
||||||
setblock_fd(int turnonblocking, int fd, long *modep)
|
setblock_fd(int turnonblocking, int fd, long *modep)
|
||||||
|
|
Loading…
Reference in a new issue