Function: rng-resolve-path

rng-resolve-path is a byte-compiled function defined in rng-uri.el.gz.

Signature

(rng-resolve-path PATH BASE-PATH)

Source Code

;; Defined in /usr/src/emacs/lisp/nxml/rng-uri.el.gz
;; See RFC 2396 5.2, steps 5 and 6
(defun rng-resolve-path (path base-path)
  ;; Step 5
  (if (or (string-match "\\`/" path)
	  (not (string-match "\\`/" base-path)))
      path
    ;; Step 6
    ;; (a), (b)
    (let ((segments (rng-split-path path))
	  (base-segments (rng-split-path base-path)))
      (if (> (length base-segments) 1)
	  (setq segments (nconc (nbutlast base-segments)
				segments))
	(setcar segments
		(concat (car base-segments) (car segments))))
      ;; (d)
      (let ((last-segment (last segments)))
	(when (equal (car last-segment) ".")
	  (setcar last-segment "")))
      ;; (c)
      (setq segments (delete "." segments))
      ;; (e)
      (let (iter matched)
	(while (progn
		 (setq matched nil)
		 (setq iter (cdr segments))
		 (while (and iter (not matched))
		   (if (or (not (equal (cadr iter) ".."))
			   (equal (car iter) ".."))
		       (setq iter (cdr iter))
		     (setcar iter nil)
		     (setcar (cdr iter)
			     ;; (f)
			     (if (cddr iter) nil ""))
		     (setq matched t)
		     (setq segments (delq nil segments))))
		 matched)))
      (rng-join-path segments))))