]> code.delx.au - gnu-emacs/blobdiff - src/lisp.h
(DEFUN): Remove `DOC_STRINGS_IN_COMMENTS' case.
[gnu-emacs] / src / lisp.h
index 2080cf6b4e2dec7a0bc082310ce064286d33e37b..cba2349b581a33902797fa1b6c98446d3ca1e68d 100644 (file)
@@ -248,6 +248,16 @@ Lisp_Object;
 
 #endif /* WORDS_BIG_ENDIAN */
 
+#ifdef __GNUC__
+static __inline__ Lisp_Object
+LISP_MAKE_RVALUE (Lisp_Object o)
+{
+    return o;
+}
+#else
+#define LISP_MAKE_RVALUE(o) (o) /* XXX - keeps arg as rvalue.  */
+#endif
+
 #endif /* NO_UNION_TYPE */
 
 
@@ -255,6 +265,7 @@ Lisp_Object;
 
 #ifdef NO_UNION_TYPE
 #define Lisp_Object EMACS_INT
+#define LISP_MAKE_RVALUE(o) (0+(o))
 #endif /* NO_UNION_TYPE */
 
 #ifndef VALMASK
@@ -387,10 +398,6 @@ extern size_t pure_size;
 #define make_number(N)         \
   ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS)
 
-#define make_fixnum(x) make_number (x)
-#define MOST_NEGATIVE_FIXNUM   ((EMACS_INT) 1 << (VALBITS - 1))
-#define MOST_POSITIVE_FIXNUM   (MOST_NEGATIVE_FIXNUM - 1)
-
 /* During garbage collection, XGCTYPE must be used for extracting types
  so that the mark bit is ignored.  XMARKBIT accesses the markbit.
  Markbits are used only in particular slots of particular structure types.
@@ -472,15 +479,17 @@ extern Lisp_Object make_number ();
 
 #endif /* NO_UNION_TYPE */
 
-/* Largest and smallest representable fixnum values.  */
+/* Largest and smallest representable fixnum values.  These are the C
+   values.  */
 
-#define MOST_NEGATIVE_FIXNUM   ((EMACS_INT) 1 << (VALBITS - 1))
-#define MOST_POSITIVE_FIXNUM   (MOST_NEGATIVE_FIXNUM - 1)
+#define MOST_NEGATIVE_FIXNUM   ((EMACS_INT) 1 << (VALBITS - 1))
+#define MOST_POSITIVE_FIXNUM   (((EMACS_INT) 1 << (VALBITS - 1)) - 1)
 
 /* Value is non-zero if C integer I doesn't fit into a Lisp fixnum.  */
 
 #define FIXNUM_OVERFLOW_P(i) \
-  ((i) > MOST_POSITIVE_FIXNUM || (i) < MOST_NEGATIVE_FIXNUM)
+  ((EMACS_INT)(i) > MOST_POSITIVE_FIXNUM \
+   || (EMACS_INT) (i) < MOST_NEGATIVE_FIXNUM)
 
 /* Extract a value or address from a Lisp_Object.  */
 
@@ -557,7 +566,7 @@ struct interval
   unsigned int position;       /* Cache of interval's character position.  */
                                /* This field is usually updated
                                   simultaneously with an interval
-                                  traversal, there is no guaranty
+                                  traversal, there is no guarantee
                                   that it is valid for a random
                                   interval.  */
   struct interval *left;       /* Intervals which precede me.  */
@@ -618,14 +627,43 @@ struct Lisp_Cons
   };
 
 /* Take the car or cdr of something known to be a cons cell.  */
+/* The _AS_LVALUE macros shouldn't be used outside of the minimal set
+   of code that has to know what a cons cell looks like.  Other code not
+   part of the basic lisp implementation should assume that the car and cdr
+   fields are not accessible as lvalues.  (What if we want to switch to
+   a copying collector someday?  Cached cons cell field addresses may be
+   invalidated at arbitrary points.)  */
 #ifdef HIDE_LISP_IMPLEMENTATION
-#define XCAR(c) (XCONS ((c))->car_)
-#define XCDR(c) (XCONS ((c))->cdr_)
+#define XCAR_AS_LVALUE(c) (XCONS ((c))->car_)
+#define XCDR_AS_LVALUE(c) (XCONS ((c))->cdr_)
 #else
-#define XCAR(c) (XCONS ((c))->car)
-#define XCDR(c) (XCONS ((c))->cdr)
+#define XCAR_AS_LVALUE(c) (XCONS ((c))->car)
+#define XCDR_AS_LVALUE(c) (XCONS ((c))->cdr)
 #endif
 
+/* Okay, we're not quite ready to turn this on yet.  A few files still
+   need to be updated and tested.  */
+#undef LISP_MAKE_RVALUE
+#define LISP_MAKE_RVALUE(x) (x)
+
+/* Use these from normal code.  */
+#define XCAR(c)        LISP_MAKE_RVALUE(XCAR_AS_LVALUE(c))
+#define XCDR(c) LISP_MAKE_RVALUE(XCDR_AS_LVALUE(c))
+
+/* Use these to set the fields of a cons cell.
+
+   Note that both arguments may refer to the same object, so 'n'
+   should not be read after 'c' is first modified.  Also, neither
+   argument should be evaluated more than once; side effects are
+   especially common in the second argument.  */
+#define XSETCAR(c,n) (XCAR_AS_LVALUE(c) = (n))
+#define XSETCDR(c,n) (XCDR_AS_LVALUE(c) = (n))
+
+/* For performance: Fast storage of positive integers into the
+   fields of a cons cell.  See above caveats.  */
+#define XSETCARFASTINT(c,n)  XSETFASTINT(XCAR_AS_LVALUE(c),(n))
+#define XSETCDRFASTINT(c,n)  XSETFASTINT(XCDR_AS_LVALUE(c),(n))
+
 /* Take the car or cdr of something whose type is not known.  */
 #define CAR(c)                                 \
  (CONSP ((c)) ? XCAR ((c))                     \
@@ -1476,6 +1514,22 @@ typedef unsigned char UCHAR;
 #define CHECK_OVERLAY(x, i) \
   do { if (!OVERLAYP ((x))) x = wrong_type_argument (Qoverlayp, (x));} while (0)
 
+/* Since we can't assign directly to the CAR or CDR fields of a cons
+   cell, use these when checking that those fields contain numbers.  */
+#define CHECK_NUMBER_CAR(x, i) \
+  do {                                 \
+    Lisp_Object tmp = XCAR (x);                \
+    CHECK_NUMBER (tmp, (i));           \
+    XSETCAR ((x), tmp);                        \
+  } while (0)
+
+#define CHECK_NUMBER_CDR(x, i) \
+  do {                                 \
+    Lisp_Object tmp = XCDR (x);                \
+    CHECK_NUMBER (tmp, (i));           \
+    XSETCDR ((x), tmp);                        \
+  } while (0)
+
 /* Cast pointers to this type to compare them.  Some machines want int.  */
 #ifndef PNTR_COMPARISON_TYPE
 #define PNTR_COMPARISON_TYPE EMACS_UINT
@@ -1505,12 +1559,13 @@ typedef unsigned char UCHAR;
 
 #if (!defined (__STDC__) && !defined (PROTOTYPES)) \
     || defined (USE_NONANSI_DEFUN)
-#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc)     \
+
+#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, args)    \
   Lisp_Object fnname ();                                               \
   struct Lisp_Subr sname =                                             \
     { PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)),    \
       fnname, minargs, maxargs, lname, prompt, 0};                     \
-  Lisp_Object fnname
+  Lisp_Object fnname args
 
 #else
 
@@ -1567,6 +1622,21 @@ extern void defvar_kboard P_ ((char *, int));
 /* Macros we use to define forwarded Lisp variables.
    These are used in the syms_of_FILENAME functions.  */
 
+#ifdef DOC_STRINGS_IN_COMMENTS
+
+#define DEFVAR_LISP(lname, vname) defvar_lisp (lname, vname)
+#define DEFVAR_LISP_NOPRO(lname, vname) defvar_lisp_nopro (lname, vname)
+#define DEFVAR_BOOL(lname, vname) defvar_bool (lname, vname)
+#define DEFVAR_INT(lname, vname) defvar_int (lname, vname)
+#define DEFVAR_PER_BUFFER(lname, vname, type)  \
+ defvar_per_buffer (lname, vname, type, 0)
+#define DEFVAR_KBOARD(lname, vname) \
+ defvar_kboard (lname, \
+               (int)((char *)(&current_kboard->vname) \
+                     - (char *)current_kboard))
+
+#else /* not DOC_STRINGS_IN_COMMENTS  */
+
 #define DEFVAR_LISP(lname, vname, doc) defvar_lisp (lname, vname)
 #define DEFVAR_LISP_NOPRO(lname, vname, doc) defvar_lisp_nopro (lname, vname)
 #define DEFVAR_BOOL(lname, vname, doc) defvar_bool (lname, vname)
@@ -1577,6 +1647,10 @@ extern void defvar_kboard P_ ((char *, int));
  defvar_kboard (lname, \
                (int)((char *)(&current_kboard->vname) \
                      - (char *)current_kboard))
+
+#endif /* not DOC_STRINGS_IN_COMMENTS */
+
+
 \f
 /* Structure for recording Lisp call stack for backtrace purposes.  */
 
@@ -1929,6 +2003,8 @@ extern Lisp_Object Qfloatp, Qinteger_or_floatp, Qinteger_or_float_or_marker_p;
 
 extern Lisp_Object Qframep;
 
+extern void circular_list_error P_ ((Lisp_Object));
+
 EXFUN (Feq, 2);
 EXFUN (Fnull, 1);
 EXFUN (Flistp, 1);
@@ -2145,9 +2221,8 @@ EXFUN (Fmapcar, 2);
 EXFUN (Fmapconcat, 3);
 EXFUN (Fy_or_n_p, 1);
 extern Lisp_Object do_yes_or_no_p P_ ((Lisp_Object));
-EXFUN (Ffeaturep, 1);
 EXFUN (Frequire, 3);
-EXFUN (Fprovide, 1);
+EXFUN (Fprovide, 2);
 extern Lisp_Object concat2 P_ ((Lisp_Object, Lisp_Object));
 extern Lisp_Object concat3 P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
 extern Lisp_Object nconc2 P_ ((Lisp_Object, Lisp_Object));
@@ -2262,7 +2337,6 @@ extern int check_point_in_composition
        P_ ((struct buffer *, int, struct buffer *, int));
 extern void redisplay_preserve_echo_area P_ ((int));
 extern void mark_window_display_accurate P_ ((Lisp_Object, int));
-extern int invisible_p P_ ((Lisp_Object, Lisp_Object));
 extern void prepare_menu_bars P_ ((void));
 extern void syms_of_xdisp P_ ((void));
 extern void init_xdisp P_ ((void));
@@ -2376,8 +2450,9 @@ extern Lisp_Object oblookup P_ ((Lisp_Object, char *, int, int));
 #define LOADHIST_ATTACH(x) \
  if (initialized) Vcurrent_load_list = Fcons (x, Vcurrent_load_list)
 extern Lisp_Object Vcurrent_load_list;
-extern Lisp_Object Vload_history;
-extern int openp P_ ((Lisp_Object, Lisp_Object, char *, Lisp_Object *, int));
+extern Lisp_Object Vload_history, Vload_suffixes;
+extern int openp P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
+                     Lisp_Object *, int));
 extern int isfloat_string P_ ((char *));
 extern void map_obarray P_ ((Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
                             Lisp_Object));
@@ -2516,6 +2591,7 @@ EXFUN (Fconstrain_to_field, 5);
 EXFUN (Ffield_string, 1);
 EXFUN (Fdelete_field, 1);
 EXFUN (Ffield_beginning, 2);
+EXFUN (Ffield_end, 2);
 EXFUN (Ffield_string_no_properties, 1);
 extern void set_time_zone_rule P_ ((char *));
 
@@ -2690,6 +2766,7 @@ extern Lisp_Object Vtty_erase_char, Vhelp_form, Vtop_level;
 extern int input_pending;
 EXFUN (Fdiscard_input, 0);
 EXFUN (Frecursive_edit, 0);
+EXFUN (Ftop_level, 0);
 EXFUN (Fcommand_execute, 4);
 EXFUN (Finput_pending_p, 0);
 extern Lisp_Object menu_bar_items P_ ((Lisp_Object));
@@ -2711,32 +2788,6 @@ extern void syms_of_keyboard P_ ((void));
 extern void keys_of_keyboard P_ ((void));
 extern char *push_key_description P_ ((unsigned int, char *, int));
 
-/* defined in keymap.c */
-
-#define KEYMAPP(m) (!NILP (get_keymap (m, 0, 0)))
-extern Lisp_Object Qkeymap, Qmenu_bar;
-extern Lisp_Object current_global_map;
-EXFUN (Fmake_sparse_keymap, 1);
-EXFUN (Fcopy_keymap, 1);
-EXFUN (Fdefine_key, 3);
-EXFUN (Flookup_key, 3);
-EXFUN (Fkey_binding, 2);
-EXFUN (Fkey_description, 1);
-EXFUN (Fsingle_key_description, 2);
-EXFUN (Fwhere_is_internal, 4);
-extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int, int));
-extern Lisp_Object get_keyelt P_ ((Lisp_Object, int));
-extern Lisp_Object get_keymap P_ ((Lisp_Object, int, int));
-extern void describe_vector P_ ((Lisp_Object, Lisp_Object,
-                                void (*) (Lisp_Object), int,
-                                Lisp_Object, Lisp_Object, int *, int));
-extern void describe_map_tree P_ ((Lisp_Object, int, Lisp_Object, Lisp_Object,
-                                  char *, int, int, int));
-extern int current_minor_maps P_ ((Lisp_Object **, Lisp_Object **));
-extern void initial_define_key P_ ((Lisp_Object, int, char *));
-extern void initial_define_lispy_key P_ ((Lisp_Object, char *, char *));
-extern void syms_of_keymap P_ ((void));
-extern void keys_of_keymap P_ ((void));
 
 /* defined in indent.c */
 EXFUN (Fvertical_motion, 2);
@@ -2757,6 +2808,7 @@ EXFUN (Fnext_window, 3);
 EXFUN (Fdelete_window, 1);
 EXFUN (Fselect_window, 1);
 EXFUN (Fset_window_buffer, 2);
+EXFUN (Fwindow_buffer, 1);
 EXFUN (Fget_buffer_window, 2);
 EXFUN (Fsave_window_excursion, UNEVALLED);
 EXFUN (Fsplit_window, 3);
@@ -2775,6 +2827,7 @@ EXFUN (Fset_window_start, 3);
 extern void temp_output_buffer_show P_ ((Lisp_Object));
 extern void replace_buffer_in_all_windows P_ ((Lisp_Object));
 extern void init_window_once P_ ((void));
+extern void init_window P_ ((void));
 extern void syms_of_window P_ ((void));
 extern void keys_of_window P_ ((void));
 
@@ -2821,7 +2874,7 @@ extern void keys_of_frame P_ ((void));
 /* defined in emacs.c */
 extern Lisp_Object decode_env_path P_ ((char *, char *));
 extern Lisp_Object Vinvocation_name, Vinvocation_directory;
-extern Lisp_Object Vinstallation_directory;
+extern Lisp_Object Vinstallation_directory, empty_string;
 EXFUN (Fkill_emacs, 1);
 #if HAVE_SETLOCALE
 void fixup_locale P_ ((void));
@@ -2862,7 +2915,8 @@ extern void init_process P_ ((void));
 extern void syms_of_process P_ ((void));
 
 /* defined in callproc.c */
-extern Lisp_Object Vexec_path, Vexec_directory, Vdata_directory;
+extern Lisp_Object Vexec_path, Vexec_suffixes,
+                   Vexec_directory, Vdata_directory;
 extern Lisp_Object Vdoc_directory;
 EXFUN (Fcall_process, MANY);
 extern int child_setup P_ ((int, int, int, char **, int, Lisp_Object));
@@ -3102,3 +3156,18 @@ extern Lisp_Object Vdirectory_sep_char;
            (EQ (hare, tortoise)                        \
             && (circular_list_error ((list)), 1)))     \
         : 0)))
+
+/* The ubiquitous min and max macros.  */
+
+#ifdef max
+#undef max
+#undef min
+#endif
+#define min(a, b)      ((a) < (b) ? (a) : (b))
+#define max(a, b)      ((a) > (b) ? (a) : (b))
+
+/* Return a fixnum or float, depending on whether VAL fits in a Lisp
+   fixnum.  */
+
+#define make_fixnum_or_float(val) \
+   (FIXNUM_OVERFLOW_P (val) ? make_float (val) : make_number (val))