summaryrefslogtreecommitdiff
path: root/libguile/read.c
diff options
context:
space:
mode:
authorMichael Gran <spk121@yahoo.com>2010-01-10 18:24:23 -0800
committerMichael Gran <spk121@yahoo.com>2010-01-10 18:24:23 -0800
commitc5661d2860da05b4666c9f4764509034aa7da693 (patch)
tree8003474e8a2c72a786d52a8b3d08e084add1d101 /libguile/read.c
parente63dda67d70eb4cb92cbc406510a0f21337374a4 (diff)
downloadguile-c5661d2860da05b4666c9f4764509034aa7da693.tar.gz
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
Diffstat (limited to 'libguile/read.c')
-rw-r--r--libguile/read.c117
1 files changed, 36 insertions, 81 deletions
diff --git a/libguile/read.c b/libguile/read.c
index 25aed5458..011684b3d 100644
--- a/libguile/read.c
+++ b/libguile/read.c
@@ -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;
- break;
- }
+ 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;
- }
- break;
- }
+ 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;
- }
- break;
- }
+ SCM_READ_HEX_ESCAPE (6);
+ break;
default:
bad_escaped:
scm_i_input_error (FUNC_NAME, port,