annotate lisp/find-paths.el @ 2362:6aa56b089139

[xemacs-hg @ 2004-11-02 09:51:04 by ben] To: xemacs-patches@xemacs.org internals/index.texi: Deleted. Incorporated into internals.texi. Having a separate index file messes up texinfo-master-menu. internals/internals.texi: Add bunches and bunches and bunches and bunches of stuff, taken from documentation floating around in various places -- text.c, file-coding.c, other .c and .h files, stuff that I wrote up for an old XEmacs contract, proposals written up in the process of an e-mail discussion, etc. Fix up some mistakes, esp. in CCL. Extra crap from CCL, duplicated with Lispref, removed. Sections on Old Future Work and Future Work Discussion added. Bunches of other work. Add bunches of documentation taken from the source code. Fixup various places to use @strong{}, @code{}, @file{}. Create new Text chapter, split off from Buffers and Textual Representation. Create new chapter for MS Windows, mostly written from scratch. Consolidate all Mule info under "Multilingual Support". Break up chapter on modules and move some parts to the sections discussing the modules, for consolidation purposes. Add a big cross-reference table for all the modules to where they're discussed (or not). New chapter Asynchronous Events; Quit Checking. (Taken from various parts of the code.) New Introduction. New section on Focus Handling (from the code). NOTE that in the process, I discovered that we essentially have FOUR redundant introductions to Mule issues! Someone really needs to go through and clean them up and integrate them (sjt?).
author ben
date Tue, 02 Nov 2004 09:51:18 +0000
parents 13a418960a88
children f4e405a9d18d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; find-paths.el --- setup various XEmacs paths
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1985-1986, 1990, 1992-1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (c) 1993, 1994 Sun Microsystems, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Copyright (C) 1995 Board of Trustees, University of Illinois
1330
4542b72c005e [xemacs-hg @ 2003-03-01 07:25:26 by ben]
ben
parents: 1227
diff changeset
6 ;; Copyright (C) 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Author: Mike Sperber <sperber@informatik.uni-tuebingen.de>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; Keywords: internal, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;; along with XEmacs; see the file COPYING. If not, write to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;; Free Software Foundation, 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;; Boston, MA 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;;; Synched up with: Not in FSF.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
776
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 689
diff changeset
35 ;; This file contains basic library functionality for manipulating paths
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 689
diff changeset
36 ;; and path lists and finding paths in the XEmacs hierarchy.
79940b592197 [xemacs-hg @ 2002-03-15 07:43:14 by ben]
ben
parents: 689
diff changeset
37
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 (defvar paths-version-control-filename-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 "^\\(RCS\\|CVS\\|SCCS\\)$"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 "File bases associated with version control.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (defvar paths-lisp-filename-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 "^\\(.*\\.elc?\\)$"
2297
13a418960a88 [xemacs-hg @ 2004-09-22 02:05:42 by stephent]
stephent
parents: 1330
diff changeset
47 "File bases that name Emacs Lisp files.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 (defvar paths-no-lisp-directory-regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 (concat "\\(" paths-version-control-filename-regexp "\\)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 "\\|"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 "\\(" paths-lisp-filename-regexp "\\)")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 "File bases that may not be directories containing Lisp code.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 (defun paths-find-recursive-path (directories &optional max-depth exclude-regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 "Return a list of the directory hierarchy underneath DIRECTORIES.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 The returned list is sorted by pre-order and lexicographically.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 MAX-DEPTH limits the depth of the search to MAX-DEPTH level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 if it is a number. If MAX-DEPTH is NIL, the search depth is unlimited.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 EXCLUDE-REGEXP is a regexp that matches directory names to exclude
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 from the search."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 (let ((path '()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (while directories
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 (let ((directory (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 (expand-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 (car directories)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 (if (paths-file-readable-directory-p directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 (let ((raw-entries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 (if (equal 0 max-depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 '()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 (directory-files directory nil "^[^.-]")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (reverse-dirs '()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (while raw-entries
531
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 442
diff changeset
74 (if (not (and exclude-regexp
0493e9f3c27f [xemacs-hg @ 2001-05-12 11:16:12 by ben]
ben
parents: 442
diff changeset
75 (string-match exclude-regexp (car raw-entries))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 (setq reverse-dirs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (cons (expand-file-name (car raw-entries) directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 reverse-dirs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 (setq raw-entries (cdr raw-entries)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (let ((sub-path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (paths-find-recursive-path (reverse reverse-dirs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 (if (numberp max-depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 (- max-depth 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 max-depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 exclude-regexp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 (setq path (nconc path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 (list directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 sub-path))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 (setq directories (cdr directories)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (defun paths-file-readable-directory-p (filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 "Check if filename is a readable directory."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (and (file-directory-p filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (file-readable-p filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 (defun paths-find-recursive-load-path (directories &optional max-depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 "Construct a recursive load path underneath DIRECTORIES."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 (paths-find-recursive-path directories
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 max-depth paths-no-lisp-directory-regexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 (defun paths-chase-symlink (file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 "Chase a symlink until the bitter end."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 (let ((maybe-symlink (file-symlink-p file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (if maybe-symlink
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 (let* ((directory (file-name-directory file-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 (destination (expand-file-name maybe-symlink directory)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 (paths-chase-symlink destination))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 file-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 (defun paths-construct-path (components &optional expand-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 "Convert list of path components COMPONENTS into a path.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 If EXPAND-DIRECTORY is non-NIL, use it as a directory to feed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 to EXPAND-FILE-NAME."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 (let* ((reverse-components (reverse components))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 (last-component (car reverse-components))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (first-components (reverse (cdr reverse-components)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (apply #'concat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 (append (mapcar #'file-name-as-directory first-components)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 (list last-component)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (if expand-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 (expand-file-name path expand-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (defun paths-construct-emacs-directory (root suffix base)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 "Construct a directory name within the XEmacs hierarchy."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (expand-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (concat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 (file-name-as-directory root)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 suffix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 base))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (defun paths-find-emacs-directory (roots suffix base
1218
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
137 &optional envvar default keep-suffix)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 "Find a directory in the XEmacs hierarchy.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 ROOTS must be a list of installation roots.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 SUFFIX is the subdirectory from there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 BASE is the base to look for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 ENVVAR is the name of the environment variable that might also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 specify the directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 DEFAULT is the preferred value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 If KEEP-SUFFIX is non-nil, the suffix must be respected in searching
1218
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
146 the directory."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (let ((preferred-value (or (and envvar (getenv envvar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 default)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (if (and preferred-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 (paths-file-readable-directory-p preferred-value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 (file-name-as-directory preferred-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 (catch 'gotcha
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (while roots
1218
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
154 (let* ((root (car roots))
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
155 ;; installed
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
156 (path (paths-construct-emacs-directory root suffix base)))
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
157 (if (paths-file-readable-directory-p path)
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
158 (throw 'gotcha path)
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
159 ;; in-place
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
160 (if (null keep-suffix)
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
161 (let ((path (paths-construct-emacs-directory root "" base)))
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
162 (if (paths-file-readable-directory-p path)
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
163 (throw 'gotcha path))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (setq roots (cdr roots)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
1218
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
167 (defun paths-find-site-directory (roots base &optional envvar default)
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
168 "Find a site-specific directory in the XEmacs hierarchy."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 (paths-find-emacs-directory roots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (paths-construct-path (list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 "lib"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 emacs-program-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 base
1218
ceedb6eeaba8 [xemacs-hg @ 2003-01-16 08:59:47 by michaels]
michaels
parents: 865
diff changeset
175 envvar default))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (defun paths-find-version-directory (roots base
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 &optional envvar default enforce-version)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 "Find a version-specific directory in the XEmacs hierarchy.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 If ENFORCE-VERSION is non-nil, the directory must contain the XEmacs version."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (paths-find-emacs-directory roots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 (paths-construct-path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 (list "lib"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (construct-emacs-version-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 base
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 envvar default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 enforce-version))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (defun paths-find-architecture-directory (roots base &optional envvar default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 "Find an architecture-specific directory in the XEmacs hierarchy."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 (or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 ;; from more to less specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 (paths-find-version-directory roots
865
987c2a685f39 [xemacs-hg @ 2002-06-04 16:45:42 by michaels]
michaels
parents: 776
diff changeset
195 (paths-construct-path
987c2a685f39 [xemacs-hg @ 2002-06-04 16:45:42 by michaels]
michaels
parents: 776
diff changeset
196 (list system-configuration base))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 envvar default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (paths-find-version-directory roots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 base
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 envvar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (paths-find-version-directory roots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 system-configuration
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 envvar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 (defun construct-emacs-version-name ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 "Construct the raw XEmacs version number."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 (concat emacs-program-name "-" emacs-program-version))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (defun paths-directories-which-exist (directories)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 "Return the directories among DIRECTORIES."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (let ((reverse-directories '()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (while directories
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 (if (paths-file-readable-directory-p (car directories))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 (setq reverse-directories
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (cons (car directories)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 reverse-directories)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (setq directories (cdr directories)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (reverse reverse-directories)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (defun paths-uniq-append (list-1 list-2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 "Append LIST-1 and LIST-2, omitting duplicates."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (let ((reverse-survivors '()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 (while list-2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 (if (null (member (car list-2) list-1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 (setq reverse-survivors (cons (car list-2) reverse-survivors)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 (setq list-2 (cdr list-2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 (append list-1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 (reverse reverse-survivors))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (defun paths-filter (predicate list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 "Delete all matches of PREDICATE from LIST."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (let ((reverse-result '()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (while list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 (if (funcall predicate (car list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (setq reverse-result (cons (car list) reverse-result)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (setq list (cdr list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 (nreverse reverse-result)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (defun paths-decode-directory-path (string &optional drop-empties)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 "Split STRING at path separators into a directory list.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
241 Non-\"\" components are converted into directory form.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 If DROP-EMPTIES is non-NIL, \"\" components are dropped from the output.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 Otherwise, they are left alone."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 (let* ((components (split-path string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 (directories
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (mapcar #'(lambda (component)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (if (string-equal "" component)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 component
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 (file-name-as-directory component)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 components)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 (if drop-empties
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 (paths-filter #'(lambda (component)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (null (string-equal "" component)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 directories)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 directories)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 ;;; find-paths.el ends here