emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/subr.el


From: Stefan Monnier
Subject: [Emacs-diffs] Changes to emacs/lisp/subr.el
Date: Mon, 06 Dec 2004 10:19:40 -0500

Index: emacs/lisp/subr.el
diff -c emacs/lisp/subr.el:1.428 emacs/lisp/subr.el:1.429
*** emacs/lisp/subr.el:1.428    Tue Nov 23 15:23:57 2004
--- emacs/lisp/subr.el  Mon Dec  6 15:11:51 2004
***************
*** 2188,2193 ****
--- 2188,2233 ----
        ;; Reconstruct a string from the pieces.
        (setq matches (cons (substring string start l) matches)) ; leftover
        (apply #'concat (nreverse matches)))))
+ 
+ (defun subregexp-context-p (regexp pos &optional start)
+   "Return non-nil if POS is in a normal subregexp context in REGEXP.
+ A subregexp context is one where a sub-regexp can appear.
+ A non-subregexp context is for example within brackets, or within a repetition
+ bounds operator \\{..\\}, or right after a \\.
+ If START is non-nil, it should be a position in REGEXP, smaller than POS,
+ and known to be in a subregexp context."
+   ;; Here's one possible implementation, with the great benefit that it
+   ;; reuses the regexp-matcher's own parser, so it understands all the
+   ;; details of the syntax.  A disadvantage is that it needs to match the
+   ;; error string.
+   (condition-case err
+       (progn
+         (string-match (substring regexp (or start 0) pos) "")
+         t)
+     (invalid-regexp
+      (not (member (cadr err) '("Unmatched [ or [^"
+                                "Unmatched \\{"
+                                "Trailing backslash")))))
+   ;; An alternative implementation:
+   ;; (defconst re-context-re
+   ;;   (let* ((harmless-ch "[^\\[]")
+   ;;          (harmless-esc "\\\\[^{]")
+   ;;          (class-harmless-ch "[^][]")
+   ;;          (class-lb-harmless "[^]:]")
+   ;;          (class-lb-colon-maybe-charclass ":\\([a-z]+:]\\)?")
+   ;;          (class-lb (concat "\\[\\(" class-lb-harmless
+   ;;                            "\\|" class-lb-colon-maybe-charclass "\\)"))
+   ;;          (class
+   ;;           (concat "\\[^?]?"
+   ;;                   "\\(" class-harmless-ch
+   ;;                   "\\|" class-lb "\\)*"
+   ;;                   "\\[?]"))     ; special handling for bare [ at end of 
re
+   ;;          (braces "\\\\{[0-9,]+\\\\}"))
+   ;;     (concat "\\`\\(" harmless-ch "\\|" harmless-esc
+   ;;             "\\|" class "\\|" braces "\\)*\\'"))
+   ;;   "Matches any prefix that corresponds to a normal subregexp context.")
+   ;; (string-match re-context-re (substring regexp (or start 0) pos))
+   )
  
  (defun shell-quote-argument (argument)
    "Quote an argument for passing as argument to an inferior shell."




reply via email to

[Prev in Thread] Current Thread [Next in Thread]