]> code.delx.au - gnu-emacs/commitdiff
Fix last changes in make-docfile.c.
authorEli Zaretskii <eliz@gnu.org>
Sat, 20 Oct 2012 15:26:10 +0000 (17:26 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 20 Oct 2012 15:26:10 +0000 (17:26 +0200)
 lib-src/make-docfile.c (IS_SLASH, DEF_ELISP_FILE): New macros.
 (scan_lisp_file): Only pass a .el file if its basename matches a
 known file in its entirety.  Use IS_SLASH and DEF_ELISP_FILE.

lib-src/ChangeLog
lib-src/make-docfile.c

index 40da102620bb8d8b2f571f878963cc7847f3a6cf..bcb71daca5da037e0878c7913a5ee0c4b4e99638 100644 (file)
@@ -1,3 +1,9 @@
+2012-10-20  Eli Zaretskii  <eliz@gnu.org>
+
+       * make-docfile.c (IS_SLASH, DEF_ELISP_FILE): New macros.
+       (scan_lisp_file): Only pass a .el file if its basename matches a
+       known file in its entirety.  Use IS_SLASH and DEF_ELISP_FILE.
+
 2012-10-20  Andreas Schwab  <schwab@linux-m68k.org>
 
        * make-docfile.c (scan_lisp_file): Add bounds checking.
index 2f04f1c96f3cb78c5172393a81b1c4b40844d75b..b6cd1530a4ce8059bb195b4e081e22396f2f73c8 100644 (file)
@@ -58,9 +58,11 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #undef chdir
 #define READ_TEXT "rt"
 #define READ_BINARY "rb"
+#define IS_SLASH(c)  ((c) == '/' || (c) == '\\' || (c) == ':')
 #else  /* not DOS_NT */
 #define READ_TEXT "r"
 #define READ_BINARY "r"
+#define IS_SLASH(c)  ((c) == '/')
 #endif /* not DOS_NT */
 
 static int scan_file (char *filename);
@@ -1098,6 +1100,8 @@ search_lisp_doc_at_eol (FILE *infile)
   return 1;
 }
 
+#define DEF_ELISP_FILE(fn)  { #fn, sizeof(#fn) - 1 }
+
 static int
 scan_lisp_file (const char *filename, const char *mode)
 {
@@ -1108,12 +1112,14 @@ scan_lisp_file (const char *filename, const char *mode)
      follow the conventions of the doc strings expected by this
      function.  These conventions are automatically followed by the
      byte compiler when it produces the .elc files.  */
-  static const char *const uncompiled[] =
-    {
-      "loaddefs.el",
-      "loadup.el",
-      "charprop.el"
-    };
+  static struct {
+    const char *fn;
+    size_t fl;
+  } const uncompiled[] = {
+    DEF_ELISP_FILE (loaddefs.el),
+    DEF_ELISP_FILE (loadup.el),
+    DEF_ELISP_FILE (charprop.el)
+  };
   int i, match;
   size_t flen = strlen (filename);
 
@@ -1124,9 +1130,10 @@ scan_lisp_file (const char *filename, const char *mode)
       for (i = 0, match = 0; i < sizeof (uncompiled) / sizeof (uncompiled[0]);
           i++)
        {
-         if (strlen (uncompiled[i]) <= flen
-             && !strcmp (filename + flen - strlen (uncompiled[i]),
-                         uncompiled[i]))
+         if (uncompiled[i].fl <= flen
+             && !strcmp (filename + flen - uncompiled[i].fl, uncompiled[i].fn)
+             && (flen == uncompiled[i].fl
+                 || IS_SLASH (filename[flen - uncompiled[i].fl - 1])))
            {
              match = 1;
              break;