comparison src/fns.c @ 399:21aa17a1560d

*** empty log message ***
author Richard M. Stallman <rms@gnu.org>
date Sat, 17 Aug 1991 17:54:46 +0000
parents 80a890dbbeb5
children 24b63d6679b6
comparison
equal deleted inserted replaced
398:a60eafebd43f 399:21aa17a1560d
72 72
73 #include "buffer.h" 73 #include "buffer.h"
74 74
75 Lisp_Object Qstring_lessp; 75 Lisp_Object Qstring_lessp;
76 76
77 static Lisp_Object internal_equal ();
78
77 DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0, 79 DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0,
78 "Return the argument unchanged.") 80 "Return the argument unchanged.")
79 (arg) 81 (arg)
80 Lisp_Object arg; 82 Lisp_Object arg;
81 { 83 {
481 CHECK_NUMBER (n, 0); 483 CHECK_NUMBER (n, 0);
482 while (1) 484 while (1)
483 { 485 {
484 if (XTYPE (seq) == Lisp_Cons || NULL (seq)) 486 if (XTYPE (seq) == Lisp_Cons || NULL (seq))
485 return Fcar (Fnthcdr (n, seq)); 487 return Fcar (Fnthcdr (n, seq));
486 else if (XTYPE (seq) == Lisp_String || 488 else if (XTYPE (seq) == Lisp_String
487 XTYPE (seq) == Lisp_Vector) 489 || XTYPE (seq) == Lisp_Vector)
488 return Faref (seq, n); 490 return Faref (seq, n);
489 else 491 else
490 seq = wrong_type_argument (Qsequencep, seq); 492 seq = wrong_type_argument (Qsequencep, seq);
491 } 493 }
492 } 494 }
828 Vectors and strings are compared element by element.\n\ 830 Vectors and strings are compared element by element.\n\
829 Numbers are compared by value. Symbols must match exactly.") 831 Numbers are compared by value. Symbols must match exactly.")
830 (o1, o2) 832 (o1, o2)
831 register Lisp_Object o1, o2; 833 register Lisp_Object o1, o2;
832 { 834 {
835 return internal_equal (o1, o2, 0);
836 }
837
838 static Lisp_Object
839 internal_equal (o1, o2, depth)
840 register Lisp_Object o1, o2;
841 int depth;
842 {
843 if (depth > 200)
844 error ("Stack overflow in equal");
833 do_cdr: 845 do_cdr:
834 QUIT; 846 QUIT;
835 if (XTYPE (o1) != XTYPE (o2)) return Qnil; 847 if (XTYPE (o1) != XTYPE (o2)) return Qnil;
836 if (XINT (o1) == XINT (o2)) return Qt; 848 if (XINT (o1) == XINT (o2)) return Qt;
837 if (XTYPE (o1) == Lisp_Cons) 849 if (XTYPE (o1) == Lisp_Cons)
838 { 850 {
839 Lisp_Object v1; 851 Lisp_Object v1;
840 v1 = Fequal (Fcar (o1), Fcar (o2)); 852 v1 = Fequal (Fcar (o1), Fcar (o2), depth + 1);
841 if (NULL (v1)) 853 if (NULL (v1))
842 return v1; 854 return v1;
843 o1 = Fcdr (o1), o2 = Fcdr (o2); 855 o1 = Fcdr (o1), o2 = Fcdr (o2);
844 goto do_cdr; 856 goto do_cdr;
845 } 857 }
857 for (index = 0; index < XVECTOR (o1)->size; index++) 869 for (index = 0; index < XVECTOR (o1)->size; index++)
858 { 870 {
859 Lisp_Object v, v1, v2; 871 Lisp_Object v, v1, v2;
860 v1 = XVECTOR (o1)->contents [index]; 872 v1 = XVECTOR (o1)->contents [index];
861 v2 = XVECTOR (o2)->contents [index]; 873 v2 = XVECTOR (o2)->contents [index];
862 v = Fequal (v1, v2); 874 v = Fequal (v1, v2, depth + 1);
863 if (NULL (v)) return v; 875 if (NULL (v)) return v;
864 } 876 }
865 return Qt; 877 return Qt;
866 } 878 }
867 if (XTYPE (o1) == Lisp_String) 879 if (XTYPE (o1) == Lisp_String)