mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-06 11:55:48 +00:00
(read_integer): New function.
(read1): Support read syntax #o, #x, #b, #r.
This commit is contained in:
parent
99633e97e9
commit
bf5d1a173b
72
src/lread.c
72
src/lread.c
@ -1596,6 +1596,69 @@ read_escape (readcharfun, stringp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Read an integer in radix RADIX using READCHARFUN to read
|
||||||
|
characters. RADIX must be in the interval [2..36]; if it isn't, a
|
||||||
|
read error is signaled . Value is the integer read. Signals an
|
||||||
|
error if encountering invalid read syntax or if RADIX is out of
|
||||||
|
range. */
|
||||||
|
|
||||||
|
static Lisp_Object
|
||||||
|
read_integer (readcharfun, radix)
|
||||||
|
Lisp_Object readcharfun;
|
||||||
|
int radix;
|
||||||
|
{
|
||||||
|
int number, ndigits, invalid_p, c, sign;
|
||||||
|
|
||||||
|
if (radix < 2 || radix > 36)
|
||||||
|
invalid_p = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
number = ndigits = invalid_p = 0;
|
||||||
|
sign = 1;
|
||||||
|
|
||||||
|
c = READCHAR;
|
||||||
|
if (c == '-')
|
||||||
|
{
|
||||||
|
c = READCHAR;
|
||||||
|
sign = -1;
|
||||||
|
}
|
||||||
|
else if (c == '+')
|
||||||
|
c = READCHAR;
|
||||||
|
|
||||||
|
while (c >= 0)
|
||||||
|
{
|
||||||
|
int digit;
|
||||||
|
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
digit = c - '0';
|
||||||
|
else if (c >= 'a' && c <= 'z')
|
||||||
|
digit = c - 'a' + 10;
|
||||||
|
else if (c >= 'A' && c <= 'Z')
|
||||||
|
digit = c - 'A' + 10;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (digit < 0 || digit >= radix)
|
||||||
|
invalid_p = 1;
|
||||||
|
|
||||||
|
number = radix * number + digit;
|
||||||
|
++ndigits;
|
||||||
|
c = READCHAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndigits == 0 || invalid_p)
|
||||||
|
{
|
||||||
|
char buf[50];
|
||||||
|
sprintf (buf, "integer, radix %d", radix);
|
||||||
|
Fsignal (Qinvalid_read_syntax, Fcons (build_string (buf), Qnil));
|
||||||
|
}
|
||||||
|
|
||||||
|
return make_number (sign * number);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* If the next token is ')' or ']' or '.', we store that character
|
/* If the next token is ')' or ']' or '.', we store that character
|
||||||
in *PCH and the return value is not interesting. Else, we store
|
in *PCH and the return value is not interesting. Else, we store
|
||||||
zero in *PCH and we read and return one lisp object.
|
zero in *PCH and we read and return one lisp object.
|
||||||
@ -1868,8 +1931,17 @@ read1 (readcharfun, pch, first_in_list)
|
|||||||
return XCDR (tem);
|
return XCDR (tem);
|
||||||
/* Fall through to error message. */
|
/* Fall through to error message. */
|
||||||
}
|
}
|
||||||
|
else if (c == 'r' || c == 'R')
|
||||||
|
return read_integer (readcharfun, n);
|
||||||
|
|
||||||
/* Fall through to error message. */
|
/* Fall through to error message. */
|
||||||
}
|
}
|
||||||
|
else if (c == 'x' || c == 'X')
|
||||||
|
return read_integer (readcharfun, 16);
|
||||||
|
else if (c == 'o' || c == 'O')
|
||||||
|
return read_integer (readcharfun, 8);
|
||||||
|
else if (c == 'b' || c == 'B')
|
||||||
|
return read_integer (readcharfun, 2);
|
||||||
|
|
||||||
UNREAD (c);
|
UNREAD (c);
|
||||||
Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
|
Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil));
|
||||||
|
Loading…
Reference in New Issue
Block a user