comparison src/lisp.h @ 400:a86b2b5e0111 r21-2-30

Import from CVS: tag r21-2-30
author cvs
date Mon, 13 Aug 2007 11:14:34 +0200
parents 74fd4e045ea6
children 2f8bb876ab1d
comparison
equal deleted inserted replaced
399:376370fb5946 400:a86b2b5e0111
712 /* Optimized and safe macros for looping over external lists. */ 712 /* Optimized and safe macros for looping over external lists. */
713 #define CIRCULAR_LIST_SUSPICION_LENGTH 1024 713 #define CIRCULAR_LIST_SUSPICION_LENGTH 1024
714 714
715 #define EXTERNAL_LIST_LOOP_1(list) \ 715 #define EXTERNAL_LIST_LOOP_1(list) \
716 Lisp_Object ELL1_elt, ELL1_hare, ELL1_tortoise; \ 716 Lisp_Object ELL1_elt, ELL1_hare, ELL1_tortoise; \
717 EMACS_INT ELL1_len; \ 717 EMACS_INT ELL1_len; \
718 EXTERNAL_LIST_LOOP_6 (ELL1_elt, list, ELL1_len, ELL1_hare, \ 718 EXTERNAL_LIST_LOOP_6 (ELL1_elt, list, ELL1_len, ELL1_hare, \
719 ELL1_tortoise, CIRCULAR_LIST_SUSPICION_LENGTH) 719 ELL1_tortoise, CIRCULAR_LIST_SUSPICION_LENGTH)
720 720
721 #define EXTERNAL_LIST_LOOP_2(elt, list) \ 721 #define EXTERNAL_LIST_LOOP_2(elt, list) \
722 Lisp_Object hare_##elt, tortoise_##elt; \ 722 Lisp_Object hare_##elt, tortoise_##elt; \
723 EMACS_INT len_##elt; \ 723 EMACS_INT len_##elt; \
724 EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, hare_##elt, \ 724 EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, hare_##elt, \
725 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) 725 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
726 726
727 #define EXTERNAL_LIST_LOOP_3(elt, list, tail) \ 727 #define EXTERNAL_LIST_LOOP_3(elt, list, tail) \
728 Lisp_Object tortoise_##elt; \ 728 Lisp_Object tortoise_##elt; \
729 EMACS_INT len_##elt; \ 729 EMACS_INT len_##elt; \
730 EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, tail, \ 730 EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, tail, \
731 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) 731 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
732 732
733 #define EXTERNAL_LIST_LOOP_4(elt, list, tail, len) \ 733 #define EXTERNAL_LIST_LOOP_4(elt, list, tail, len) \
734 Lisp_Object tortoise_##elt; \ 734 Lisp_Object tortoise_##elt; \
788 788
789 789
790 /* Optimized and safe macros for looping over external property lists. */ 790 /* Optimized and safe macros for looping over external property lists. */
791 #define EXTERNAL_PROPERTY_LIST_LOOP_3(key, value, list) \ 791 #define EXTERNAL_PROPERTY_LIST_LOOP_3(key, value, list) \
792 Lisp_Object key, value, hare_##key, tortoise_##key; \ 792 Lisp_Object key, value, hare_##key, tortoise_##key; \
793 EMACS_INT len_##key; \ 793 EMACS_INT len_##key; \
794 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, hare_##key, \ 794 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, hare_##key, \
795 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH) 795 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
796 796
797 #define EXTERNAL_PROPERTY_LIST_LOOP_4(key, value, list, tail) \ 797 #define EXTERNAL_PROPERTY_LIST_LOOP_4(key, value, list, tail) \
798 Lisp_Object key, value, tail, tortoise_##key; \ 798 Lisp_Object key, value, tail, tortoise_##key; \
799 EMACS_INT len_##key; \ 799 EMACS_INT len_##key; \
800 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, tail, \ 800 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, tail, \
801 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH) 801 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
802 802
803 #define EXTERNAL_PROPERTY_LIST_LOOP_5(key, value, list, tail, len) \ 803 #define EXTERNAL_PROPERTY_LIST_LOOP_5(key, value, list, tail, len) \
804 Lisp_Object key, value, tail, tortoise_##key; \ 804 Lisp_Object key, value, tail, tortoise_##key; \
1102 typedef Lisp_Object (*lisp_fn_t) (void); 1102 typedef Lisp_Object (*lisp_fn_t) (void);
1103 1103
1104 struct Lisp_Subr 1104 struct Lisp_Subr
1105 { 1105 {
1106 struct lrecord_header lheader; 1106 struct lrecord_header lheader;
1107 short min_args, max_args; 1107 short min_args;
1108 short max_args;
1108 const char *prompt; 1109 const char *prompt;
1109 const char *doc; 1110 const char *doc;
1110 const char *name; 1111 const char *name;
1111 lisp_fn_t subr_fn; 1112 lisp_fn_t subr_fn;
1112 }; 1113 };
1477 #define UNEVALLED -1 1478 #define UNEVALLED -1
1478 1479
1479 /* Can't be const, because then subr->doc is read-only and 1480 /* Can't be const, because then subr->doc is read-only and
1480 Snarf_documentation chokes */ 1481 Snarf_documentation chokes */
1481 1482
1482 #define subr_lheader_initializer { 0, 0, 0, 0 }
1483
1484 #define DEFUN(lname, Fname, min_args, max_args, prompt, arglist) \ 1483 #define DEFUN(lname, Fname, min_args, max_args, prompt, arglist) \
1485 Lisp_Object Fname (EXFUN_##max_args); \ 1484 Lisp_Object Fname (EXFUN_##max_args); \
1486 static struct Lisp_Subr S##Fname = { subr_lheader_initializer, \ 1485 static struct Lisp_Subr S##Fname = \
1487 min_args, max_args, prompt, 0, lname, (lisp_fn_t) Fname }; \ 1486 { \
1487 { /* struct lrecord_header */ \
1488 lrecord_type_subr, /* lrecord_type_index */ \
1489 1, /* mark bit */ \
1490 1, /* c_readonly bit */ \
1491 1 /* lisp_readonly bit */ \
1492 }, \
1493 min_args, \
1494 max_args, \
1495 prompt, \
1496 0, /* doc string */ \
1497 lname, \
1498 (lisp_fn_t) Fname \
1499 }; \
1488 Lisp_Object Fname (DEFUN_##max_args arglist) 1500 Lisp_Object Fname (DEFUN_##max_args arglist)
1489 1501
1490 /* Heavy ANSI C preprocessor hackery to get DEFUN to declare a 1502 /* Heavy ANSI C preprocessor hackery to get DEFUN to declare a
1491 prototype that matches max_args, and add the obligatory 1503 prototype that matches max_args, and add the obligatory
1492 `Lisp_Object' type declaration to the formal C arguments. */ 1504 `Lisp_Object' type declaration to the formal C arguments. */