maintainer changed: was lord, now jimb; first import
[bpt/guile.git] / libguile / eq.c
1 /* Copyright (C) 1995,1996 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, 675 Mass Ave, Cambridge, MA 02139, USA.
16 *
17 * As a special exception, the Free Software Foundation gives permission
18 * for additional uses of the text contained in its release of GUILE.
19 *
20 * The exception is that, if you link the GUILE library with other files
21 * to produce an executable, this does not by itself cause the
22 * resulting executable to be covered by the GNU General Public License.
23 * Your use of that executable is in no way restricted on account of
24 * linking the GUILE library code into it.
25 *
26 * This exception does not however invalidate any other reasons why
27 * the executable file might be covered by the GNU General Public License.
28 *
29 * This exception applies only to the code released by the
30 * Free Software Foundation under the name GUILE. If you copy
31 * code from other Free Software Foundation releases into a copy of
32 * GUILE, as the General Public License permits, the exception does
33 * not apply to the code that you add in this way. To avoid misleading
34 * anyone as to the status of such modified files, you must delete
35 * this exception notice from them.
36 *
37 * If you write modifications of your own for GUILE, it is your choice
38 * whether to permit this exception to apply to your modifications.
39 * If you do not wish that, delete this exception notice.
40 */
41 \f
42 #include <stdio.h>
43 #include "_scm.h"
44
45 \f
46 SCM_PROC1 (s_eq_p, "eq?", scm_tc7_rpsubr, scm_eq_p);
47 #ifdef __STDC__
48 SCM
49 scm_eq_p (SCM x, SCM y)
50 #else
51 SCM
52 scm_eq_p (x, y)
53 SCM x;
54 SCM y;
55 #endif
56 {
57 return ((x==y)
58 ? SCM_BOOL_T
59 : SCM_BOOL_F);
60 }
61
62
63 SCM_PROC1 (s_eqv_p, "eqv?", scm_tc7_rpsubr, scm_eqv_p);
64 #ifdef __STDC__
65 SCM
66 scm_eqv_p (SCM x, SCM y)
67 #else
68 SCM
69 scm_eqv_p (x, y)
70 SCM x;
71 SCM y;
72 #endif
73 {
74 if (x==y) return SCM_BOOL_T;
75 if SCM_IMP(x) return SCM_BOOL_F;
76 if SCM_IMP(y) return SCM_BOOL_F;
77 /* this ensures that types and scm_length are the same. */
78 if (SCM_CAR(x) != SCM_CAR(y)) return SCM_BOOL_F;
79 if SCM_NUMP(x) {
80 # ifdef SCM_BIGDIG
81 if SCM_BIGP(x) return (0==scm_bigcomp(x, y)) ? SCM_BOOL_T : SCM_BOOL_F;
82 # endif
83 #ifdef SCM_FLOATS
84 if (SCM_REALPART(x) != SCM_REALPART(y)) return SCM_BOOL_F;
85 if (SCM_CPLXP(x) && (SCM_IMAG(x) != SCM_IMAG(y))) return SCM_BOOL_F;
86 #endif
87 return SCM_BOOL_T;
88 }
89 return SCM_BOOL_F;
90 }
91
92
93 SCM_PROC1 (s_equal_p, "equal?", scm_tc7_rpsubr, scm_equal_p);
94 #ifdef __STDC__
95 SCM
96 scm_equal_p (SCM x, SCM y)
97 #else
98 SCM
99 scm_equal_p (x, y)
100 SCM x;
101 SCM y;
102 #endif
103 {
104 SCM_CHECK_STACK;
105 tailrecurse: SCM_ASYNC_TICK;
106 if (x==y) return SCM_BOOL_T;
107 if (SCM_IMP(x)) return SCM_BOOL_F;
108 if (SCM_IMP(y)) return SCM_BOOL_F;
109 if (SCM_CONSP(x) && SCM_CONSP(y)) {
110 if SCM_FALSEP(scm_equal_p(SCM_CAR(x), SCM_CAR(y))) return SCM_BOOL_F;
111 x = SCM_CDR(x);
112 y = SCM_CDR(y);
113 goto tailrecurse;
114 }
115 /* this ensures that types and scm_length are the same. */
116 if (SCM_CAR(x) != SCM_CAR(y)) return SCM_BOOL_F;
117 switch (SCM_TYP7(x)) {
118 default: return SCM_BOOL_F;
119 case scm_tc7_substring:
120 case scm_tc7_mb_substring:
121 case scm_tc7_mb_string:
122 case scm_tc7_string: return scm_string_equal_p(x, y);
123 case scm_tc7_vector:
124 case scm_tc7_wvect:
125 return scm_vector_equal_p(x, y);
126 case scm_tc7_smob: {
127 int i = SCM_SMOBNUM(x);
128 if (!(i < scm_numsmob)) return SCM_BOOL_F;
129 if (scm_smobs[i].equalp)
130 return (scm_smobs[i].equalp)(x, y);
131 else
132 return SCM_BOOL_F;
133 }
134 case scm_tc7_bvect: case scm_tc7_uvect: case scm_tc7_ivect:
135 case scm_tc7_fvect: case scm_tc7_cvect: case scm_tc7_dvect:
136 case scm_tc7_svect:
137 #ifdef LONGLONGS
138 case scm_tc7_llvect:
139 #endif
140 case scm_tc7_byvect:
141 if ( scm_tc16_array
142 && scm_smobs[0x0ff & (scm_tc16_array >> 8)].equalp)
143 return scm_array_equal_p(x, y);
144 }
145 return SCM_BOOL_F;
146 }
147
148
149 \f
150
151
152 #ifdef __STDC__
153 void
154 scm_init_eq (void)
155 #else
156 void
157 scm_init_eq ()
158 #endif
159 {
160 #include "eq.x"
161 }
162