2006-02-01 Ludovic Courtès <ludovic.courtes@laas.fr>
[bpt/guile.git] / libguile / chars.c
CommitLineData
465380de 1/* Copyright (C) 1995,1996,1998, 2000, 2001, 2004 Free Software Foundation, Inc.
0f2d19dd 2 *
73be1d9e
MV
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
0f2d19dd 7 *
73be1d9e
MV
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
0f2d19dd 12 *
73be1d9e
MV
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
92205699 15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
73be1d9e 16 */
1bbd0b84 17
1bbd0b84 18
0f2d19dd
JB
19\f
20
0f2d19dd 21#include <ctype.h>
465380de 22#include <limits.h>
a0599745
MD
23#include "libguile/_scm.h"
24#include "libguile/validate.h"
0f2d19dd 25
a0599745 26#include "libguile/chars.h"
1fdbbd4c
MV
27#include "libguile/srfi-14.h"
28
0f2d19dd
JB
29\f
30
a1ec6916 31SCM_DEFINE (scm_char_p, "char?", 1, 0, 0,
1bbd0b84 32 (SCM x),
cdbc7418 33 "Return @code{#t} iff @var{x} is a character, else @code{#f}.")
1bbd0b84 34#define FUNC_NAME s_scm_char_p
0f2d19dd 35{
7888309b 36 return scm_from_bool (SCM_CHARP(x));
0f2d19dd 37}
1bbd0b84 38#undef FUNC_NAME
0f2d19dd 39
c3ee7520 40SCM_DEFINE1 (scm_char_eq_p, "char=?", scm_tc7_rpsubr,
1bbd0b84 41 (SCM x, SCM y),
cdbc7418 42 "Return @code{#t} iff @var{x} is the same character as @var{y}, else @code{#f}.")
1bbd0b84 43#define FUNC_NAME s_scm_char_eq_p
0f2d19dd 44{
362306b9
DH
45 SCM_VALIDATE_CHAR (1, x);
46 SCM_VALIDATE_CHAR (2, y);
bc36d050 47 return scm_from_bool (scm_is_eq (x, y));
0f2d19dd 48}
1bbd0b84 49#undef FUNC_NAME
0f2d19dd
JB
50
51
c3ee7520 52SCM_DEFINE1 (scm_char_less_p, "char<?", scm_tc7_rpsubr,
1bbd0b84 53 (SCM x, SCM y),
cdbc7418
NJ
54 "Return @code{#t} iff @var{x} is less than @var{y} in the ASCII sequence,\n"
55 "else @code{#f}.")
1bbd0b84 56#define FUNC_NAME s_scm_char_less_p
0f2d19dd 57{
34d19ef6
HWN
58 SCM_VALIDATE_CHAR (1, x);
59 SCM_VALIDATE_CHAR (2, y);
7888309b 60 return scm_from_bool (SCM_CHAR(x) < SCM_CHAR(y));
0f2d19dd 61}
1bbd0b84 62#undef FUNC_NAME
0f2d19dd 63
c3ee7520 64SCM_DEFINE1 (scm_char_leq_p, "char<=?", scm_tc7_rpsubr,
1bbd0b84 65 (SCM x, SCM y),
cdbc7418
NJ
66 "Return @code{#t} iff @var{x} is less than or equal to @var{y} in the\n"
67 "ASCII sequence, else @code{#f}.")
1bbd0b84 68#define FUNC_NAME s_scm_char_leq_p
0f2d19dd 69{
34d19ef6
HWN
70 SCM_VALIDATE_CHAR (1, x);
71 SCM_VALIDATE_CHAR (2, y);
7888309b 72 return scm_from_bool (SCM_CHAR(x) <= SCM_CHAR(y));
0f2d19dd 73}
1bbd0b84 74#undef FUNC_NAME
0f2d19dd 75
c3ee7520 76SCM_DEFINE1 (scm_char_gr_p, "char>?", scm_tc7_rpsubr,
1bbd0b84 77 (SCM x, SCM y),
cdbc7418
NJ
78 "Return @code{#t} iff @var{x} is greater than @var{y} in the ASCII\n"
79 "sequence, else @code{#f}.")
1bbd0b84 80#define FUNC_NAME s_scm_char_gr_p
0f2d19dd 81{
34d19ef6
HWN
82 SCM_VALIDATE_CHAR (1, x);
83 SCM_VALIDATE_CHAR (2, y);
7888309b 84 return scm_from_bool (SCM_CHAR(x) > SCM_CHAR(y));
0f2d19dd 85}
1bbd0b84 86#undef FUNC_NAME
0f2d19dd 87
c3ee7520 88SCM_DEFINE1 (scm_char_geq_p, "char>=?", scm_tc7_rpsubr,
1bbd0b84 89 (SCM x, SCM y),
cdbc7418
NJ
90 "Return @code{#t} iff @var{x} is greater than or equal to @var{y} in the\n"
91 "ASCII sequence, else @code{#f}.")
1bbd0b84 92#define FUNC_NAME s_scm_char_geq_p
0f2d19dd 93{
34d19ef6
HWN
94 SCM_VALIDATE_CHAR (1, x);
95 SCM_VALIDATE_CHAR (2, y);
7888309b 96 return scm_from_bool (SCM_CHAR(x) >= SCM_CHAR(y));
0f2d19dd 97}
1bbd0b84 98#undef FUNC_NAME
0f2d19dd 99
c3ee7520 100SCM_DEFINE1 (scm_char_ci_eq_p, "char-ci=?", scm_tc7_rpsubr,
1bbd0b84 101 (SCM x, SCM y),
cdbc7418
NJ
102 "Return @code{#t} iff @var{x} is the same character as @var{y} ignoring\n"
103 "case, else @code{#f}.")
1bbd0b84 104#define FUNC_NAME s_scm_char_ci_eq_p
0f2d19dd 105{
34d19ef6
HWN
106 SCM_VALIDATE_CHAR (1, x);
107 SCM_VALIDATE_CHAR (2, y);
7888309b 108 return scm_from_bool (scm_c_upcase(SCM_CHAR(x))==scm_c_upcase(SCM_CHAR(y)));
0f2d19dd 109}
1bbd0b84 110#undef FUNC_NAME
0f2d19dd 111
c3ee7520 112SCM_DEFINE1 (scm_char_ci_less_p, "char-ci<?", scm_tc7_rpsubr,
1bbd0b84 113 (SCM x, SCM y),
cdbc7418
NJ
114 "Return @code{#t} iff @var{x} is less than @var{y} in the ASCII sequence\n"
115 "ignoring case, else @code{#f}.")
1bbd0b84 116#define FUNC_NAME s_scm_char_ci_less_p
0f2d19dd 117{
34d19ef6
HWN
118 SCM_VALIDATE_CHAR (1, x);
119 SCM_VALIDATE_CHAR (2, y);
7888309b 120 return scm_from_bool ((scm_c_upcase(SCM_CHAR(x))) < scm_c_upcase(SCM_CHAR(y)));
0f2d19dd 121}
1bbd0b84 122#undef FUNC_NAME
0f2d19dd 123
c3ee7520 124SCM_DEFINE1 (scm_char_ci_leq_p, "char-ci<=?", scm_tc7_rpsubr,
1bbd0b84 125 (SCM x, SCM y),
cdbc7418
NJ
126 "Return @code{#t} iff @var{x} is less than or equal to @var{y} in the\n"
127 "ASCII sequence ignoring case, else @code{#f}.")
1bbd0b84 128#define FUNC_NAME s_scm_char_ci_leq_p
0f2d19dd 129{
34d19ef6
HWN
130 SCM_VALIDATE_CHAR (1, x);
131 SCM_VALIDATE_CHAR (2, y);
7888309b 132 return scm_from_bool (scm_c_upcase(SCM_CHAR(x)) <= scm_c_upcase(SCM_CHAR(y)));
0f2d19dd 133}
1bbd0b84 134#undef FUNC_NAME
0f2d19dd 135
c3ee7520 136SCM_DEFINE1 (scm_char_ci_gr_p, "char-ci>?", scm_tc7_rpsubr,
1bbd0b84 137 (SCM x, SCM y),
cdbc7418
NJ
138 "Return @code{#t} iff @var{x} is greater than @var{y} in the ASCII\n"
139 "sequence ignoring case, else @code{#f}.")
1bbd0b84 140#define FUNC_NAME s_scm_char_ci_gr_p
0f2d19dd 141{
34d19ef6
HWN
142 SCM_VALIDATE_CHAR (1, x);
143 SCM_VALIDATE_CHAR (2, y);
7888309b 144 return scm_from_bool (scm_c_upcase(SCM_CHAR(x)) > scm_c_upcase(SCM_CHAR(y)));
0f2d19dd 145}
1bbd0b84 146#undef FUNC_NAME
0f2d19dd 147
c3ee7520 148SCM_DEFINE1 (scm_char_ci_geq_p, "char-ci>=?", scm_tc7_rpsubr,
1bbd0b84 149 (SCM x, SCM y),
cdbc7418
NJ
150 "Return @code{#t} iff @var{x} is greater than or equal to @var{y} in the\n"
151 "ASCII sequence ignoring case, else @code{#f}.")
1bbd0b84 152#define FUNC_NAME s_scm_char_ci_geq_p
0f2d19dd 153{
34d19ef6
HWN
154 SCM_VALIDATE_CHAR (1, x);
155 SCM_VALIDATE_CHAR (2, y);
7888309b 156 return scm_from_bool (scm_c_upcase(SCM_CHAR(x)) >= scm_c_upcase(SCM_CHAR(y)));
0f2d19dd 157}
1bbd0b84 158#undef FUNC_NAME
0f2d19dd
JB
159
160
3b3b36dd 161SCM_DEFINE (scm_char_alphabetic_p, "char-alphabetic?", 1, 0, 0,
1bbd0b84 162 (SCM chr),
1fdbbd4c 163 "Return @code{#t} iff @var{chr} is alphabetic, else @code{#f}.\n")
1bbd0b84 164#define FUNC_NAME s_scm_char_alphabetic_p
0f2d19dd 165{
1fdbbd4c 166 return scm_char_set_contains_p (scm_char_set_letter, chr);
0f2d19dd 167}
1bbd0b84 168#undef FUNC_NAME
0f2d19dd 169
3b3b36dd 170SCM_DEFINE (scm_char_numeric_p, "char-numeric?", 1, 0, 0,
1bbd0b84 171 (SCM chr),
1fdbbd4c 172 "Return @code{#t} iff @var{chr} is numeric, else @code{#f}.\n")
1bbd0b84 173#define FUNC_NAME s_scm_char_numeric_p
0f2d19dd 174{
1fdbbd4c 175 return scm_char_set_contains_p (scm_char_set_digit, chr);
0f2d19dd 176}
1bbd0b84 177#undef FUNC_NAME
0f2d19dd 178
3b3b36dd 179SCM_DEFINE (scm_char_whitespace_p, "char-whitespace?", 1, 0, 0,
1bbd0b84 180 (SCM chr),
1fdbbd4c 181 "Return @code{#t} iff @var{chr} is whitespace, else @code{#f}.\n")
1bbd0b84 182#define FUNC_NAME s_scm_char_whitespace_p
0f2d19dd 183{
1fdbbd4c 184 return scm_char_set_contains_p (scm_char_set_whitespace, chr);
0f2d19dd 185}
1bbd0b84 186#undef FUNC_NAME
0f2d19dd
JB
187
188
189
3b3b36dd 190SCM_DEFINE (scm_char_upper_case_p, "char-upper-case?", 1, 0, 0,
1bbd0b84 191 (SCM chr),
1fdbbd4c 192 "Return @code{#t} iff @var{chr} is uppercase, else @code{#f}.\n")
1bbd0b84 193#define FUNC_NAME s_scm_char_upper_case_p
0f2d19dd 194{
1fdbbd4c 195 return scm_char_set_contains_p (scm_char_set_upper_case, chr);
0f2d19dd 196}
1bbd0b84 197#undef FUNC_NAME
0f2d19dd
JB
198
199
3b3b36dd 200SCM_DEFINE (scm_char_lower_case_p, "char-lower-case?", 1, 0, 0,
1bbd0b84 201 (SCM chr),
1fdbbd4c 202 "Return @code{#t} iff @var{chr} is lowercase, else @code{#f}.\n")
1bbd0b84 203#define FUNC_NAME s_scm_char_lower_case_p
0f2d19dd 204{
1fdbbd4c 205 return scm_char_set_contains_p (scm_char_set_lower_case, chr);
0f2d19dd 206}
1bbd0b84 207#undef FUNC_NAME
0f2d19dd
JB
208
209
210
a1ec6916 211SCM_DEFINE (scm_char_is_both_p, "char-is-both?", 1, 0, 0,
1bbd0b84 212 (SCM chr),
1fdbbd4c 213 "Return @code{#t} iff @var{chr} is either uppercase or lowercase, else @code{#f}.\n")
1bbd0b84 214#define FUNC_NAME s_scm_char_is_both_p
0f2d19dd 215{
1fdbbd4c
MV
216 if (scm_is_true (scm_char_set_contains_p (scm_char_set_lower_case, chr)))
217 return SCM_BOOL_T;
218 return scm_char_set_contains_p (scm_char_set_upper_case, chr);
0f2d19dd 219}
1bbd0b84 220#undef FUNC_NAME
0f2d19dd
JB
221
222
223
224
a1ec6916 225SCM_DEFINE (scm_char_to_integer, "char->integer", 1, 0, 0,
1bbd0b84 226 (SCM chr),
cdbc7418
NJ
227 "Return the number corresponding to ordinal position of @var{chr} in the\n"
228 "ASCII sequence.")
1bbd0b84 229#define FUNC_NAME s_scm_char_to_integer
0f2d19dd 230{
34d19ef6 231 SCM_VALIDATE_CHAR (1, chr);
b9bd8526 232 return scm_from_ulong (SCM_CHAR(chr));
0f2d19dd 233}
1bbd0b84 234#undef FUNC_NAME
0f2d19dd
JB
235
236
237
3b3b36dd 238SCM_DEFINE (scm_integer_to_char, "integer->char", 1, 0, 0,
1bbd0b84 239 (SCM n),
cdbc7418 240 "Return the character at position @var{n} in the ASCII sequence.")
1bbd0b84 241#define FUNC_NAME s_scm_integer_to_char
0f2d19dd 242{
a55c2b68 243 return SCM_MAKE_CHAR (scm_to_uchar (n));
0f2d19dd 244}
1bbd0b84 245#undef FUNC_NAME
0f2d19dd
JB
246
247
3b3b36dd 248SCM_DEFINE (scm_char_upcase, "char-upcase", 1, 0, 0,
1bbd0b84 249 (SCM chr),
cdbc7418 250 "Return the uppercase character version of @var{chr}.")
1bbd0b84 251#define FUNC_NAME s_scm_char_upcase
0f2d19dd 252{
34d19ef6 253 SCM_VALIDATE_CHAR (1, chr);
465380de 254 return SCM_MAKE_CHAR (toupper (SCM_CHAR (chr)));
0f2d19dd 255}
1bbd0b84 256#undef FUNC_NAME
0f2d19dd
JB
257
258
3b3b36dd 259SCM_DEFINE (scm_char_downcase, "char-downcase", 1, 0, 0,
1bbd0b84 260 (SCM chr),
cdbc7418 261 "Return the lowercase character version of @var{chr}.")
1bbd0b84 262#define FUNC_NAME s_scm_char_downcase
0f2d19dd 263{
34d19ef6 264 SCM_VALIDATE_CHAR (1, chr);
465380de 265 return SCM_MAKE_CHAR (tolower (SCM_CHAR(chr)));
0f2d19dd 266}
1bbd0b84 267#undef FUNC_NAME
0f2d19dd
JB
268
269\f
270
271
272
84fad130
HWN
273/*
274TODO: change name to scm_i_.. ? --hwn
275*/
276
1cc91f1b 277
0f2d19dd 278int
84fad130 279scm_c_upcase (unsigned int c)
0f2d19dd 280{
465380de
KR
281 if (c <= UCHAR_MAX)
282 return toupper (c);
0f2d19dd
JB
283 else
284 return c;
285}
286
1cc91f1b 287
0f2d19dd 288int
84fad130 289scm_c_downcase (unsigned int c)
0f2d19dd 290{
465380de
KR
291 if (c <= UCHAR_MAX)
292 return tolower (c);
0f2d19dd
JB
293 else
294 return c;
295}
296
297
298#ifdef _DCC
299# define ASCII
300#else
301# if (('\n'=='\025') && (' '=='\100') && ('a'=='\201') && ('A'=='\301'))
302# define EBCDIC
303# endif /* (('\n'=='\025') && (' '=='\100') && ('a'=='\201') && ('A'=='\301')) */
304# if (('\n'=='\012') && (' '=='\040') && ('a'=='\141') && ('A'=='\101'))
305# define ASCII
306# endif /* (('\n'=='\012') && (' '=='\040') && ('a'=='\141') && ('A'=='\101')) */
307#endif /* def _DCC */
308
309
310#ifdef EBCDIC
57e3a543 311char *const scm_charnames[] =
0f2d19dd 312{
34d19ef6
HWN
313 "nul", "soh", "stx", "etx", "pf", "ht", "lc", "del",
314 0 , 0 , "smm", "vt", "ff", "cr", "so", "si",
315 "dle", "dc1", "dc2", "dc3", "res", "nl", "bs", "il",
316 "can", "em", "cc", 0 , "ifs", "igs", "irs", "ius",
317 "ds", "sos", "fs", 0 , "byp", "lf", "eob", "pre",
318 0 , 0 , "sm", 0 , 0 , "enq", "ack", "bel",
319 0 , 0 , "syn", 0 , "pn", "rs", "uc", "eot",
320 0 , 0 , 0 , 0 , "dc4", "nak", 0 , "sub",
0f2d19dd
JB
321 "space", scm_s_newline, "tab", "backspace", "return", "page", "null"};
322
57e3a543 323const char scm_charnums[] =
0f2d19dd
JB
324"\000\001\002\003\004\005\006\007\
325\010\011\012\013\014\015\016\017\
326\020\021\022\023\024\025\026\027\
327\030\031\032\033\034\035\036\037\
328\040\041\042\043\044\045\046\047\
329\050\051\052\053\054\055\056\057\
330\060\061\062\063\064\065\066\067\
331\070\071\072\073\074\075\076\077\
332 \n\t\b\r\f\0";
333#endif /* def EBCDIC */
334#ifdef ASCII
57e3a543 335char *const scm_charnames[] =
0f2d19dd
JB
336{
337 "nul","soh","stx","etx","eot","enq","ack","bel",
35fd4394 338 "bs", "ht", "newline", "vt", "np", "cr", "so", "si",
0f2d19dd
JB
339 "dle","dc1","dc2","dc3","dc4","nak","syn","etb",
340 "can", "em","sub","esc", "fs", "gs", "rs", "us",
66842ba3 341 "space", "sp", "nl", "tab", "backspace", "return", "page", "null", "del"};
57e3a543 342const char scm_charnums[] =
0f2d19dd
JB
343"\000\001\002\003\004\005\006\007\
344\010\011\012\013\014\015\016\017\
345\020\021\022\023\024\025\026\027\
346\030\031\032\033\034\035\036\037\
66842ba3 347 \n\t\b\r\f\0\177";
0f2d19dd
JB
348#endif /* def ASCII */
349
350int scm_n_charnames = sizeof (scm_charnames) / sizeof (char *);
351
352
353\f
354
1cc91f1b 355
0f2d19dd
JB
356void
357scm_init_chars ()
0f2d19dd 358{
a0599745 359#include "libguile/chars.x"
0f2d19dd
JB
360}
361
89e00824
ML
362
363/*
364 Local Variables:
365 c-file-style: "gnu"
366 End:
367*/