* Replace a bunch of calls to SCM_LENGTH.
[bpt/guile.git] / libguile / strop.c
CommitLineData
0f2d19dd
JB
1/* classes: src_files */
2
f2c9fcb0 3/* Copyright (C) 1994, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
0f2d19dd
JB
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation; either version 2, or (at your option)
8any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
82892bed
JB
16along with this software; see the file COPYING. If not, write to the
17Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
1802111-1307 USA */
0f2d19dd 19
1bbd0b84
GB
20/* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
21 gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
22
23
0f2d19dd
JB
24\f
25
26#include <stdio.h>
a0599745
MD
27#include "libguile/_scm.h"
28#include "libguile/chars.h"
29#include "libguile/strings.h"
0f2d19dd 30
a0599745
MD
31#include "libguile/validate.h"
32#include "libguile/strop.h"
33#include "libguile/read.h" /*For SCM_CASE_INSENSITIVE_P*/
bd9e24b3
GH
34
35#ifdef HAVE_STRING_H
36#include <string.h>
37#endif
38
0f2d19dd
JB
39\f
40
6552dbf7 41/*
0821c4f6 42xSCM_DEFINE (scm_i_index, "i-index", 2, 2, 0,
6552dbf7
GB
43 (SCM str, SCM chr, SCM frm, SCM to),
44 "@deftypefn {Internal C Function} {static int} scm_i_index (SCM *@var{str}, \n"
45 "SCM @var{chr}, int @var{direction}, SCM @var{sub_start}, SCM @var{sub_end}, char *@var{why})
46 "This is a workhorse function that performs either an @code{index} or\n"
47 "@code{rindex} function, depending on the value of @var{direction}. I'm\n"
48 "not at all clear on the usage of the pos arguments, though the purpose\n"
49 "seems to be correct reporting of which argument values are reporting\n"
50 "errors. Why you would do that, rather than just use @code{SCM_ARG[1234]}\n"
51 "explicitly is beyond me. Anyone holding any enlightenment?"
52*/
03bc4386
GH
53/* implements index if direction > 0 otherwise rindex. */
54static int
99a9952d
JB
55scm_i_index (SCM *str, SCM chr, int direction, SCM sub_start,
56 SCM sub_end, const char *why)
0f2d19dd
JB
57{
58 unsigned char * p;
59 int x;
03bc4386
GH
60 int lower;
61 int upper;
0f2d19dd
JB
62 int ch;
63
0c95b57d 64 SCM_ASSERT (SCM_ROSTRINGP (*str), *str, SCM_ARG1, why);
7866a09b 65 SCM_ASSERT (SCM_CHARP (chr), chr, SCM_ARG2, why);
0f2d19dd 66
54778cd3 67 if (SCM_FALSEP (sub_start))
0f2d19dd 68 sub_start = SCM_MAKINUM (0);
03bc4386 69
99a9952d 70 SCM_ASSERT (SCM_INUMP (sub_start), sub_start, SCM_ARG3, why);
03bc4386
GH
71 lower = SCM_INUM (sub_start);
72 if (lower < 0
67ec3667 73 || lower > SCM_ROLENGTH (*str))
03bc4386 74 scm_out_of_range (why, sub_start);
0f2d19dd 75
54778cd3 76 if (SCM_FALSEP (sub_end))
0f2d19dd 77 sub_end = SCM_MAKINUM (SCM_ROLENGTH (*str));
03bc4386 78
99a9952d 79 SCM_ASSERT (SCM_INUMP (sub_end), sub_end, SCM_ARG4, why);
03bc4386
GH
80 upper = SCM_INUM (sub_end);
81 if (upper < SCM_INUM (sub_start)
82 || upper > SCM_ROLENGTH (*str))
83 scm_out_of_range (why, sub_end);
84
85 if (direction > 0)
86 {
87 p = (unsigned char *)SCM_ROCHARS (*str) + lower;
7866a09b 88 ch = SCM_CHAR (chr);
03bc4386
GH
89
90 for (x = SCM_INUM (sub_start); x < upper; ++x, ++p)
91 if (*p == ch)
92 return x;
93 }
0f2d19dd 94 else
03bc4386
GH
95 {
96 p = upper - 1 + (unsigned char *)SCM_ROCHARS (*str);
7866a09b 97 ch = SCM_CHAR (chr);
03bc4386
GH
98 for (x = upper - 1; x >= lower; --x, --p)
99 if (*p == ch)
100 return x;
101 }
0f2d19dd
JB
102
103 return -1;
104}
105
3b3b36dd 106SCM_DEFINE (scm_string_index, "string-index", 2, 2, 0,
1bbd0b84 107 (SCM str, SCM chr, SCM frm, SCM to),
b380b885
MD
108 "Return the index of the first occurrence of @var{chr} in @var{str}. The\n"
109 "optional integer arguments @var{frm} and @var{to} limit the search to\n"
110 "a portion of the string. This procedure essentially implements the\n"
6552dbf7
GB
111 "@code{index} or @code{strchr} functions from the C library.\n\n"
112 "(qdocs:) Returns the index of @var{char} in @var{str}, or @code{#f} if the\n"
113 "@var{char} isn't in @var{str}. If @var{frm} is given and not @code{#f},\n"
114 "it is used as the starting index; if @var{to} is given and not @var{#f},\n"
115 "it is used as the ending index (exclusive).\n\n"
116 "@example\n"
1670bef9 117 "(string-index \"weiner\" #\\e)\n"
6552dbf7 118 "@result{} 1\n\n"
1670bef9 119 "(string-index \"weiner\" #\\e 2)\n"
6552dbf7 120 "@result{} 4\n\n"
1670bef9 121 "(string-index \"weiner\" #\\e 2 4)\n"
6552dbf7
GB
122 "@result{} #f\n"
123 "@end example")
1bbd0b84 124#define FUNC_NAME s_scm_string_index
0f2d19dd
JB
125{
126 int pos;
127
54778cd3 128 if (SCM_UNBNDP (frm))
0f2d19dd 129 frm = SCM_BOOL_F;
54778cd3 130 if (SCM_UNBNDP (to))
0f2d19dd 131 to = SCM_BOOL_F;
1bbd0b84 132 pos = scm_i_index (&str, chr, 1, frm, to, FUNC_NAME);
0f2d19dd
JB
133 return (pos < 0
134 ? SCM_BOOL_F
135 : SCM_MAKINUM (pos));
136}
1bbd0b84 137#undef FUNC_NAME
0f2d19dd 138
3b3b36dd 139SCM_DEFINE (scm_string_rindex, "string-rindex", 2, 2, 0,
1bbd0b84 140 (SCM str, SCM chr, SCM frm, SCM to),
b380b885
MD
141 "Like @code{string-index}, but search from the right of the string rather\n"
142 "than from the left. This procedure essentially implements the\n"
6552dbf7
GB
143 "@code{rindex} or @code{strrchr} functions from the C library.\n\n"
144 "(qdocs:) The same as @code{string-index}, except it gives the rightmost occurance\n"
145 "of @var{char} in the range [@var{frm}, @var{to}-1], which defaults to\n"
146 "the entire string.\n\n"
147 "@example\n"
1670bef9 148 "(string-rindex \"weiner\" #\\e)\n"
6552dbf7 149 "@result{} 4\n\n"
1670bef9 150 "(string-rindex \"weiner\" #\\e 2 4)\n"
6552dbf7 151 "@result{} #f\n\n"
1670bef9 152 "(string-rindex \"weiner\" #\\e 2 5)\n"
6552dbf7
GB
153 "@result{} 4\n"
154 "@end example")
1bbd0b84 155#define FUNC_NAME s_scm_string_rindex
0f2d19dd
JB
156{
157 int pos;
158
54778cd3 159 if (SCM_UNBNDP (frm))
0f2d19dd 160 frm = SCM_BOOL_F;
54778cd3 161 if (SCM_UNBNDP (to))
0f2d19dd 162 to = SCM_BOOL_F;
1bbd0b84 163 pos = scm_i_index (&str, chr, -1, frm, to, FUNC_NAME);
0f2d19dd
JB
164 return (pos < 0
165 ? SCM_BOOL_F
166 : SCM_MAKINUM (pos));
167}
1bbd0b84
GB
168#undef FUNC_NAME
169
e41530ba 170
1bbd0b84
GB
171SCM_REGISTER_PROC(s_substring_move_left_x, "substring-move-left!", 5, 0, 0, scm_substring_move_x);
172SCM_REGISTER_PROC(s_substring_move_right_x, "substring-move-right!", 5, 0, 0, scm_substring_move_x);
e41530ba 173
6552dbf7
GB
174/*
175@defun substring-move-left! str1 start1 end1 str2 start2
176@end defun
177@deftypefn {C Function} SCM scm_substring_move_left_x (SCM @var{str1}, SCM @var{start1}, SCM @var{end1}, SCM @var{str2}, SCM @var{start2})
178[@strong{Note:} this is only valid if you've applied the strop patch].
179
180Moves a substring of @var{str1}, from @var{start1} to @var{end1}
181(@var{end1} is exclusive), into @var{str2}, starting at
182@var{start2}. Allows overlapping strings.
183
184@example
185(define x (make-string 10 #\a))
186(define y "bcd")
187(substring-move-left! x 2 5 y 0)
188y
189@result{} "aaa"
190
191x
192@result{} "aaaaaaaaaa"
193
194(define y "bcdefg")
195(substring-move-left! x 2 5 y 0)
196y
197@result{} "aaaefg"
198
199(define y "abcdefg")
200(substring-move-left! y 2 5 y 3)
201y
202@result{} "abccccg"
203@end example
204*/
205
206/*
207@defun substring-move-right! str1 start1 end1 str2 start2
208@end defun
209@deftypefn {C Function} SCM scm_substring_move_right_x (SCM @var{str1}, SCM @var{start1}, SCM @var{end1}, SCM @var{str2}, SCM @var{start2})
210[@strong{Note:} this is only valid if you've applied the strop patch, if
211it hasn't made it into the guile tree].
212
213Does much the same thing as @code{substring-move-left!}, except it
214starts moving at the end of the sequence, rather than the beginning.
215@example
216(define y "abcdefg")
217(substring-move-right! y 2 5 y 0)
218y
219@result{} "ededefg"
220
221(define y "abcdefg")
222(substring-move-right! y 2 5 y 3)
223y
224@result{} "abccdeg"
225@end example
226*/
1cc91f1b 227
3b3b36dd 228SCM_DEFINE (scm_substring_move_x, "substring-move!", 5, 0, 0,
1bbd0b84 229 (SCM str1, SCM start1, SCM end1, SCM str2, SCM start2),
11768c04
NJ
230 "@deffnx primitive substring-move-left! str1 start1 end1 str2 start2\n"
231 "@deffnx primitive substring-move-right! str1 start1 end1 str2 start2\n"
b380b885
MD
232 "Copy the substring of @var{str1} bounded by @var{start1} and @var{end1}\n"
233 "into @var{str2} beginning at position @var{end2}.\n"
234 "@code{substring-move-right!} begins copying from the rightmost character\n"
235 "and moves left, and @code{substring-move-left!} copies from the leftmost\n"
236 "character moving right.\n\n"
237 "It is useful to have two functions that copy in different directions so\n"
238 "that substrings can be copied back and forth within a single string. If\n"
239 "you wish to copy text from the left-hand side of a string to the\n"
240 "right-hand side of the same string, and the source and destination\n"
241 "overlap, you must be careful to copy the rightmost characters of the\n"
242 "text first, to avoid clobbering your data. Hence, when @var{str1} and\n"
243 "@var{str2} are the same string, you should use\n"
244 "@code{substring-move-right!} when moving text from left to right, and\n"
245 "@code{substring-move-left!} otherwise. If @code{str1} and @samp{str2}\n"
246 "are different strings, it does not matter which function you use.")
1bbd0b84 247#define FUNC_NAME s_scm_substring_move_x
0f2d19dd 248{
99a9952d
JB
249 long s1, s2, e, len;
250
3b3b36dd
GB
251 SCM_VALIDATE_STRING (1,str1);
252 SCM_VALIDATE_INUM_COPY (2,start1,s1);
253 SCM_VALIDATE_INUM_COPY (3,end1,e);
254 SCM_VALIDATE_STRING (4,str2);
255 SCM_VALIDATE_INUM_COPY (5,start2,s2);
99a9952d 256 len = e - s1;
1bbd0b84 257 SCM_ASSERT_RANGE (3,end1,len >= 0);
bfa974f0
DH
258 SCM_ASSERT_RANGE (2,start1,s1 <= SCM_STRING_LENGTH (str1) && s1 >= 0);
259 SCM_ASSERT_RANGE (5,start2,s2 <= SCM_STRING_LENGTH (str2) && s2 >= 0);
260 SCM_ASSERT_RANGE (3,end1,e <= SCM_STRING_LENGTH (str1) && e >= 0);
261 SCM_ASSERT_RANGE (5,start2,len+s2 <= SCM_STRING_LENGTH (str2));
0f2d19dd 262
86c991c2
DH
263 SCM_SYSCALL(memmove((void *)(&(SCM_STRING_CHARS(str2)[s2])),
264 (void *)(&(SCM_STRING_CHARS(str1)[s1])),
99a9952d
JB
265 len));
266
b1349e46 267 return scm_return_first(SCM_UNSPECIFIED, str1, str2);
0f2d19dd 268}
1bbd0b84 269#undef FUNC_NAME
0f2d19dd
JB
270
271
3b3b36dd 272SCM_DEFINE (scm_substring_fill_x, "substring-fill!", 4, 0, 0,
1bbd0b84 273 (SCM str, SCM start, SCM end, SCM fill),
b380b885 274 "Change every character in @var{str} between @var{start} and @var{end} to\n"
6552dbf7
GB
275 "@var{fill-char}.\n\n"
276 "(qdocs:) Destructively fills @var{str}, from @var{start} to @var{end}, with @var{fill}.\n\n"
277 "@example\n"
278 "(define y \"abcdefg\")\n"
1670bef9 279 "(substring-fill! y 1 3 #\\r)\n"
6552dbf7
GB
280 "y\n"
281 "@result{} \"arrdefg\"\n"
282 "@end example")
1bbd0b84 283#define FUNC_NAME s_scm_substring_fill_x
0f2d19dd 284{
0f2d19dd
JB
285 long i, e;
286 char c;
3b3b36dd
GB
287 SCM_VALIDATE_STRING (1,str);
288 SCM_VALIDATE_INUM_COPY (2,start,i);
289 SCM_VALIDATE_INUM_COPY (3,end,e);
7866a09b 290 SCM_VALIDATE_CHAR_COPY (4,fill,c);
bfa974f0
DH
291 SCM_ASSERT_RANGE (2,start,i <= SCM_STRING_LENGTH (str) && i >= 0);
292 SCM_ASSERT_RANGE (3,end,e <= SCM_STRING_LENGTH (str) && e >= 0);
86c991c2 293 while (i<e) SCM_STRING_CHARS (str)[i++] = c;
0f2d19dd
JB
294 return SCM_UNSPECIFIED;
295}
1bbd0b84 296#undef FUNC_NAME
0f2d19dd
JB
297
298
3b3b36dd 299SCM_DEFINE (scm_string_null_p, "string-null?", 1, 0, 0,
1bbd0b84 300 (SCM str),
b380b885 301 "Return @code{#t} if @var{str}'s length is nonzero, and @code{#f}\n"
6552dbf7
GB
302 "otherwise.\n\n"
303 "(qdocs:) Returns @code{#t} if @var{str} is empty, else returns @code{#f}.\n\n"
304 "@example\n"
305 "(string-null? \"\")\n"
306 "@result{} #t\n\n"
307 "(string-null? y)\n"
308 "@result{} #f\n"
309 "@end example")
1bbd0b84 310#define FUNC_NAME s_scm_string_null_p
0f2d19dd 311{
3b3b36dd 312 SCM_VALIDATE_ROSTRING (1,str);
1bbd0b84 313 return SCM_NEGATE_BOOL(SCM_ROLENGTH (str));
0f2d19dd 314}
1bbd0b84 315#undef FUNC_NAME
0f2d19dd
JB
316
317
3b3b36dd 318SCM_DEFINE (scm_string_to_list, "string->list", 1, 0, 0,
1bbd0b84 319 (SCM str),
6552dbf7
GB
320 "@samp{String->list} returns a newly allocated list of the\n"
321 "characters that make up the given string. @samp{List->string}\n"
322 "returns a newly allocated string formed from the characters in the list\n"
323 "@var{list}, which must be a list of characters. @samp{String->list}\n"
324 "and @samp{list->string} are\n"
325 "inverses so far as @samp{equal?} is concerned. (r5rs)")
1bbd0b84 326#define FUNC_NAME s_scm_string_to_list
0f2d19dd
JB
327{
328 long i;
329 SCM res = SCM_EOL;
330 unsigned char *src;
3b3b36dd 331 SCM_VALIDATE_ROSTRING (1,str);
0f2d19dd 332 src = SCM_ROUCHARS (str);
54778cd3 333 for (i = SCM_ROLENGTH (str)-1;i >= 0;i--) res = scm_cons (SCM_MAKE_CHAR (src[i]), res);
0f2d19dd
JB
334 return res;
335}
1bbd0b84 336#undef FUNC_NAME
0f2d19dd
JB
337
338
339
3b3b36dd 340SCM_DEFINE (scm_string_copy, "string-copy", 1, 0, 0,
1bbd0b84 341 (SCM str),
6552dbf7 342 "Returns a newly allocated copy of the given @var{string}. (r5rs)")
1bbd0b84 343#define FUNC_NAME s_scm_string_copy
0f2d19dd 344{
3b3b36dd 345 SCM_VALIDATE_STRINGORSUBSTR (1,str);
3d8d56df 346 return scm_makfromstr (SCM_ROCHARS (str), (scm_sizet)SCM_ROLENGTH (str), 0);
0f2d19dd 347}
1bbd0b84 348#undef FUNC_NAME
0f2d19dd
JB
349
350
3b3b36dd 351SCM_DEFINE (scm_string_fill_x, "string-fill!", 2, 0, 0,
1bbd0b84 352 (SCM str, SCM chr),
6552dbf7
GB
353 "Stores @var{char} in every element of the given @var{string} and returns an\n"
354 "unspecified value. (r5rs)")
1bbd0b84 355#define FUNC_NAME s_scm_string_fill_x
0f2d19dd
JB
356{
357 register char *dst, c;
358 register long k;
3b3b36dd 359 SCM_VALIDATE_STRING_COPY (1,str,dst);
7866a09b 360 SCM_VALIDATE_CHAR_COPY (2,chr,c);
bfa974f0 361 for (k = SCM_STRING_LENGTH (str)-1;k >= 0;k--) dst[k] = c;
0f2d19dd
JB
362 return SCM_UNSPECIFIED;
363}
1bbd0b84 364#undef FUNC_NAME
0f2d19dd 365
3b3b36dd 366SCM_DEFINE (scm_string_upcase_x, "string-upcase!", 1, 0, 0,
1bbd0b84 367 (SCM v),
6552dbf7
GB
368 "Destructively upcase every character in @code{str}.\n\n"
369 "(qdocs:) Converts each element in @var{str} to upper case.\n\n"
370 "@example\n"
371 "(string-upcase! y)\n"
372 "@result{} \"ARRDEFG\"\n\n"
373 "y\n"
374 "@result{} \"ARRDEFG\"\n"
375 "@end example")
1bbd0b84 376#define FUNC_NAME s_scm_string_upcase_x
c101e39e 377{
322ac0c5
DH
378 unsigned long k;
379
380 SCM_VALIDATE_STRING (1, v);
381
bfa974f0 382 for (k = 0; k < SCM_STRING_LENGTH (v); ++k)
322ac0c5
DH
383 SCM_STRING_UCHARS (v) [k] = scm_upcase (SCM_STRING_UCHARS (v) [k]);
384
c101e39e
GH
385 return v;
386}
1bbd0b84 387#undef FUNC_NAME
c101e39e 388
3b3b36dd 389SCM_DEFINE (scm_string_upcase, "string-upcase", 1, 0, 0,
1bbd0b84 390 (SCM str),
6552dbf7 391 "Upcase every character in @code{str}.")
1bbd0b84 392#define FUNC_NAME s_scm_string_upcase
99a9952d
JB
393{
394 return scm_string_upcase_x(scm_string_copy(str));
395}
1bbd0b84 396#undef FUNC_NAME
99a9952d 397
3b3b36dd 398SCM_DEFINE (scm_string_downcase_x, "string-downcase!", 1, 0, 0,
1bbd0b84 399 (SCM v),
6552dbf7
GB
400 "Destructively downcase every character in @code{str}.\n\n"
401 "(qdocs:) Converts each element in @var{str} to lower case.\n\n"
402 "@example\n"
403 "y\n"
404 "@result{} \"ARRDEFG\"\n\n"
405 "(string-downcase! y)\n"
406 "@result{} \"arrdefg\"\n\n"
407 "y\n"
408 "@result{} \"arrdefg\"\n"
409 "@end example")
1bbd0b84 410#define FUNC_NAME s_scm_string_downcase_x
c101e39e 411{
322ac0c5
DH
412 unsigned long k;
413
414 SCM_VALIDATE_STRING (1, v);
415
bfa974f0 416 for (k = 0; k < SCM_STRING_LENGTH (v); ++k)
322ac0c5
DH
417 SCM_STRING_UCHARS (v) [k] = scm_downcase (SCM_STRING_UCHARS (v) [k]);
418
c101e39e
GH
419 return v;
420}
1bbd0b84 421#undef FUNC_NAME
0f2d19dd 422
3b3b36dd 423SCM_DEFINE (scm_string_downcase, "string-downcase", 1, 0, 0,
1bbd0b84 424 (SCM str),
6552dbf7 425 "Downcase every character in @code{str}.")
1bbd0b84 426#define FUNC_NAME s_scm_string_downcase
99a9952d 427{
3b3b36dd 428 SCM_VALIDATE_STRING (1,str);
99a9952d
JB
429 return scm_string_downcase_x(scm_string_copy(str));
430}
1bbd0b84 431#undef FUNC_NAME
99a9952d 432
3b3b36dd 433SCM_DEFINE (scm_string_capitalize_x, "string-capitalize!", 1, 0, 0,
6552dbf7
GB
434 (SCM str),
435 "Destructively capitalize every character in @code{str}.")
1bbd0b84 436#define FUNC_NAME s_scm_string_capitalize_x
99a9952d 437{
6552dbf7 438 char *sz;
99a9952d 439 int i, len, in_word=0;
6552dbf7 440 SCM_VALIDATE_STRING (1,str);
bfa974f0 441 len = SCM_STRING_LENGTH(str);
86c991c2 442 sz = SCM_STRING_CHARS (str);
99a9952d 443 for(i=0; i<len; i++) {
7866a09b 444 if(SCM_NFALSEP(scm_char_alphabetic_p(SCM_MAKE_CHAR(sz[i])))) {
99a9952d 445 if(!in_word) {
6552dbf7 446 sz[i] = scm_upcase(sz[i]);
99a9952d
JB
447 in_word = 1;
448 } else {
6552dbf7 449 sz[i] = scm_downcase(sz[i]);
99a9952d
JB
450 }
451 }
452 else in_word = 0;
453 }
6552dbf7 454 return str;
99a9952d 455}
1bbd0b84 456#undef FUNC_NAME
99a9952d 457
3b3b36dd 458SCM_DEFINE (scm_string_capitalize, "string-capitalize", 1, 0, 0,
6552dbf7
GB
459 (SCM str),
460 "Capitalize every character in @code{str}.")
1bbd0b84 461#define FUNC_NAME s_scm_string_capitalize
99a9952d 462{
6552dbf7
GB
463 SCM_VALIDATE_STRING (1,str);
464 return scm_string_capitalize_x(scm_string_copy(str));
99a9952d 465}
1bbd0b84 466#undef FUNC_NAME
99a9952d 467
3b3b36dd 468SCM_DEFINE (scm_string_ci_to_symbol, "string-ci->symbol", 1, 0, 0,
1bbd0b84 469 (SCM str),
6552dbf7 470 "Return the symbol whose name is @var{str}, downcased in necessary(???).")
1bbd0b84 471#define FUNC_NAME s_scm_string_ci_to_symbol
99a9952d
JB
472{
473 return scm_string_to_symbol (SCM_CASE_INSENSITIVE_P
474 ? scm_string_downcase(str)
475 : str);
476}
1bbd0b84 477#undef FUNC_NAME
1cc91f1b 478
0f2d19dd
JB
479void
480scm_init_strop ()
0f2d19dd 481{
a0599745 482#include "libguile/strop.x"
0f2d19dd 483}
89e00824
ML
484
485/*
486 Local Variables:
487 c-file-style: "gnu"
488 End:
489*/