summaryrefslogtreecommitdiff
path: root/libguile/chars.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/chars.c')
-rw-r--r--libguile/chars.c94
1 files changed, 62 insertions, 32 deletions
diff --git a/libguile/chars.c b/libguile/chars.c
index 16a2b90d6..2322db858 100644
--- a/libguile/chars.c
+++ b/libguile/chars.c
@@ -32,7 +32,7 @@
#include "libguile/chars.h"
#include "libguile/srfi-14.h"
-
+#include "libguile/private-options.h"
SCM_DEFINE (scm_char_p, "char?", 1, 0, 0,
@@ -561,6 +561,18 @@ static const scm_t_uint32 const scm_alt_charnums[] = {
#define SCM_N_ALT_CHARNAMES (sizeof (scm_alt_charnames) / sizeof (char *))
+static const char *const scm_r6rs_charnames[] = {
+ "nul", "alarm", "backspace", "tab", "linefeed", "newline",
+ "vtab", "page", "return", "esc", "space", "delete"
+};
+
+static const scm_t_uint32 const scm_r6rs_charnums[] = {
+ 0x00, 0x07, 0x08, 0x09, 0x0A, 0x0A,
+ 0x0B, 0x0C, 0x0D, 0x1B, 0x20, 0x7F
+};
+
+#define SCM_N_R6RS_CHARNAMES (sizeof (scm_r6rs_charnames) / sizeof (char *))
+
/* Returns the string charname for a character if it exists, or NULL
otherwise. */
const char *
@@ -569,18 +581,25 @@ scm_i_charname (SCM chr)
size_t c;
scm_t_uint32 i = SCM_CHAR (chr);
- for (c = 0; c < SCM_N_R5RS_CHARNAMES; c++)
- if (scm_r5rs_charnums[c] == i)
- return scm_r5rs_charnames[c];
-
- for (c = 0; c < SCM_N_C0_CONTROL_CHARNAMES; c++)
- if (scm_C0_control_charnums[c] == i)
- return scm_C0_control_charnames[c];
-
- for (c = 0; c < SCM_N_ALT_CHARNAMES; c++)
- if (scm_alt_charnums[c] == i)
- return scm_alt_charnames[i];
-
+ if (!SCM_R6RS_STRINGS_P)
+ {
+ for (c = 0; c < SCM_N_R5RS_CHARNAMES; c++)
+ if (scm_r5rs_charnums[c] == i)
+ return scm_r5rs_charnames[c];
+
+ for (c = 0; c < SCM_N_C0_CONTROL_CHARNAMES; c++)
+ if (scm_C0_control_charnums[c] == i)
+ return scm_C0_control_charnames[c];
+
+ for (c = 0; c < SCM_N_ALT_CHARNAMES; c++)
+ if (scm_alt_charnums[c] == i)
+ return scm_alt_charnames[i];
+ }
+ else
+ for (c = 0; c < SCM_N_R6RS_CHARNAMES; c++)
+ if (scm_r6rs_charnums[c] == i)
+ return scm_r6rs_charnames[c];
+
return NULL;
}
@@ -590,25 +609,36 @@ scm_i_charname_to_char (const char *charname, size_t charname_len)
{
size_t c;
- /* The R5RS charnames. These are supposed to be case
- insensitive. */
- for (c = 0; c < SCM_N_R5RS_CHARNAMES; c++)
- if ((strlen (scm_r5rs_charnames[c]) == charname_len)
- && (!strncasecmp (scm_r5rs_charnames[c], charname, charname_len)))
- return SCM_MAKE_CHAR (scm_r5rs_charnums[c]);
-
- /* Then come the controls. These are not case sensitive. */
- for (c = 0; c < SCM_N_C0_CONTROL_CHARNAMES; c++)
- if ((strlen (scm_C0_control_charnames[c]) == charname_len)
- && (!strncasecmp (scm_C0_control_charnames[c], charname, charname_len)))
- return SCM_MAKE_CHAR (scm_C0_control_charnums[c]);
-
- /* Lastly are some old names carried over for compatibility. */
- for (c = 0; c < SCM_N_ALT_CHARNAMES; c++)
- if ((strlen (scm_alt_charnames[c]) == charname_len)
- && (!strncasecmp (scm_alt_charnames[c], charname, charname_len)))
- return SCM_MAKE_CHAR (scm_alt_charnums[c]);
-
+ if (!SCM_R6RS_STRINGS_P)
+ {
+ /* The R5RS charnames. These are supposed to be case
+ insensitive. */
+ for (c = 0; c < SCM_N_R5RS_CHARNAMES; c++)
+ if ((strlen (scm_r5rs_charnames[c]) == charname_len)
+ && (!strncasecmp (scm_r5rs_charnames[c], charname,
+ charname_len)))
+ return SCM_MAKE_CHAR (scm_r5rs_charnums[c]);
+
+ /* Then come the controls. These are not case sensitive. */
+ for (c = 0; c < SCM_N_C0_CONTROL_CHARNAMES; c++)
+ if ((strlen (scm_C0_control_charnames[c]) == charname_len)
+ && (!strncasecmp (scm_C0_control_charnames[c], charname,
+ charname_len)))
+ return SCM_MAKE_CHAR (scm_C0_control_charnums[c]);
+
+ /* Lastly are some old names carried over for compatibility. */
+ for (c = 0; c < SCM_N_ALT_CHARNAMES; c++)
+ if ((strlen (scm_alt_charnames[c]) == charname_len)
+ && (!strncasecmp (scm_alt_charnames[c], charname, charname_len)))
+ return SCM_MAKE_CHAR (scm_alt_charnums[c]);
+ }
+ else
+ /* The strict R6RS charnames. These are case sensitive. */
+ for (c = 0; c < SCM_N_R6RS_CHARNAMES; c++)
+ if ((strlen (scm_r6rs_charnames[c]) == charname_len)
+ && (!strncmp (scm_r6rs_charnames[c], charname, charname_len)))
+ return SCM_MAKE_CHAR (scm_r6rs_charnums[c]);
+
return SCM_BOOL_F;
}