diff options
author | Andy Wingo <wingo@pobox.com> | 2014-09-12 17:00:59 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-09-12 17:00:59 +0200 |
commit | c5ea75534c683638fb1f3b328efe6ba0d242e485 (patch) | |
tree | 657b4fc7a585b54c4d05c8ec703241ca94562bd9 /libguile/unicode.c | |
parent | 7f5887e70b632d49b52679f383eff07d656e59a3 (diff) | |
download | guile-c5ea75534c683638fb1f3b328efe6ba0d242e485.tar.gz |
Add (ice-9 unicode) module
* libguile/unicode.c:
* libguile/unicode.h:
* test-suite/tests/unicode.test:
* module/ice-9/unicode.scm: New files.
* module/Makefile.am:
* libguile/Makefile.am:
* test-suite/Makefile.am:
* libguile/init.c: Wire new files into the build.
* doc/ref/api-data.texi: Add docs.
Diffstat (limited to 'libguile/unicode.c')
-rw-r--r-- | libguile/unicode.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/libguile/unicode.c b/libguile/unicode.c new file mode 100644 index 000000000..65d319a1d --- /dev/null +++ b/libguile/unicode.c @@ -0,0 +1,95 @@ +/* Copyright (C) 2014 Free Software Foundation, Inc. + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <ctype.h> +#include <limits.h> +#include <unicase.h> +#include <unictype.h> +#include <uniname.h> + +#include "libguile/_scm.h" +#include "libguile/validate.h" + +#include "libguile/unicode.h" + + + +SCM_DEFINE (scm_char_to_formal_name, "char->formal-name", 1, 0, 0, + (SCM ch), + "Return the formal all-upper-case unicode name of @var{ch},\n" + "as a string. If the character has no name, return @code{#f}.") +#define FUNC_NAME s_scm_char_to_formal_name +{ + char buf[UNINAME_MAX + 1]; + + SCM_VALIDATE_CHAR (1, ch); + + memset(buf, 0, UNINAME_MAX + 1); + + if (unicode_character_name (SCM_CHAR (ch), buf)) + return scm_from_latin1_string (buf); + + return SCM_BOOL_F; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_formal_name_to_char, "formal-name->char", 1, 0, 0, + (SCM name), + "Return the character whose formal all-upper-case unicode name is\n" + "@var{name}, or @code{#f} if no such character is known.") +#define FUNC_NAME s_scm_formal_name_to_char +{ + char *c_name; + scm_t_wchar ret; + + SCM_VALIDATE_STRING (1, name); + + c_name = scm_to_latin1_string (name); + ret = unicode_name_character (c_name); + free (c_name); + + return ret == UNINAME_INVALID ? SCM_BOOL_F : SCM_MAKE_CHAR (ret); +} +#undef FUNC_NAME + +static void +scm_load_unicode (void) +{ +#ifndef SCM_MAGIC_SNARFER +#include "libguile/unicode.x" +#endif +} + +void +scm_init_unicode (void) +{ + scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION, + "scm_init_unicode", + (scm_t_extension_init_func)scm_load_unicode, + NULL); +} + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ |