1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

Refactor repeated code in scm_read_string

* libguile/read.c (SCM_READ_HEX_ESCAPE): new macro
  (scm_read_string): use new macro SCM_READ_HEX_ESCAPE
This commit is contained in:
Michael Gran 2010-01-10 18:24:23 -08:00
parent e63dda67d7
commit c5661d2860

View file

@ -410,6 +410,36 @@ scm_read_sexp (scm_t_wchar chr, SCM port)
}
#undef FUNC_NAME
/* Read a hexadecimal number NDIGITS in length. Put its value into the variable
C. */
#define SCM_READ_HEX_ESCAPE(ndigits) \
do \
{ \
scm_t_wchar a; \
size_t i = 0; \
c = 0; \
while (i < ndigits) \
{ \
a = scm_getc (port); \
if (a == EOF) \
goto str_eof; \
if ('0' <= a && a <= '9') \
a -= '0'; \
else if ('A' <= a && a <= 'F') \
a = a - 'A' + 10; \
else if ('a' <= a && a <= 'f') \
a = a - 'a' + 10; \
else \
{ \
c = a; \
goto bad_escaped; \
} \
c = c * 16 + a; \
i ++; \
} \
} while (0)
static SCM
scm_read_string (int chr, SCM port)
#define FUNC_NAME "scm_lreadr"
@ -481,89 +511,14 @@ scm_read_string (int chr, SCM port)
c = '\010';
break;
case 'x':
{
scm_t_wchar a, b;
a = scm_getc (port);
if (a == EOF)
goto str_eof;
b = scm_getc (port);
if (b == EOF)
goto str_eof;
if ('0' <= a && a <= '9')
a -= '0';
else if ('A' <= a && a <= 'F')
a = a - 'A' + 10;
else if ('a' <= a && a <= 'f')
a = a - 'a' + 10;
else
{
c = a;
goto bad_escaped;
}
if ('0' <= b && b <= '9')
b -= '0';
else if ('A' <= b && b <= 'F')
b = b - 'A' + 10;
else if ('a' <= b && b <= 'f')
b = b - 'a' + 10;
else
{
c = b;
goto bad_escaped;
}
c = a * 16 + b;
SCM_READ_HEX_ESCAPE (2);
break;
}
case 'u':
{
scm_t_wchar a;
int i;
c = 0;
for (i = 0; i < 4; i++)
{
a = scm_getc (port);
if (a == EOF)
goto str_eof;
if ('0' <= a && a <= '9')
a -= '0';
else if ('A' <= a && a <= 'F')
a = a - 'A' + 10;
else if ('a' <= a && a <= 'f')
a = a - 'a' + 10;
else
{
c = a;
goto bad_escaped;
}
c = c * 16 + a;
}
SCM_READ_HEX_ESCAPE (4);
break;
}
case 'U':
{
scm_t_wchar a;
int i;
c = 0;
for (i = 0; i < 6; i++)
{
a = scm_getc (port);
if (a == EOF)
goto str_eof;
if ('0' <= a && a <= '9')
a -= '0';
else if ('A' <= a && a <= 'F')
a = a - 'A' + 10;
else if ('a' <= a && a <= 'f')
a = a - 'a' + 10;
else
{
c = a;
goto bad_escaped;
}
c = c * 16 + a;
}
SCM_READ_HEX_ESCAPE (6);
break;
}
default:
bad_escaped:
scm_i_input_error (FUNC_NAME, port,