(read_char): Save and restore echo_string when
[bpt/emacs.git] / src / doc.c
index 473ba91..f306cae 100644 (file)
--- a/src/doc.c
+++ b/src/doc.c
@@ -1,5 +1,6 @@
 /* Record indices of function doc strings stored in a file.
-   Copyright (C) 1985, 86,93,94,95,97,98,99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1985, 86,93,94,95,97,98,99,2000,04
+             Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -23,8 +24,9 @@ Boston, MA 02111-1307, USA.  */
 
 #include <sys/types.h>
 #include <sys/file.h>  /* Must be after sys/types.h for USG and BSD4_1*/
+#include <ctype.h>
 
-#ifdef USG5
+#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
 
@@ -50,6 +52,9 @@ Lisp_Object Vdoc_file_name;
 
 Lisp_Object Qfunction_documentation;
 
+/* A list of files used to build this Emacs binary.  */
+static Lisp_Object Vbuild_files;
+
 extern Lisp_Object Voverriding_local_map;
 
 /* For VMS versions with limited file name syntax,
@@ -151,7 +156,7 @@ get_doc_string (filepos, unibyte, definition)
 
   if (!STRINGP (file))
     return Qnil;
-    
+
   /* Put the file name in NAME as a C string.
      If it is relative, combine it with Vdoc_directory.  */
 
@@ -375,12 +380,12 @@ string is passed through `substitute-command-keys'.  */)
  documentation:
 
   doc = Qnil;
-  
+
   if (SYMBOLP (function)
       && (tem = Fget (function, Qfunction_documentation),
          !NILP (tem)))
     return Fdocumentation_property (function, Qfunction_documentation, raw);
-  
+
   fun = Findirect_function (function);
   if (SUBRP (fun))
     {
@@ -487,7 +492,7 @@ aren't strings.  */)
   Lisp_Object tem;
 
  documentation_property:
-  
+
   tem = Fget (symbol, prop);
   if (EQ (tem, make_number (0)))
     tem = Qnil;
@@ -512,7 +517,7 @@ aren't strings.  */)
   else if (!STRINGP (tem))
     /* Feval protects its argument.  */
     tem = Feval (tem);
-  
+
   if (NILP (raw) && STRINGP (tem))
     tem = Fsubstitute_command_keys (tem);
   return tem;
@@ -569,7 +574,7 @@ records them in function and variable definitions.
 The function takes one argument, FILENAME, a string;
 it specifies the file name (without a directory) of the DOC file.
 That file is found in `../etc' now; later, when the dumped Emacs is run,
-the same file name is found in the `data-directory'.  */)
+the same file name is found in the `doc-directory'.  */)
      (filename)
      Lisp_Object filename;
 {
@@ -580,6 +585,7 @@ the same file name is found in the `data-directory'.  */)
   register char *p, *end;
   Lisp_Object sym;
   char *name;
+  int skip_file = 0;
 
   CHECK_STRING (filename);
 
@@ -612,12 +618,59 @@ the same file name is found in the `data-directory'.  */)
        *p = '_';
       p++;
     }
-#endif /* not VMS4_4 */
-#ifdef VMS4_4
+#else /* VMS4_4 */
   strcpy (name, sys_translate_unix (name));
 #endif /* VMS4_4 */
 #endif /* VMS */
 
+  /* Vbuild_files is nil when temacs is run, and non-nil after that.  */
+  if (NILP (Vbuild_files))
+  {
+    size_t cp_size = 0;
+    size_t to_read;
+    int nr_read;
+    char *cp = NULL;
+    char *beg, *end;
+
+    fd = emacs_open ("buildobj.lst", O_RDONLY, 0);
+    if (fd < 0)
+      report_file_error ("Opening file buildobj.lst", Qnil);
+
+    filled = 0;
+    for (;;)
+      {
+        cp_size += 1024;
+        to_read = cp_size - 1 - filled;
+        cp = xrealloc (cp, cp_size);
+        nr_read = emacs_read (fd, &cp[filled], to_read);
+        filled += nr_read;
+        if (nr_read < to_read)
+          break;
+      }
+
+    emacs_close (fd);
+    cp[filled] = 0;
+
+    for (beg = cp; *beg; beg = end)
+      {
+        int len;
+
+        while (*beg && isspace (*beg)) ++beg;
+
+        for (end = beg; *end && ! isspace (*end); ++end)
+          if (*end == '/') beg = end+1;  /* skip directory part  */
+
+        len = end - beg;
+        if (len > 4 && end[-4] == '.' && end[-3] == 'o')
+          len -= 2;  /* Just take .o if it ends in .obj  */
+
+        if (len > 0)
+          Vbuild_files = Fcons (make_string (beg, len), Vbuild_files);
+      }
+
+    xfree (cp);
+  }
+
   fd = emacs_open (name, O_RDONLY, 0);
   if (fd < 0)
     report_file_error ("Opening doc string file",
@@ -640,10 +693,28 @@ the same file name is found in the `data-directory'.  */)
       if (p != end)
        {
          end = (char *) index (p, '\n');
+
+          /* See if this is a file name, and if it is a file in build-files.  */
+          if (p[1] == 'S' && end - p > 4 && end[-2] == '.'
+              && (end[-1] == 'o' || end[-1] == 'c'))
+            {
+              int len = end - p - 2;
+              char *fromfile = alloca (len + 1);
+              strncpy (fromfile, &p[2], len);
+              fromfile[len] = 0;
+              if (fromfile[len-1] == 'c')
+                fromfile[len-1] = 'o';
+
+              if (EQ (Fmember (build_string (fromfile), Vbuild_files), Qnil))
+                skip_file = 1;
+              else
+                skip_file = 0;
+            }
+
          sym = oblookup (Vobarray, p + 2,
                          multibyte_chars_in_text (p + 2, end - p - 2),
                          end - p - 2);
-         if (SYMBOLP (sym))
+         if (! skip_file && SYMBOLP (sym))
            {
              /* Attach a docstring to a variable?  */
              if (p[1] == 'V')
@@ -660,6 +731,9 @@ the same file name is found in the `data-directory'.  */)
              else if (p[1] == 'F')
                store_function_docstring (sym, pos + end + 1 - buf);
 
+             else if (p[1] == 'S')
+               ; /* Just a source file name boundary marker.  Ignore it.  */
+
              else
                error ("DOC file invalid at position %d", pos);
            }
@@ -725,7 +799,7 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
   bsize = SBYTES (string);
   bufp = buf = (unsigned char *) xmalloc (bsize);
 
-  strp = (unsigned char *) SDATA (string);
+  strp = SDATA (string);
   while (strp < SDATA (string) + SBYTES (string))
     {
       if (strp[0] == '\\' && strp[1] == '=')
@@ -753,7 +827,6 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
        }
       else if (strp[0] == '\\' && strp[1] == '[')
        {
-         Lisp_Object firstkey;
          int start_idx;
 
          changed = 1;
@@ -761,7 +834,7 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
          start = strp;
          start_idx = start - SDATA (string);
 
-         while ((strp - (unsigned char *) SDATA (string)
+         while ((strp - SDATA (string)
                  < SBYTES (string))
                 && *strp != ']')
            strp++;
@@ -770,25 +843,19 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
          strp++;               /* skip ] */
 
          /* Save STRP in IDX.  */
-         idx = strp - (unsigned char *) SDATA (string);
-         tem = Fintern (make_string (start, length_byte), Qnil);
+         idx = strp - SDATA (string);
+         name = Fintern (make_string (start, length_byte), Qnil);
+
+         /* Ignore remappings unless there are no ordinary bindings. */
+         tem = Fwhere_is_internal (name, keymap, Qt, Qnil, Qt);
+         if (NILP (tem))
+           tem = Fwhere_is_internal (name, keymap, Qt, Qnil, Qnil);
 
          /* Note the Fwhere_is_internal can GC, so we have to take
             relocation of string contents into account.  */
-         tem = Fwhere_is_internal (tem, keymap, Qt, Qnil, Qnil);
          strp = SDATA (string) + idx;
          start = SDATA (string) + start_idx;
 
-         /* Disregard menu bar bindings; it is positively annoying to
-            mention them when there's no menu bar, and it isn't terribly
-            useful even when there is a menu bar.  */
-         if (!NILP (tem))
-           {
-             firstkey = Faref (tem, make_number (0));
-             if (EQ (firstkey, Qmenu_bar))
-               tem = Qnil;
-           }
-
          if (NILP (tem))       /* but not on any keys */
            {
              int offset = bufp - buf;
@@ -805,7 +872,7 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
            }
          else
            {                   /* function is on a key */
-             tem = Fkey_description (tem);
+             tem = Fkey_description (tem, Qnil);
              goto subst_string;
            }
        }
@@ -821,8 +888,7 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
          start = strp;
          start_idx = start - SDATA (string);
 
-         while ((strp - (unsigned char *) SDATA (string)
-                 < SCHARS (string))
+         while ((strp - SDATA (string) < SBYTES (string))
                 && *strp != '}' && *strp != '>')
            strp++;
 
@@ -830,7 +896,7 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
          strp++;                       /* skip } or > */
 
          /* Save STRP in IDX.  */
-         idx = strp - (unsigned char *) SDATA (string);
+         idx = strp - SDATA (string);
 
          /* Get the value of the keymap in TEM, or nil if undefined.
             Do this while still in the user's current buffer
@@ -918,13 +984,20 @@ syms_of_doc ()
 {
   Qfunction_documentation = intern ("function-documentation");
   staticpro (&Qfunction_documentation);
-  
+
   DEFVAR_LISP ("internal-doc-file-name", &Vdoc_file_name,
               doc: /* Name of file containing documentation strings of built-in symbols.  */);
   Vdoc_file_name = Qnil;
 
+  DEFVAR_LISP ("build-files", &Vbuild_files,
+               doc: /* A list of files used to build this Emacs binary.  */);
+  Vbuild_files = Qnil;
+
   defsubr (&Sdocumentation);
   defsubr (&Sdocumentation_property);
   defsubr (&Ssnarf_documentation);
   defsubr (&Ssubstitute_command_keys);
 }
+
+/* arch-tag: 56281d4d-6949-43e2-be2e-f6517de744ba
+   (do not change this comment) */