shell: better comments in BASE#nn code
function old new delta evaluate_string 932 930 -2 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
3ef513e787
commit
7427406580
24
shell/math.c
24
shell/math.c
@ -537,25 +537,23 @@ static arith_t strto_arith_t(const char *nptr, char **endptr)
|
|||||||
base = (unsigned)n;
|
base = (unsigned)n;
|
||||||
n = 0;
|
n = 0;
|
||||||
nptr = *endptr + 1;
|
nptr = *endptr + 1;
|
||||||
/* bash allows "N#" (empty "nnnn" part) */
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
unsigned digit = (unsigned)*nptr - '0';
|
unsigned digit = (unsigned)*nptr - '0';
|
||||||
if (digit >= 10) {
|
if (digit >= 10 /* not 0..9 */
|
||||||
/* *nptr is not 0..9 */
|
&& digit <= 'z' - '0' /* needed to reject e.g. $((64#~)) */
|
||||||
if (*nptr > 'z')
|
) {
|
||||||
break; /* this rejects e.g. $((64#~)) */
|
|
||||||
/* in bases up to 36, case does not matter for a-z */
|
/* in bases up to 36, case does not matter for a-z */
|
||||||
digit = (unsigned)(*nptr | 0x20) - ('a' - 10);
|
digit = (unsigned)(*nptr | 0x20) - ('a' - 10);
|
||||||
if (base > 36 && *nptr <= '_') {
|
if (base > 36 && *nptr <= '_') {
|
||||||
/* otherwise, A-Z,@,_ are 36..61,62,63 */
|
/* otherwise, A-Z,@,_ are 36-61,62,63 */
|
||||||
if (*nptr == '@')
|
if (*nptr == '_')
|
||||||
digit = 62;
|
|
||||||
else if (*nptr == '_')
|
|
||||||
digit = 63;
|
digit = 63;
|
||||||
|
else if (*nptr == '@')
|
||||||
|
digit = 62;
|
||||||
else if (digit < 36) /* A-Z */
|
else if (digit < 36) /* A-Z */
|
||||||
digit += 36 - 10;
|
digit += 36 - 10;
|
||||||
else
|
else
|
||||||
break; /* error, such as [ or \ */
|
break; /* error: one of [\]^ */
|
||||||
}
|
}
|
||||||
//bb_error_msg("ch:'%c'%d digit:%u", *nptr, *nptr, digit);
|
//bb_error_msg("ch:'%c'%d digit:%u", *nptr, *nptr, digit);
|
||||||
//if (digit < 10) - example where we need this?
|
//if (digit < 10) - example where we need this?
|
||||||
@ -567,6 +565,12 @@ static arith_t strto_arith_t(const char *nptr, char **endptr)
|
|||||||
n = n * base + digit;
|
n = n * base + digit;
|
||||||
nptr++;
|
nptr++;
|
||||||
}
|
}
|
||||||
|
/* Note: we do not set errno on bad chars, we just set a pointer
|
||||||
|
* to the first invalid char. For example, this allows
|
||||||
|
* "N#" (empty "nnnn" part): 64#+1 is a valid expression,
|
||||||
|
* it means 64# + 1, whereas 64#~... is not, since ~ is not a valid
|
||||||
|
* operator.
|
||||||
|
*/
|
||||||
*endptr = (char*)nptr;
|
*endptr = (char*)nptr;
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user