*** empty log message ***
[bpt/guile.git] / libguile / chars.c
CommitLineData
58ade102 1/* Copyright (C) 1995,1996,1998, 2000, 2001 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
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
1bbd0b84 17
1bbd0b84 18
0f2d19dd
JB
19\f
20
0f2d19dd 21#include <ctype.h>
a0599745
MD
22#include "libguile/_scm.h"
23#include "libguile/validate.h"
0f2d19dd 24
a0599745 25#include "libguile/chars.h"
0f2d19dd
JB
26\f
27
a1ec6916 28SCM_DEFINE (scm_char_p, "char?", 1, 0, 0,
1bbd0b84 29 (SCM x),
cdbc7418 30 "Return @code{#t} iff @var{x} is a character, else @code{#f}.")
1bbd0b84 31#define FUNC_NAME s_scm_char_p
0f2d19dd 32{
7866a09b 33 return SCM_BOOL(SCM_CHARP(x));
0f2d19dd 34}
1bbd0b84 35#undef FUNC_NAME
0f2d19dd 36
c3ee7520 37SCM_DEFINE1 (scm_char_eq_p, "char=?", scm_tc7_rpsubr,
1bbd0b84 38 (SCM x, SCM y),
cdbc7418 39 "Return @code{#t} iff @var{x} is the same character as @var{y}, else @code{#f}.")
1bbd0b84 40#define FUNC_NAME s_scm_char_eq_p
0f2d19dd 41{
362306b9
DH
42 SCM_VALIDATE_CHAR (1, x);
43 SCM_VALIDATE_CHAR (2, y);
44 return SCM_BOOL (SCM_EQ_P (x, y));
0f2d19dd 45}
1bbd0b84 46#undef FUNC_NAME
0f2d19dd
JB
47
48
c3ee7520 49SCM_DEFINE1 (scm_char_less_p, "char<?", scm_tc7_rpsubr,
1bbd0b84 50 (SCM x, SCM y),
cdbc7418
NJ
51 "Return @code{#t} iff @var{x} is less than @var{y} in the ASCII sequence,\n"
52 "else @code{#f}.")
1bbd0b84 53#define FUNC_NAME s_scm_char_less_p
0f2d19dd 54{
34d19ef6
HWN
55 SCM_VALIDATE_CHAR (1, x);
56 SCM_VALIDATE_CHAR (2, y);
7866a09b 57 return SCM_BOOL(SCM_CHAR(x) < SCM_CHAR(y));
0f2d19dd 58}
1bbd0b84 59#undef FUNC_NAME
0f2d19dd 60
c3ee7520 61SCM_DEFINE1 (scm_char_leq_p, "char<=?", scm_tc7_rpsubr,
1bbd0b84 62 (SCM x, SCM y),
cdbc7418
NJ
63 "Return @code{#t} iff @var{x} is less than or equal to @var{y} in the\n"
64 "ASCII sequence, else @code{#f}.")
1bbd0b84 65#define FUNC_NAME s_scm_char_leq_p
0f2d19dd 66{
34d19ef6
HWN
67 SCM_VALIDATE_CHAR (1, x);
68 SCM_VALIDATE_CHAR (2, y);
7866a09b 69 return SCM_BOOL(SCM_CHAR(x) <= SCM_CHAR(y));
0f2d19dd 70}
1bbd0b84 71#undef FUNC_NAME
0f2d19dd 72
c3ee7520 73SCM_DEFINE1 (scm_char_gr_p, "char>?", scm_tc7_rpsubr,
1bbd0b84 74 (SCM x, SCM y),
cdbc7418
NJ
75 "Return @code{#t} iff @var{x} is greater than @var{y} in the ASCII\n"
76 "sequence, else @code{#f}.")
1bbd0b84 77#define FUNC_NAME s_scm_char_gr_p
0f2d19dd 78{
34d19ef6
HWN
79 SCM_VALIDATE_CHAR (1, x);
80 SCM_VALIDATE_CHAR (2, y);
7866a09b 81 return SCM_BOOL(SCM_CHAR(x) > SCM_CHAR(y));
0f2d19dd 82}
1bbd0b84 83#undef FUNC_NAME
0f2d19dd 84
c3ee7520 85SCM_DEFINE1 (scm_char_geq_p, "char>=?", scm_tc7_rpsubr,
1bbd0b84 86 (SCM x, SCM y),
cdbc7418
NJ
87 "Return @code{#t} iff @var{x} is greater than or equal to @var{y} in the\n"
88 "ASCII sequence, else @code{#f}.")
1bbd0b84 89#define FUNC_NAME s_scm_char_geq_p
0f2d19dd 90{
34d19ef6
HWN
91 SCM_VALIDATE_CHAR (1, x);
92 SCM_VALIDATE_CHAR (2, y);
7866a09b 93 return SCM_BOOL(SCM_CHAR(x) >= SCM_CHAR(y));
0f2d19dd 94}
1bbd0b84 95#undef FUNC_NAME
0f2d19dd 96
c3ee7520 97SCM_DEFINE1 (scm_char_ci_eq_p, "char-ci=?", scm_tc7_rpsubr,
1bbd0b84 98 (SCM x, SCM y),
cdbc7418
NJ
99 "Return @code{#t} iff @var{x} is the same character as @var{y} ignoring\n"
100 "case, else @code{#f}.")
1bbd0b84 101#define FUNC_NAME s_scm_char_ci_eq_p
0f2d19dd 102{
34d19ef6
HWN
103 SCM_VALIDATE_CHAR (1, x);
104 SCM_VALIDATE_CHAR (2, y);
7866a09b 105 return SCM_BOOL(scm_upcase(SCM_CHAR(x))==scm_upcase(SCM_CHAR(y)));
0f2d19dd 106}
1bbd0b84 107#undef FUNC_NAME
0f2d19dd 108
c3ee7520 109SCM_DEFINE1 (scm_char_ci_less_p, "char-ci<?", scm_tc7_rpsubr,
1bbd0b84 110 (SCM x, SCM y),
cdbc7418
NJ
111 "Return @code{#t} iff @var{x} is less than @var{y} in the ASCII sequence\n"
112 "ignoring case, else @code{#f}.")
1bbd0b84 113#define FUNC_NAME s_scm_char_ci_less_p
0f2d19dd 114{
34d19ef6
HWN
115 SCM_VALIDATE_CHAR (1, x);
116 SCM_VALIDATE_CHAR (2, y);
7866a09b 117 return SCM_BOOL((scm_upcase(SCM_CHAR(x))) < scm_upcase(SCM_CHAR(y)));
0f2d19dd 118}
1bbd0b84 119#undef FUNC_NAME
0f2d19dd 120
c3ee7520 121SCM_DEFINE1 (scm_char_ci_leq_p, "char-ci<=?", scm_tc7_rpsubr,
1bbd0b84 122 (SCM x, SCM y),
cdbc7418
NJ
123 "Return @code{#t} iff @var{x} is less than or equal to @var{y} in the\n"
124 "ASCII sequence ignoring case, else @code{#f}.")
1bbd0b84 125#define FUNC_NAME s_scm_char_ci_leq_p
0f2d19dd 126{
34d19ef6
HWN
127 SCM_VALIDATE_CHAR (1, x);
128 SCM_VALIDATE_CHAR (2, y);
7866a09b 129 return SCM_BOOL(scm_upcase(SCM_CHAR(x)) <= scm_upcase(SCM_CHAR(y)));
0f2d19dd 130}
1bbd0b84 131#undef FUNC_NAME
0f2d19dd 132
c3ee7520 133SCM_DEFINE1 (scm_char_ci_gr_p, "char-ci>?", scm_tc7_rpsubr,
1bbd0b84 134 (SCM x, SCM y),
cdbc7418
NJ
135 "Return @code{#t} iff @var{x} is greater than @var{y} in the ASCII\n"
136 "sequence ignoring case, else @code{#f}.")
1bbd0b84 137#define FUNC_NAME s_scm_char_ci_gr_p
0f2d19dd 138{
34d19ef6
HWN
139 SCM_VALIDATE_CHAR (1, x);
140 SCM_VALIDATE_CHAR (2, y);
7866a09b 141 return SCM_BOOL(scm_upcase(SCM_CHAR(x)) > scm_upcase(SCM_CHAR(y)));
0f2d19dd 142}
1bbd0b84 143#undef FUNC_NAME
0f2d19dd 144
c3ee7520 145SCM_DEFINE1 (scm_char_ci_geq_p, "char-ci>=?", scm_tc7_rpsubr,
1bbd0b84 146 (SCM x, SCM y),
cdbc7418
NJ
147 "Return @code{#t} iff @var{x} is greater than or equal to @var{y} in the\n"
148 "ASCII sequence ignoring case, else @code{#f}.")
1bbd0b84 149#define FUNC_NAME s_scm_char_ci_geq_p
0f2d19dd 150{
34d19ef6
HWN
151 SCM_VALIDATE_CHAR (1, x);
152 SCM_VALIDATE_CHAR (2, y);
7866a09b 153 return SCM_BOOL(scm_upcase(SCM_CHAR(x)) >= scm_upcase(SCM_CHAR(y)));
0f2d19dd 154}
1bbd0b84 155#undef FUNC_NAME
0f2d19dd
JB
156
157
3b3b36dd 158SCM_DEFINE (scm_char_alphabetic_p, "char-alphabetic?", 1, 0, 0,
1bbd0b84 159 (SCM chr),
cdbc7418 160 "Return @code{#t} iff @var{chr} is alphabetic, else @code{#f}.\n"
b380b885 161 "Alphabetic means the same thing as the isalpha C library function.")
1bbd0b84 162#define FUNC_NAME s_scm_char_alphabetic_p
0f2d19dd 163{
34d19ef6 164 SCM_VALIDATE_CHAR (1, chr);
ccbd262b 165 return SCM_BOOL(isalpha(SCM_CHAR(chr)));
0f2d19dd 166}
1bbd0b84 167#undef FUNC_NAME
0f2d19dd 168
3b3b36dd 169SCM_DEFINE (scm_char_numeric_p, "char-numeric?", 1, 0, 0,
1bbd0b84 170 (SCM chr),
cdbc7418 171 "Return @code{#t} iff @var{chr} is numeric, else @code{#f}.\n"
b380b885 172 "Numeric means the same thing as the isdigit C library function.")
1bbd0b84 173#define FUNC_NAME s_scm_char_numeric_p
0f2d19dd 174{
34d19ef6 175 SCM_VALIDATE_CHAR (1, chr);
ccbd262b 176 return SCM_BOOL(isdigit(SCM_CHAR(chr)));
0f2d19dd 177}
1bbd0b84 178#undef FUNC_NAME
0f2d19dd 179
3b3b36dd 180SCM_DEFINE (scm_char_whitespace_p, "char-whitespace?", 1, 0, 0,
1bbd0b84 181 (SCM chr),
cdbc7418 182 "Return @code{#t} iff @var{chr} is whitespace, else @code{#f}.\n"
b380b885 183 "Whitespace means the same thing as the isspace C library function.")
1bbd0b84 184#define FUNC_NAME s_scm_char_whitespace_p
0f2d19dd 185{
34d19ef6 186 SCM_VALIDATE_CHAR (1, chr);
ccbd262b 187 return SCM_BOOL(isspace(SCM_CHAR(chr)));
0f2d19dd 188}
1bbd0b84 189#undef FUNC_NAME
0f2d19dd
JB
190
191
192
3b3b36dd 193SCM_DEFINE (scm_char_upper_case_p, "char-upper-case?", 1, 0, 0,
1bbd0b84 194 (SCM chr),
cdbc7418 195 "Return @code{#t} iff @var{chr} is uppercase, else @code{#f}.\n"
b380b885 196 "Uppercase means the same thing as the isupper C library function.")
1bbd0b84 197#define FUNC_NAME s_scm_char_upper_case_p
0f2d19dd 198{
34d19ef6 199 SCM_VALIDATE_CHAR (1, chr);
ccbd262b 200 return SCM_BOOL(isupper(SCM_CHAR(chr)));
0f2d19dd 201}
1bbd0b84 202#undef FUNC_NAME
0f2d19dd
JB
203
204
3b3b36dd 205SCM_DEFINE (scm_char_lower_case_p, "char-lower-case?", 1, 0, 0,
1bbd0b84 206 (SCM chr),
cdbc7418 207 "Return @code{#t} iff @var{chr} is lowercase, else @code{#f}.\n"
b380b885 208 "Lowercase means the same thing as the islower C library function.")
1bbd0b84 209#define FUNC_NAME s_scm_char_lower_case_p
0f2d19dd 210{
34d19ef6 211 SCM_VALIDATE_CHAR (1, chr);
ccbd262b 212 return SCM_BOOL(islower(SCM_CHAR(chr)));
0f2d19dd 213}
1bbd0b84 214#undef FUNC_NAME
0f2d19dd
JB
215
216
217
a1ec6916 218SCM_DEFINE (scm_char_is_both_p, "char-is-both?", 1, 0, 0,
1bbd0b84 219 (SCM chr),
cdbc7418 220 "Return @code{#t} iff @var{chr} is either uppercase or lowercase, else @code{#f}.\n"
b380b885
MD
221 "Uppercase and lowercase are as defined by the isupper and islower\n"
222 "C library functions.")
1bbd0b84 223#define FUNC_NAME s_scm_char_is_both_p
0f2d19dd 224{
34d19ef6 225 SCM_VALIDATE_CHAR (1, chr);
ccbd262b 226 return SCM_BOOL((isupper(SCM_CHAR(chr)) || islower(SCM_CHAR(chr))));
0f2d19dd 227}
1bbd0b84 228#undef FUNC_NAME
0f2d19dd
JB
229
230
231
232
a1ec6916 233SCM_DEFINE (scm_char_to_integer, "char->integer", 1, 0, 0,
1bbd0b84 234 (SCM chr),
cdbc7418
NJ
235 "Return the number corresponding to ordinal position of @var{chr} in the\n"
236 "ASCII sequence.")
1bbd0b84 237#define FUNC_NAME s_scm_char_to_integer
0f2d19dd 238{
34d19ef6 239 SCM_VALIDATE_CHAR (1, chr);
7866a09b 240 return scm_ulong2num((unsigned long)SCM_CHAR(chr));
0f2d19dd 241}
1bbd0b84 242#undef FUNC_NAME
0f2d19dd
JB
243
244
245
3b3b36dd 246SCM_DEFINE (scm_integer_to_char, "integer->char", 1, 0, 0,
1bbd0b84 247 (SCM n),
cdbc7418 248 "Return the character at position @var{n} in the ASCII sequence.")
1bbd0b84 249#define FUNC_NAME s_scm_integer_to_char
0f2d19dd 250{
90e49489 251 SCM_VALIDATE_INUM_RANGE (1, n, 0, 256);
7866a09b 252 return SCM_MAKE_CHAR (SCM_INUM (n));
0f2d19dd 253}
1bbd0b84 254#undef FUNC_NAME
0f2d19dd
JB
255
256
3b3b36dd 257SCM_DEFINE (scm_char_upcase, "char-upcase", 1, 0, 0,
1bbd0b84 258 (SCM chr),
cdbc7418 259 "Return the uppercase character version of @var{chr}.")
1bbd0b84 260#define FUNC_NAME s_scm_char_upcase
0f2d19dd 261{
34d19ef6 262 SCM_VALIDATE_CHAR (1, chr);
7866a09b 263 return SCM_MAKE_CHAR(scm_upcase(SCM_CHAR(chr)));
0f2d19dd 264}
1bbd0b84 265#undef FUNC_NAME
0f2d19dd
JB
266
267
3b3b36dd 268SCM_DEFINE (scm_char_downcase, "char-downcase", 1, 0, 0,
1bbd0b84 269 (SCM chr),
cdbc7418 270 "Return the lowercase character version of @var{chr}.")
1bbd0b84 271#define FUNC_NAME s_scm_char_downcase
0f2d19dd 272{
34d19ef6 273 SCM_VALIDATE_CHAR (1, chr);
7866a09b 274 return SCM_MAKE_CHAR(scm_downcase(SCM_CHAR(chr)));
0f2d19dd 275}
1bbd0b84 276#undef FUNC_NAME
0f2d19dd
JB
277
278\f
279
280
281
e2806c10
MD
282static unsigned char scm_upcase_table[SCM_CHAR_CODE_LIMIT];
283static unsigned char scm_downcase_table[SCM_CHAR_CODE_LIMIT];
57e3a543
JB
284static const unsigned char scm_lowers[] = "abcdefghijklmnopqrstuvwxyz";
285static const unsigned char scm_uppers[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
0f2d19dd 286
1cc91f1b 287
0f2d19dd
JB
288void
289scm_tables_prehistory ()
0f2d19dd
JB
290{
291 int i;
e2806c10 292 for (i = 0; i < SCM_CHAR_CODE_LIMIT; i++)
0f2d19dd 293 scm_upcase_table[i] = scm_downcase_table[i] = i;
77364130 294 for (i = 0; i < (int) (sizeof scm_lowers / sizeof (scm_lowers[0])); i++)
0f2d19dd
JB
295 {
296 scm_upcase_table[scm_lowers[i]] = scm_uppers[i];
297 scm_downcase_table[scm_uppers[i]] = scm_lowers[i];
298 }
299}
300
1cc91f1b 301
0f2d19dd 302int
6e8d25a6 303scm_upcase (unsigned int c)
0f2d19dd
JB
304{
305 if (c < sizeof (scm_upcase_table))
306 return scm_upcase_table[c];
307 else
308 return c;
309}
310
1cc91f1b 311
0f2d19dd 312int
6e8d25a6 313scm_downcase (unsigned int c)
0f2d19dd
JB
314{
315 if (c < sizeof (scm_downcase_table))
316 return scm_downcase_table[c];
317 else
318 return c;
319}
320
321
322#ifdef _DCC
323# define ASCII
324#else
325# if (('\n'=='\025') && (' '=='\100') && ('a'=='\201') && ('A'=='\301'))
326# define EBCDIC
327# endif /* (('\n'=='\025') && (' '=='\100') && ('a'=='\201') && ('A'=='\301')) */
328# if (('\n'=='\012') && (' '=='\040') && ('a'=='\141') && ('A'=='\101'))
329# define ASCII
330# endif /* (('\n'=='\012') && (' '=='\040') && ('a'=='\141') && ('A'=='\101')) */
331#endif /* def _DCC */
332
333
334#ifdef EBCDIC
57e3a543 335char *const scm_charnames[] =
0f2d19dd 336{
34d19ef6
HWN
337 "nul", "soh", "stx", "etx", "pf", "ht", "lc", "del",
338 0 , 0 , "smm", "vt", "ff", "cr", "so", "si",
339 "dle", "dc1", "dc2", "dc3", "res", "nl", "bs", "il",
340 "can", "em", "cc", 0 , "ifs", "igs", "irs", "ius",
341 "ds", "sos", "fs", 0 , "byp", "lf", "eob", "pre",
342 0 , 0 , "sm", 0 , 0 , "enq", "ack", "bel",
343 0 , 0 , "syn", 0 , "pn", "rs", "uc", "eot",
344 0 , 0 , 0 , 0 , "dc4", "nak", 0 , "sub",
0f2d19dd
JB
345 "space", scm_s_newline, "tab", "backspace", "return", "page", "null"};
346
57e3a543 347const char scm_charnums[] =
0f2d19dd
JB
348"\000\001\002\003\004\005\006\007\
349\010\011\012\013\014\015\016\017\
350\020\021\022\023\024\025\026\027\
351\030\031\032\033\034\035\036\037\
352\040\041\042\043\044\045\046\047\
353\050\051\052\053\054\055\056\057\
354\060\061\062\063\064\065\066\067\
355\070\071\072\073\074\075\076\077\
356 \n\t\b\r\f\0";
357#endif /* def EBCDIC */
358#ifdef ASCII
57e3a543 359char *const scm_charnames[] =
0f2d19dd
JB
360{
361 "nul","soh","stx","etx","eot","enq","ack","bel",
35fd4394 362 "bs", "ht", "newline", "vt", "np", "cr", "so", "si",
0f2d19dd
JB
363 "dle","dc1","dc2","dc3","dc4","nak","syn","etb",
364 "can", "em","sub","esc", "fs", "gs", "rs", "us",
35fd4394 365 "space", "nl", "tab", "backspace", "return", "page", "null", "del"};
57e3a543 366const char scm_charnums[] =
0f2d19dd
JB
367"\000\001\002\003\004\005\006\007\
368\010\011\012\013\014\015\016\017\
369\020\021\022\023\024\025\026\027\
370\030\031\032\033\034\035\036\037\
371 \n\t\b\r\f\0\177";
372#endif /* def ASCII */
373
374int scm_n_charnames = sizeof (scm_charnames) / sizeof (char *);
375
376
377\f
378
1cc91f1b 379
0f2d19dd
JB
380void
381scm_init_chars ()
0f2d19dd 382{
a0599745 383#include "libguile/chars.x"
0f2d19dd
JB
384}
385
89e00824
ML
386
387/*
388 Local Variables:
389 c-file-style: "gnu"
390 End:
391*/