Mercurial > emacs
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) |