savannah-hackers
[Top][All Lists]
Advanced

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

[Savannah-help-public] More about log_accum problem


From: Richard Stallman
Subject: [Savannah-help-public] More about log_accum problem
Date: Sat, 22 Jul 2006 11:49:42 -0400

------- Start of forwarded message -------
To: address@hidden
Subject: Re: What was this?
From: Stefan Monnier <address@hidden>
Date: Fri, 21 Jul 2006 16:30:21 -0400
In-Reply-To: <address@hidden> (Richard Stallman's message of "Fri, 21 Jul 2006 
15:36:50 -0400")
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=failed 
        version=3.0.4

> What did you check in at this time?  There is no other check-in recorded
> in emacs-diffs, so I cannot tell.  Was this in a branch?


> Date: Thu, 20 Jul 2006 21:23:49 +0000
> From: Stefan Monnier <address@hidden>
> Subject: [Emacs-diffs] (no subject)
> To: address@hidden
> Message-ID: <address@hidden>

> CVSROOT:      /sources/emacs
> Module name:  emacs
> Changes by:   Stefan Monnier <monnier>        06/07/20 21:23:49

I believe this is the attached patch which I committed on the trunk.
No branch in sight.

Looking at http://lists.gnu.org/archive/html/emacs-diffs/2006-07/index.html
I see that the `ChangeLog' part of my commit is properly recorded in the
emacs-diffs archive, but the lisp/progmodes/sh-script.el part isn't.
Also I see that this problem is endemic.


        Stefan


Index: lisp/progmodes/sh-script.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/progmodes/sh-script.el,v
retrieving revision 1.184
retrieving revision 1.185
diff -u -r1.184 -r1.185
- --- lisp/progmodes/sh-script.el       19 Jul 2006 04:31:40 -0000      1.184
+++ lisp/progmodes/sh-script.el 20 Jul 2006 21:23:48 -0000      1.185
@@ -980,54 +980,55 @@
   (re-search-forward sh-here-doc-re limit t))
 
 (defun sh-quoted-subshell (limit)
- -  "Search for a subshell embedded in a string. Find all the unescaped
- -\" characters within said subshell, remembering that subshells can nest."
+  "Search for a subshell embedded in a string.
+Find all the unescaped \" characters within said subshell, remembering that
+subshells can nest."
   ;; FIXME: This can (and often does) match multiple lines, yet it makes no
   ;; effort to handle multiline cases correctly, so it ends up being
   ;; rather flakey.
- -  (if (re-search-forward 
"\"\\(?:\\(?:.\\|\n\\)*?[^\\]\\(\\\\\\\\\\)*\\)??\\(\\$(\\|`\\)" limit t)
- -      ;; bingo we have a $( or a ` inside a ""
- -      (let ((char (char-after (point)))
- -            (continue t)
- -            (pos (point))
- -            (data nil)    ;; value to put into match-data (and return)
- -            (last nil)    ;; last char seen
- -            (bq  (equal (match-string 1) "`")) ;; ` state flip-flop
- -            (seen nil)    ;; list of important positions
- -            (nest 1))     ;; subshell nesting level
- -        (while (and continue char (<= pos limit))
- -          ;; unescaped " inside a $( ... ) construct.
- -          ;; state machine time...
- -          ;; \ => ignore next char;
- -          ;; ` => increase or decrease nesting level based on bq flag
- -          ;; ) [where nesting > 0] => decrease nesting
- -          ;; ( [where nesting > 0] => increase nesting
- -          ;; ( [preceeded by $ ]   => increase nesting
- -          ;; " [nesting <= 0 ]     => terminate, we're done.
- -          ;; " [nesting >  0 ]     => remember this, it's not a proper "
- -          ;; FIXME: don't count parens that appear within quotes.
- -          (cond
- -           ((eq ?\\ last) nil)
- -           ((eq ?\` char) (setq nest (+ nest (if bq -1 1)) bq (not bq)))
- -           ((and (> nest 0) (eq ?\) char))   (setq nest (1- nest)))
- -           ((and (eq ?$ last) (eq ?\( char)) (setq nest (1+ nest)))
- -           ((and (> nest 0) (eq ?\( char))   (setq nest (1+ nest)))
- -           ((eq char ?\")
- -            (if (>= 0 nest) (setq continue nil) (push pos seen))))
- -          ;;(message "POS: %d [%d]" pos nest)
- -          (setq last char
- -                pos  (1+ pos)
- -                char (char-after pos)) )
- -        ;; FIXME: why construct a costly match data to pass to
- -        ;; sh-apply-quoted-subshell rather than apply the highlight
- -        ;; directly here?  -- Stef
- -        (when seen
- -          ;;(message "SEEN: %S" seen)
- -          (setq data (list (current-buffer)))
- -          (dolist(P seen)
- -            (setq data (cons P (cons (1+ P) data))))
- -          (store-match-data data))
- -        data) ))
+  (when (re-search-forward 
"\"\\(?:\\(?:.\\|\n\\)*?[^\\]\\(?:\\\\\\\\\\)*\\)??\\(\\$(\\|`\\)" limit t)
+    ;; bingo we have a $( or a ` inside a ""
+    (let ((char (char-after (point)))
+          (continue t)
+          (pos (point))
+          (data nil)      ;; value to put into match-data (and return)
+          (last nil)      ;; last char seen
+          (bq  (equal (match-string 1) "`")) ;; ` state flip-flop
+          (seen nil)                         ;; list of important positions
+          (nest 1))                          ;; subshell nesting level
+      (while (and continue char (<= pos limit))
+        ;; unescaped " inside a $( ... ) construct.
+        ;; state machine time...
+        ;; \ => ignore next char;
+        ;; ` => increase or decrease nesting level based on bq flag
+        ;; ) [where nesting > 0] => decrease nesting
+        ;; ( [where nesting > 0] => increase nesting
+        ;; ( [preceeded by $ ]   => increase nesting
+        ;; " [nesting <= 0 ]     => terminate, we're done.
+        ;; " [nesting >  0 ]     => remember this, it's not a proper "
+        ;; FIXME: don't count parens that appear within quotes.
+        (cond
+         ((eq ?\\ last) nil)
+         ((eq ?\` char) (setq nest (+ nest (if bq -1 1)) bq (not bq)))
+         ((and (> nest 0) (eq ?\) char))   (setq nest (1- nest)))
+         ((and (eq ?$ last) (eq ?\( char)) (setq nest (1+ nest)))
+         ((and (> nest 0) (eq ?\( char))   (setq nest (1+ nest)))
+         ((eq char ?\")
+          (if (>= 0 nest) (setq continue nil) (push pos seen))))
+        ;;(message "POS: %d [%d]" pos nest)
+        (setq last char
+              pos  (1+ pos)
+              char (char-after pos)) )
+      ;; FIXME: why construct a costly match data to pass to
+      ;; sh-apply-quoted-subshell rather than apply the highlight
+      ;; directly here?  -- Stef
+      (when seen
+        ;;(message "SEEN: %S" seen)
+        (setq data (list (current-buffer)))
+        (dolist(P seen)
+          (setq data (cons P (cons (1+ P) data))))
+        (store-match-data data))
+      data) ))
 
 (defun sh-is-quoted-p (pos)
   (and (eq (char-before pos) ?\\)
------- End of forwarded message -------




reply via email to

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