diff src/fns.c @ 39850:80b844540f64

(Ffeaturep): Add new `subfeature' arg. (Fprovide): Add new `subfeatures' arg. Use `after-load-alist'. (Qsubfeatures): New var. (syms_of_fns): Initialize it.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 12 Oct 2001 21:42:09 +0000
parents 0b986bb45526
children 34ec3a68775d
line wrap: on
line diff
--- a/src/fns.c	Fri Oct 12 21:21:17 2001 +0000
+++ b/src/fns.c	Fri Oct 12 21:42:09 2001 +0000
@@ -3022,27 +3022,33 @@
   return ret;
 }
 
-Lisp_Object Vfeatures;
-
-DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 1, 0,
+Lisp_Object Vfeatures, Qsubfeatures, Vafter_load_alist;
+
+DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 2, 0,
   "Returns t if FEATURE is present in this Emacs.\n\
 Use this to conditionalize execution of lisp code based on the presence or\n\
 absence of emacs or environment extensions.\n\
 Use `provide' to declare that a feature is available.\n\
-This function looks at the value of the variable `features'.")
-  (feature)
-     Lisp_Object feature;
+This function looks at the value of the variable `features'.\n\
+The optional argument SUBFEATURE can be used to check a specific\n\
+subfeature of FEATURE.")
+  (feature, subfeature)
+     Lisp_Object feature, subfeature;
 {
   register Lisp_Object tem;
   CHECK_SYMBOL (feature, 0);
   tem = Fmemq (feature, Vfeatures);
+  if (!NILP (tem) && !NILP (subfeature))
+    tem = Fmemq (subfeature, Fget (feature, Qsubfeatures));
   return (NILP (tem)) ? Qnil : Qt;
 }
 
-DEFUN ("provide", Fprovide, Sprovide, 1, 1, 0,
-  "Announce that FEATURE is a feature of the current Emacs.")
-  (feature)
-     Lisp_Object feature;
+DEFUN ("provide", Fprovide, Sprovide, 1, 2, 0,
+  "Announce that FEATURE is a feature of the current Emacs.\n\
+The optional argument SUBFEATURES should be a list of symbols listing\n\
+particular subfeatures supported in this version of FEATURE.")
+  (feature, subfeatures)
+     Lisp_Object feature, subfeatures;
 {
   register Lisp_Object tem;
   CHECK_SYMBOL (feature, 0);
@@ -3051,7 +3057,15 @@
   tem = Fmemq (feature, Vfeatures);
   if (NILP (tem))
     Vfeatures = Fcons (feature, Vfeatures);
+  if (!NILP (subfeatures))
+    Fput (feature, Qsubfeatures, subfeatures);
   LOADHIST_ATTACH (Fcons (Qprovide, feature));
+
+  /* Run any load-hooks for this file.  */
+  tem = Fassq (feature, Vafter_load_alist);
+  if (!NILP (tem))
+    Fprogn (Fcdr (tem));
+
   return feature;
 }
 
@@ -5253,6 +5267,8 @@
     "A list of symbols which are the features of the executing emacs.\n\
 Used by `featurep' and `require', and altered by `provide'.");
   Vfeatures = Qnil;
+  Qsubfeatures = intern ("subfeatures");
+  staticpro (&Qsubfeatures);
 
   DEFVAR_BOOL ("use-dialog-box", &use_dialog_box,
     "*Non-nil means mouse commands use dialog boxes to ask questions.\n\