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:
Denys Vlasenko 2019-10-22 14:25:43 +02:00
parent 3ef513e787
commit 7427406580

View File

@ -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;
} }