* *.c, snarf.h: Replace GUILE_PROC1 with SCM_DEFINE1 throughout.
[bpt/guile.git] / libguile / strorder.c
1 /* Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program 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
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
16 * Boston, MA 02111-1307 USA
17 *
18 * As a special exception, the Free Software Foundation gives permission
19 * for additional uses of the text contained in its release of GUILE.
20 *
21 * The exception is that, if you link the GUILE library with other files
22 * to produce an executable, this does not by itself cause the
23 * resulting executable to be covered by the GNU General Public License.
24 * Your use of that executable is in no way restricted on account of
25 * linking the GUILE library code into it.
26 *
27 * This exception does not however invalidate any other reasons why
28 * the executable file might be covered by the GNU General Public License.
29 *
30 * This exception applies only to the code released by the
31 * Free Software Foundation under the name GUILE. If you copy
32 * code from other Free Software Foundation releases into a copy of
33 * GUILE, as the General Public License permits, the exception does
34 * not apply to the code that you add in this way. To avoid misleading
35 * anyone as to the status of such modified files, you must delete
36 * this exception notice from them.
37 *
38 * If you write modifications of your own for GUILE, it is your choice
39 * whether to permit this exception to apply to your modifications.
40 * If you do not wish that, delete this exception notice. */
41
42 /* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
43 gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
44 \f
45
46 #include <stdio.h>
47 #include "_scm.h"
48 #include "chars.h"
49
50 #include "scm_validate.h"
51 #include "strorder.h"
52 \f
53
54 SCM_DEFINE1 (scm_string_equal_p, "string=?", scm_tc7_rpsubr,
55 (SCM s1, SCM s2),
56 "")
57 #define FUNC_NAME s_scm_string_equal_p
58 {
59 register scm_sizet i;
60 register unsigned char *c1, *c2;
61 SCM_VALIDATE_ROSTRING (1,s1);
62 SCM_VALIDATE_ROSTRING (2,s2);
63
64 i = SCM_ROLENGTH (s2);
65 if (SCM_ROLENGTH (s1) != i)
66 {
67 return SCM_BOOL_F;
68 }
69 c1 = SCM_ROUCHARS (s1);
70 c2 = SCM_ROUCHARS (s2);
71 while (0 != i--)
72 if (*c1++ != *c2++)
73 return SCM_BOOL_F;
74 return SCM_BOOL_T;
75 }
76 #undef FUNC_NAME
77
78 SCM_DEFINE1 (scm_string_ci_equal_p, "string-ci=?", scm_tc7_rpsubr,
79 (SCM s1, SCM s2),
80 "")
81 #define FUNC_NAME s_scm_string_ci_equal_p
82 {
83 register scm_sizet i;
84 register unsigned char *c1, *c2;
85 SCM_VALIDATE_ROSTRING (1,s1);
86 SCM_VALIDATE_ROSTRING (2,s2);
87
88 i = SCM_ROLENGTH (s2);
89 if (SCM_ROLENGTH (s1) != i)
90 {
91 return SCM_BOOL_F;
92 }
93 c1 = SCM_ROUCHARS (s1);
94 c2 = SCM_ROUCHARS (s2);
95 while (0 != i--)
96 if (scm_upcase(*c1++) != scm_upcase(*c2++))
97 return SCM_BOOL_F;
98 return SCM_BOOL_T;
99 }
100 #undef FUNC_NAME
101
102 SCM_DEFINE1 (scm_string_less_p, "string<?", scm_tc7_rpsubr,
103 (SCM s1, SCM s2),
104 "")
105 #define FUNC_NAME s_scm_string_less_p
106 {
107 register scm_sizet i, len, s2len;
108 register unsigned char *c1, *c2;
109 register int c;
110
111 SCM_VALIDATE_ROSTRING (1,s1);
112 SCM_VALIDATE_ROSTRING (2,s2);
113 len = SCM_ROLENGTH (s1);
114 s2len = SCM_ROLENGTH (s2);
115 if (len>s2len) len = s2len;
116 c1 = SCM_ROUCHARS (s1);
117 c2 = SCM_ROUCHARS (s2);
118
119 for (i = 0;i<len;i++) {
120 c = (*c1++ - *c2++);
121 if (c>0)
122 return SCM_BOOL_F;
123 if (c<0)
124 return SCM_BOOL_T;
125 }
126 {
127 SCM answer;
128 answer = SCM_BOOL(s2len != len);
129 return answer;
130 }
131 }
132 #undef FUNC_NAME
133
134 SCM_DEFINE1 (scm_string_leq_p, "string<=?", scm_tc7_rpsubr,
135 (SCM s1, SCM s2),
136 "")
137 #define FUNC_NAME s_scm_string_leq_p
138 {
139 return SCM_BOOL_NOT (scm_string_less_p (s2, s1));
140 }
141 #undef FUNC_NAME
142
143 SCM_DEFINE1 (scm_string_gr_p, "string>?", scm_tc7_rpsubr,
144 (SCM s1, SCM s2),
145 "")
146 #define FUNC_NAME s_scm_string_gr_p
147 {
148 return scm_string_less_p (s2, s1);
149 }
150 #undef FUNC_NAME
151
152 SCM_DEFINE1 (scm_string_geq_p, "string>=?", scm_tc7_rpsubr,
153 (SCM s1, SCM s2),
154 "")
155 #define FUNC_NAME s_scm_string_geq_p
156 {
157 return SCM_BOOL_NOT (scm_string_less_p (s1, s2));
158 }
159 #undef FUNC_NAME
160
161 SCM_DEFINE1 (scm_string_ci_less_p, "string-ci<?", scm_tc7_rpsubr,
162 (SCM s1, SCM s2),
163 "")
164 #define FUNC_NAME s_scm_string_ci_less_p
165 {
166 register scm_sizet i, len, s2len;
167 register unsigned char *c1, *c2;
168 register int c;
169 SCM_VALIDATE_ROSTRING (1,s1);
170 SCM_VALIDATE_ROSTRING (2,s2);
171 len = SCM_ROLENGTH (s1);
172 s2len = SCM_ROLENGTH (s2);
173 if (len>s2len) len = s2len;
174 c1 = SCM_ROUCHARS (s1);
175 c2 = SCM_ROUCHARS (s2);
176 for (i = 0;i<len;i++) {
177 c = (scm_upcase(*c1++) - scm_upcase(*c2++));
178 if (c>0) return SCM_BOOL_F;
179 if (c<0) return SCM_BOOL_T;
180 }
181 return SCM_BOOL(s2len != len);
182 }
183 #undef FUNC_NAME
184
185 SCM_DEFINE1 (scm_string_ci_leq_p, "string-ci<=?", scm_tc7_rpsubr,
186 (SCM s1, SCM s2),
187 "")
188 #define FUNC_NAME s_scm_string_ci_leq_p
189 {
190 return SCM_BOOL_NOT (scm_string_ci_less_p (s2, s1));
191 }
192 #undef FUNC_NAME
193
194 SCM_DEFINE1 (scm_string_ci_gr_p, "string-ci>?", scm_tc7_rpsubr,
195 (SCM s1, SCM s2),
196 "")
197 #define FUNC_NAME s_scm_string_ci_gr_p
198 {
199 return scm_string_ci_less_p (s2, s1);
200 }
201 #undef FUNC_NAME
202
203 SCM_DEFINE1 (scm_string_ci_geq_p, "string-ci>=?", scm_tc7_rpsubr,
204 (SCM s1, SCM s2),
205 "")
206 #define FUNC_NAME s_scm_string_ci_geq_p
207 {
208 return SCM_BOOL_NOT (scm_string_ci_less_p (s1, s2));
209 }
210 #undef FUNC_NAME
211
212 \f
213
214 void
215 scm_init_strorder ()
216 {
217 #include "strorder.x"
218 }
219