From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Herbert Euler" Newsgroups: gmane.emacs.devel Subject: Re: Some problems in `add-log-current-defun' Date: Sun, 31 Dec 2006 16:28:14 +0800 Message-ID: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_3162_4834_2a51" X-Trace: sea.gmane.org 1167553770 24084 80.91.229.12 (31 Dec 2006 08:29:30 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sun, 31 Dec 2006 08:29:30 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Dec 31 09:29:28 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1H0w3e-0007So-9A for ged-emacs-devel@m.gmane.org; Sun, 31 Dec 2006 09:29:27 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1H0w3Y-0006jn-Ec for ged-emacs-devel@m.gmane.org; Sun, 31 Dec 2006 03:28:36 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1H0w3L-0006jc-Sf for emacs-devel@gnu.org; Sun, 31 Dec 2006 03:28:24 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1H0w3K-0006iu-9x for emacs-devel@gnu.org; Sun, 31 Dec 2006 03:28:23 -0500 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1H0w3K-0006il-24 for emacs-devel@gnu.org; Sun, 31 Dec 2006 03:28:22 -0500 Original-Received: from [65.54.246.169] (helo=bay0-omc2-s33.bay0.hotmail.com) by monty-python.gnu.org with esmtp (Exim 4.52) id 1H0w3F-0007jP-3i; Sun, 31 Dec 2006 03:28:18 -0500 Original-Received: from hotmail.com ([64.4.26.45]) by bay0-omc2-s33.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.2668); Sun, 31 Dec 2006 00:28:15 -0800 Original-Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Sun, 31 Dec 2006 00:28:15 -0800 Original-Received: from 64.4.26.200 by by112fd.bay112.hotmail.msn.com with HTTP; Sun, 31 Dec 2006 08:28:14 GMT X-Originating-IP: [202.165.107.100] X-Originating-Email: [herberteuler@hotmail.com] X-Sender: herberteuler@hotmail.com Original-To: rms@gnu.org, jet@gyve.org X-OriginalArrivalTime: 31 Dec 2006 08:28:15.0239 (UTC) FILETIME=[9DDA7170:01C72CB5] X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:64554 Archived-At: This is a multi-part message in MIME format. ------=_NextPart_000_3162_4834_2a51 Content-Type: text/plain; format=flowed PATCH FOR I, II, AND III I have tested my approach, it works. The patch, which solves all of I, II and III, is *** add-log.el Thu Dec 28 20:49:44 2006 --- add-log.el.1-3 Sun Dec 31 11:33:21 2006 *************** (defun add-log-current-defun () *** 813,863 **** (progn (forward-sexp 1) (point)))) ((memq major-mode add-log-c-like-modes) ! (beginning-of-line) ! ;; See if we are in the beginning part of a function, ! ;; before the open brace. If so, advance forward. ! (while (not (looking-at "{\\|\\(\\s *$\\)")) ! (forward-line 1)) ! (or (eobp) ! (forward-char 1)) ! (let (maybe-beg) ! ;; Try to find the containing defun. ! (beginning-of-defun) ! (end-of-defun) ! ;; If the defun we found ends before the desired position, ! ;; see if there's a DEFUN construct ! ;; between that end and the desired position. ! (when (save-excursion ! (and (> location (point)) ! (re-search-forward "^DEFUN" ! (save-excursion ! (goto-char location) ! (line-end-position)) ! t) ! (re-search-forward "^{" nil t) ! (setq maybe-beg (point)))) ! ;; If so, go to the end of that instead. ! (goto-char maybe-beg) ! (end-of-defun))) ! ;; If the desired position is within the defun we found, ! ;; find the function name. ! (when (< location (point)) ! ;; Move back over function body. ! (backward-sexp 1) ! (let (beg) ! ;; Skip back over typedefs and arglist. ! ;; Stop at the function definition itself ! ;; or at the line that follows end of function doc string. ! (forward-line -1) ! (while (and (not (bobp)) ! (looking-at "[ \t\n]") ! (not (looking-back "[*]/)\n" (- (point) 4)))) ! (forward-line -1)) ! ;; If we found a doc string, this must be the DEFUN macro ! ;; used in Emacs. Move back to the DEFUN line. ! (when (looking-back "[*]/)\n" (- (point) 4)) ! (backward-sexp 1) ! (beginning-of-line)) ;; Is this a DEFUN construct? And is LOCATION in it? (if (and (looking-at "DEFUN\\b") (>= location (point))) --- 813,868 ---- (progn (forward-sexp 1) (point)))) ((memq major-mode add-log-c-like-modes) ! ;; See whether the point is inside a defun. ! (let* (having-previous-defun ! having-next-defun ! (previous-defun-end (save-excursion ! (setq having-previous-defun ! (c-beginning-of-defun)) ! (c-end-of-defun) ! ;; `c-end-of-defun' move ! ;; point to the line ! ;; after the function ! ;; close, but the ! ;; position we prefer ! ;; here is the position ! ;; after the } that ! ;; closes the function. ! (backward-sexp 1) ! (forward-sexp 1) ! (point))) ! (next-defun-beginning (save-excursion ! (setq having-next-defun ! (c-end-of-defun)) ! (c-beginning-of-defun) ! (point)))) ! (if (and having-next-defun ! (< location next-defun-beginning)) ! (skip-syntax-forward " ")) ! (if (and having-previous-defun ! (> location previous-defun-end)) ! (skip-syntax-backward " ")) ! (unless (or ! ;; When there is no previous defun, the ! ;; point is not in a defun if it is not at ! ;; the beginning of the next defun. ! (and (not having-previous-defun) ! (not (= (point) ! next-defun-beginning))) ! ;; When there is no next defun, the point ! ;; is not in a defun if it is not at the ! ;; end of the previous defun. ! (and (not having-next-defun) ! (not (= (point) ! previous-defun-end))) ! ;; If the point is between two defuns, it ! ;; is not in a defun. ! (and (> (point) previous-defun-end) ! (< (point) next-defun-beginning))) ! ;; If the point is already at the beginning of a ! ;; defun, there is no need to move point again. ! (if (not (= (point) next-defun-beginning)) ! (c-beginning-of-defun)) ;; Is this a DEFUN construct? And is LOCATION in it? (if (and (looking-at "DEFUN\\b") (>= location (point))) This should be more reliable than the previous implementation, since it parses the file with the functions provided by CC mode, rather than analysing text features in the file. The basic idea of these changes is that, move the point to exactly the same position where the previous implementation moves it to before evaluating the forms that are not changed (i.e. forms starting from line 861 in the orignal file, or the forms starting with ``(if (and (looking-at "DEFUN\\b")'' in the orignal file) in a different way. With the powerful functions provided by CC mode, the new implementation is more reliable and cleaner. There is a problem with this approach yet, because of a bug in CC mode. The function `c-beginning-of-defun' cannot move point correctly for functions like int main (argc, argv) int argc; char *argv[]; { /* ... */ } So `add-log-current-defun' gives wrong result for this kind of functions. However, we can expect this problem to be fixed when the bug is fixed in CC mode. Please see (1) http://lists.gnu.org/archive/html/emacs-devel/2006-12/msg01341.html for more information about this bug. AGAIN, PATCH FOR IV AND ANOTHER PROBLEM By the way, problem IV in the beginning of this thread can be applied to some other code in `add-log-current-defun' too. That is, the processing of `public', `private', `enum', `struct', `union' and `class'. For instance, the name below is valid in C but the current code cannot handle it correctly: struct abc { }; When fixing it, I found that the patch I provided in link (2) to solve C++ names problem caused another problem, keywords such as `struct' or `enum' are not recorded when needed: (2) http://lists.gnu.org/archive/html/emacs-devel/2006-12/msg01095.html However, my later patch of IV in (3) http://lists.gnu.org/archive/html/emacs-devel/2006-12/msg01226.html eliminates the problem raised in applying the patch in link (2). So the patch below, which fixes both the problem of `enum', `struct', `union' and `class' (but not `public' and `private') and the problem created by applying the patch in link (2), is based on the second patch in link (3): *** add-log.el Thu Dec 28 20:49:44 2006 --- add-log.el.4_2 Sun Dec 31 14:38:46 2006 *************** (defun add-log-current-defun () *** 916,941 **** ;; Include certain keywords if they ;; precede the name. (setq middle (point)) ! ;; Single (forward-sexp -1) invocation is ! ;; not enough for C++ member function defined ! ;; as part of nested class and/or namespace ! ;; like: ! ;; ! ;; void ! ;; foo::bar::baz::bazz () ! ;; { ... ! ;; ! ;; Here we have to move the point to ! ;; the beginning of foo, not bazz. ! (while (not (looking-back "\\(^\\|[ \t]\\)")) (forward-sexp -1)) ;; Is this C++ method? (when (and (< 2 middle) ! (string= (buffer-substring (- middle 2) ! middle) ! "::")) ;; Include "classname::". ! (setq middle (point))) ;; Ignore these subparts of a class decl ;; and move back to the class name itself. (while (looking-at "public \\|private ") --- 916,939 ---- ;; Include certain keywords if they ;; precede the name. (setq middle (point)) ! ;; Move through C++ nested name. ! (while (looking-back "::[ \t\n]*") (forward-sexp -1)) + (forward-sexp -1) ;; Is this C++ method? (when (and (< 2 middle) ! (save-excursion ! (goto-char middle) ! (looking-back "::[ \t\n]*"))) ;; Include "classname::". ! (save-excursion ! ;; The `forward-sexp' form after ! ;; the `while' form above moves ! ;; backward one more sexp, so we ! ;; move forward one. ! (forward-sexp 1) ! (re-search-forward "\\(\\s \\|\n\\)*") ! (setq middle (point)))) ;; Ignore these subparts of a class decl ;; and move back to the class name itself. (while (looking-at "public \\|private ") *************** (defun add-log-current-defun () *** 944,960 **** (backward-sexp 1) (setq middle (point)) (forward-word -1)) ! (and (bolp) ! (looking-at ! "enum \\|struct \\|union \\|class ") ! (setq middle (point))) (goto-char end) (when (eq (preceding-char) ?=) (forward-char -1) (skip-chars-backward " \t") (setq end (point))) ! (buffer-substring-no-properties ! middle end)))))))) ((memq major-mode add-log-tex-like-modes) (if (re-search-backward "\\\\\\(sub\\)*\\(section\\|paragraph\\|chapter\\)" --- 942,969 ---- (backward-sexp 1) (setq middle (point)) (forward-word -1)) ! (and ! ;; These defuns are not necessary ! ;; starting at column 0. ! ;; (bolp) ! (looking-at ! "\\(enum\\|struct\\|union\\|class\\)[ \t\n]") ! (setq middle (point))) (goto-char end) (when (eq (preceding-char) ?=) (forward-char -1) (skip-chars-backward " \t") (setq end (point))) ! (let ((name (buffer-substring-no-properties ! middle end))) ! (setq name (replace-regexp-in-string ! "\n" " " name) ! name (replace-regexp-in-string ! "\\(enum\\|struct\\|union\\|class\\)[ \t]+" ! "\\1 " ! name) ! name (replace-regexp-in-string ! "[ \t]*::[ \t]*" "::" name)))))))))) ((memq major-mode add-log-tex-like-modes) (if (re-search-backward "\\\\\\(sub\\)*\\(section\\|paragraph\\|chapter\\)" These changes are guaranteed not to cause other problems during my test. PATCH FOR `public' AND `private' The reason of separating the patch for `public' and `private' is that it is different from other patches. The body of the `while' form that contains `public' and `private' is really the same as the forms before the while form, so it should be a whole iteration, not a new one. So the patch is based on the file with the patch in the above section: *** add-log.el.4_2 Sun Dec 31 14:38:46 2006 --- add-log.el.other Sun Dec 31 15:17:03 2006 *************** (defun add-log-current-defun () *** 906,947 **** ;; Consistency check: going down and up ;; shouldn't take us back before BEG. (> (point) beg)) ! (let (end middle) ! ;; Don't include any final whitespace ! ;; in the name we use. ! (skip-chars-backward " \t\n") ! (setq end (point)) ! (backward-sexp 1) ! ;; Now find the right beginning of the name. ! ;; Include certain keywords if they ! ;; precede the name. ! (setq middle (point)) ! ;; Move through C++ nested name. ! (while (looking-back "::[ \t\n]*") ! (forward-sexp -1)) ! (forward-sexp -1) ! ;; Is this C++ method? ! (when (and (< 2 middle) ! (save-excursion ! (goto-char middle) ! (looking-back "::[ \t\n]*"))) ! ;; Include "classname::". ! (save-excursion ! ;; The `forward-sexp' form after ! ;; the `while' form above moves ! ;; backward one more sexp, so we ! ;; move forward one. ! (forward-sexp 1) ! (re-search-forward "\\(\\s \\|\n\\)*") ! (setq middle (point)))) ! ;; Ignore these subparts of a class decl ! ;; and move back to the class name itself. ! (while (looking-at "public \\|private ") ! (skip-chars-backward " \t:") (setq end (point)) (backward-sexp 1) (setq middle (point)) ! (forward-word -1)) (and ;; These defuns are not necessary ;; starting at column 0. --- 906,944 ---- ;; Consistency check: going down and up ;; shouldn't take us back before BEG. (> (point) beg)) ! (let (end ! middle ! (first-iter t)) ! (while (or first-iter ! (looking-at ! "\\(public\\|protected\\|private\\)[ \t\n]")) ! (setq first-iter nil) ! ;; Skip characters that are not for identifiers. ! (skip-chars-backward ": \t\n") (setq end (point)) (backward-sexp 1) + ;; Now find the right beginning of the name. + ;; Include certain keywords if they + ;; precede the name. (setq middle (point)) ! ;; Move through C++ nested name. ! (while (looking-back "::[ \t\n]*") ! (forward-sexp -1)) ! (forward-sexp -1) ! ;; Is this C++ method? ! (when (and (< 2 middle) ! (save-excursion ! (goto-char middle) ! (looking-back "::[ \t\n]*"))) ! ;; Include "classname::". ! (save-excursion ! ;; The `forward-sexp' form after ! ;; the `while' form above moves ! ;; backward one more sexp, so we ! ;; move forward one. ! (forward-sexp 1) ! (re-search-forward "\\(\\s \\|\n\\)*") ! (setq middle (point))))) (and ;; These defuns are not necessary ;; starting at column 0. Note that `protected' is added here. PUTTING TOGETHER Finally I want to put all changes together, since there are too many changes to make really a new implementation. The patch for solving all of I, II, III, and IV is *** add-log.el Thu Dec 28 20:49:44 2006 --- add-log.el.new Sun Dec 31 16:13:48 2006 *************** (defun add-log-current-defun () *** 813,863 **** (progn (forward-sexp 1) (point)))) ((memq major-mode add-log-c-like-modes) ! (beginning-of-line) ! ;; See if we are in the beginning part of a function, ! ;; before the open brace. If so, advance forward. ! (while (not (looking-at "{\\|\\(\\s *$\\)")) ! (forward-line 1)) ! (or (eobp) ! (forward-char 1)) ! (let (maybe-beg) ! ;; Try to find the containing defun. ! (beginning-of-defun) ! (end-of-defun) ! ;; If the defun we found ends before the desired position, ! ;; see if there's a DEFUN construct ! ;; between that end and the desired position. ! (when (save-excursion ! (and (> location (point)) ! (re-search-forward "^DEFUN" ! (save-excursion ! (goto-char location) ! (line-end-position)) ! t) ! (re-search-forward "^{" nil t) ! (setq maybe-beg (point)))) ! ;; If so, go to the end of that instead. ! (goto-char maybe-beg) ! (end-of-defun))) ! ;; If the desired position is within the defun we found, ! ;; find the function name. ! (when (< location (point)) ! ;; Move back over function body. ! (backward-sexp 1) ! (let (beg) ! ;; Skip back over typedefs and arglist. ! ;; Stop at the function definition itself ! ;; or at the line that follows end of function doc string. ! (forward-line -1) ! (while (and (not (bobp)) ! (looking-at "[ \t\n]") ! (not (looking-back "[*]/)\n" (- (point) 4)))) ! (forward-line -1)) ! ;; If we found a doc string, this must be the DEFUN macro ! ;; used in Emacs. Move back to the DEFUN line. ! (when (looking-back "[*]/)\n" (- (point) 4)) ! (backward-sexp 1) ! (beginning-of-line)) ;; Is this a DEFUN construct? And is LOCATION in it? (if (and (looking-at "DEFUN\\b") (>= location (point))) --- 813,868 ---- (progn (forward-sexp 1) (point)))) ((memq major-mode add-log-c-like-modes) ! ;; See whether the point is inside a defun. ! (let* (having-previous-defun ! having-next-defun ! (previous-defun-end (save-excursion ! (setq having-previous-defun ! (c-beginning-of-defun)) ! (c-end-of-defun) ! ;; `c-end-of-defun' move ! ;; point to the line ! ;; after the function ! ;; close, but the ! ;; position we prefer ! ;; here is the position ! ;; after the } that ! ;; closes the function. ! (backward-sexp 1) ! (forward-sexp 1) ! (point))) ! (next-defun-beginning (save-excursion ! (setq having-next-defun ! (c-end-of-defun)) ! (c-beginning-of-defun) ! (point)))) ! (if (and having-next-defun ! (< location next-defun-beginning)) ! (skip-syntax-forward " ")) ! (if (and having-previous-defun ! (> location previous-defun-end)) ! (skip-syntax-backward " ")) ! (unless (or ! ;; When there is no previous defun, the ! ;; point is not in a defun if it is not at ! ;; the beginning of the next defun. ! (and (not having-previous-defun) ! (not (= (point) ! next-defun-beginning))) ! ;; When there is no next defun, the point ! ;; is not in a defun if it is not at the ! ;; end of the previous defun. ! (and (not having-next-defun) ! (not (= (point) ! previous-defun-end))) ! ;; If the point is between two defuns, it ! ;; is not in a defun. ! (and (> (point) previous-defun-end) ! (< (point) next-defun-beginning))) ! ;; If the point is already at the beginning of a ! ;; defun, there is no need to move point again. ! (if (not (= (point) next-defun-beginning)) ! (c-beginning-of-defun)) ;; Is this a DEFUN construct? And is LOCATION in it? (if (and (looking-at "DEFUN\\b") (>= location (point))) *************** (defun add-log-current-defun () *** 906,960 **** ;; Consistency check: going down and up ;; shouldn't take us back before BEG. (> (point) beg)) ! (let (end middle) ! ;; Don't include any final whitespace ! ;; in the name we use. ! (skip-chars-backward " \t\n") ! (setq end (point)) ! (backward-sexp 1) ! ;; Now find the right beginning of the name. ! ;; Include certain keywords if they ! ;; precede the name. ! (setq middle (point)) ! ;; Single (forward-sexp -1) invocation is ! ;; not enough for C++ member function defined ! ;; as part of nested class and/or namespace ! ;; like: ! ;; ! ;; void ! ;; foo::bar::baz::bazz () ! ;; { ... ! ;; ! ;; Here we have to move the point to ! ;; the beginning of foo, not bazz. ! (while (not (looking-back "\\(^\\|[ \t]\\)")) ! (forward-sexp -1)) ! ;; Is this C++ method? ! (when (and (< 2 middle) ! (string= (buffer-substring (- middle 2) ! middle) ! "::")) ! ;; Include "classname::". ! (setq middle (point))) ! ;; Ignore these subparts of a class decl ! ;; and move back to the class name itself. ! (while (looking-at "public \\|private ") ! (skip-chars-backward " \t:") (setq end (point)) (backward-sexp 1) (setq middle (point)) ! (forward-word -1)) ! (and (bolp) ! (looking-at ! "enum \\|struct \\|union \\|class ") ! (setq middle (point))) (goto-char end) (when (eq (preceding-char) ?=) (forward-char -1) (skip-chars-backward " \t") (setq end (point))) ! (buffer-substring-no-properties ! middle end)))))))) ((memq major-mode add-log-tex-like-modes) (if (re-search-backward "\\\\\\(sub\\)*\\(section\\|paragraph\\|chapter\\)" --- 911,971 ---- ;; Consistency check: going down and up ;; shouldn't take us back before BEG. (> (point) beg)) ! (let (end ! middle ! (first-iter t)) ! (while (or first-iter ! (looking-at ! "\\(public\\|protected\\|private\\)[ \t\n]")) ! (setq first-iter nil) ! ;; Skip characters that are not for identifiers. ! (skip-chars-backward ": \t\n") (setq end (point)) (backward-sexp 1) + ;; Now find the right beginning of the name. + ;; Include certain keywords if they + ;; precede the name. (setq middle (point)) ! ;; Move through C++ nested name. ! (while (looking-back "::[ \t\n]*") ! (forward-sexp -1)) ! (forward-sexp -1) ! ;; Is this C++ method? ! (when (and (< 2 middle) ! (save-excursion ! (goto-char middle) ! (looking-back "::[ \t\n]*"))) ! ;; Include "classname::". ! (save-excursion ! ;; The `forward-sexp' form after ! ;; the `while' form above moves ! ;; backward one more sexp, so we ! ;; move forward one. ! (forward-sexp 1) ! (re-search-forward "\\(\\s \\|\n\\)*") ! (setq middle (point))))) ! (and ! ;; These defuns are not necessary ! ;; starting at column 0. ! ;; (bolp) ! (looking-at ! "\\(enum\\|struct\\|union\\|class\\)[ \t\n]") ! (setq middle (point))) (goto-char end) (when (eq (preceding-char) ?=) (forward-char -1) (skip-chars-backward " \t") (setq end (point))) ! (let ((name (buffer-substring-no-properties ! middle end))) ! (setq name (replace-regexp-in-string ! "\n" " " name) ! name (replace-regexp-in-string ! "\\(enum\\|struct\\|union\\|class\\)[ \t]+" ! "\\1 " ! name) ! name (replace-regexp-in-string ! "[ \t]*::[ \t]*" "::" name)))))))))) ((memq major-mode add-log-tex-like-modes) (if (re-search-backward "\\\\\\(sub\\)*\\(section\\|paragraph\\|chapter\\)" And I will provide many test cases. The all-together patch and the test cases are attached. Most of the cases are passed by the new implementation. Of course, there are two cases can't be passed. We can test it again when Alan fix the bug in CC mode (See link (1)). >>From these cases, I can conclude that these changes (i.e. the new implementation) do not break anything else, and can behave for ``bad formatted'' or ``not reasonably formatted'' code better than the previous implementation. It is cleaner and more reliable than the previous one. Regards, Guanpeng Xu >From: Richard Stallman >Reply-To: rms@gnu.org >To: "Herbert Euler" >CC: emacs-devel@gnu.org >Subject: Re: Some problems in `add-log-current-defun' >Date: Fri, 29 Dec 2006 10:44:33 -0500 > > I have solved I and IV, more or less. > >We want to fix I and II and maybe III. >But not necessarily IV, not if it makes the change more >complex or risks breaking something else. > > _________________________________________________________________ Don't just search. Find. Check out the new MSN Search! http://search.msn.click-url.com/go/onm00200636ave/direct/01/ ------=_NextPart_000_3162_4834_2a51 Content-Type: application/octet-stream; name="add-log.el.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="add-log.el.patch" KioqIGFkZC1sb2cuZWwJVGh1IERlYyAyOCAyMDo0OTo0NCAyMDA2Ci0tLSBh ZGQtbG9nLmVsLm5ldwlTdW4gRGVjIDMxIDE2OjEzOjQ4IDIwMDYKKioqKioq KioqKioqKioqIChkZWZ1biBhZGQtbG9nLWN1cnJlbnQtZGVmdW4gKCkKKioq IDgxMyw4NjMgKioqKgogIAkJCQkJCSAocHJvZ24gKGZvcndhcmQtc2V4cCAx KQogIAkJCQkJCQkocG9pbnQpKSkpCiAgCQkoKG1lbXEgbWFqb3ItbW9kZSBh ZGQtbG9nLWMtbGlrZS1tb2RlcykKISAJCSAoYmVnaW5uaW5nLW9mLWxpbmUp CiEgCQkgOzsgU2VlIGlmIHdlIGFyZSBpbiB0aGUgYmVnaW5uaW5nIHBhcnQg b2YgYSBmdW5jdGlvbiwKISAJCSA7OyBiZWZvcmUgdGhlIG9wZW4gYnJhY2Uu ICBJZiBzbywgYWR2YW5jZSBmb3J3YXJkLgohIAkJICh3aGlsZSAobm90IChs b29raW5nLWF0ICJ7XFx8XFwoXFxzICokXFwpIikpCiEgCQkgICAoZm9yd2Fy ZC1saW5lIDEpKQohIAkJIChvciAoZW9icCkKISAJCSAgICAgKGZvcndhcmQt Y2hhciAxKSkKISAJCSAobGV0IChtYXliZS1iZWcpCiEgCQkgICA7OyBUcnkg dG8gZmluZCB0aGUgY29udGFpbmluZyBkZWZ1bi4KISAJCSAgIChiZWdpbm5p bmctb2YtZGVmdW4pCiEgCQkgICAoZW5kLW9mLWRlZnVuKQohIAkJICAgOzsg SWYgdGhlIGRlZnVuIHdlIGZvdW5kIGVuZHMgYmVmb3JlIHRoZSBkZXNpcmVk IHBvc2l0aW9uLAohIAkJICAgOzsgc2VlIGlmIHRoZXJlJ3MgYSBERUZVTiBj b25zdHJ1Y3QKISAJCSAgIDs7IGJldHdlZW4gdGhhdCBlbmQgYW5kIHRoZSBk ZXNpcmVkIHBvc2l0aW9uLgohIAkJICAgKHdoZW4gKHNhdmUtZXhjdXJzaW9u CiEgCQkJICAgKGFuZCAoPiBsb2NhdGlvbiAocG9pbnQpKQohIAkJCQkocmUt c2VhcmNoLWZvcndhcmQgIl5ERUZVTiIKISAJCQkJCQkgICAoc2F2ZS1leGN1 cnNpb24KISAJCQkJCQkgICAgIChnb3RvLWNoYXIgbG9jYXRpb24pCiEgCQkJ CQkJICAgICAobGluZS1lbmQtcG9zaXRpb24pKQohIAkJCQkJCSAgIHQpCiEg CQkJCShyZS1zZWFyY2gtZm9yd2FyZCAiXnsiIG5pbCB0KQohIAkJCQkoc2V0 cSBtYXliZS1iZWcgKHBvaW50KSkpKQohIAkJICAgICA7OyBJZiBzbywgZ28g dG8gdGhlIGVuZCBvZiB0aGF0IGluc3RlYWQuCiEgCQkgICAgIChnb3RvLWNo YXIgbWF5YmUtYmVnKQohIAkJICAgICAoZW5kLW9mLWRlZnVuKSkpCiEgCQkg OzsgSWYgdGhlIGRlc2lyZWQgcG9zaXRpb24gaXMgd2l0aGluIHRoZSBkZWZ1 biB3ZSBmb3VuZCwKISAJCSA7OyBmaW5kIHRoZSBmdW5jdGlvbiBuYW1lLgoh IAkJICh3aGVuICg8IGxvY2F0aW9uIChwb2ludCkpCiEgCQkgICA7OyBNb3Zl IGJhY2sgb3ZlciBmdW5jdGlvbiBib2R5LgohIAkJICAgKGJhY2t3YXJkLXNl eHAgMSkKISAJCSAgIChsZXQgKGJlZykKISAJCSAgICAgOzsgU2tpcCBiYWNr IG92ZXIgdHlwZWRlZnMgYW5kIGFyZ2xpc3QuCiEgCQkgICAgIDs7IFN0b3Ag YXQgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXRzZWxmCiEgCQkgICAgIDs7 IG9yIGF0IHRoZSBsaW5lIHRoYXQgZm9sbG93cyBlbmQgb2YgZnVuY3Rpb24g ZG9jIHN0cmluZy4KISAJCSAgICAgKGZvcndhcmQtbGluZSAtMSkKISAJCSAg ICAgKHdoaWxlIChhbmQgKG5vdCAoYm9icCkpCiEgCQkJCSAobG9va2luZy1h dCAiWyBcdFxuXSIpCiEgCQkJCSAobm90IChsb29raW5nLWJhY2sgIlsqXS8p XG4iICgtIChwb2ludCkgNCkpKSkKISAJCSAgICAgICAoZm9yd2FyZC1saW5l IC0xKSkKISAJCSAgICAgOzsgSWYgd2UgZm91bmQgYSBkb2Mgc3RyaW5nLCB0 aGlzIG11c3QgYmUgdGhlIERFRlVOIG1hY3JvCiEgCQkgICAgIDs7IHVzZWQg aW4gRW1hY3MuICBNb3ZlIGJhY2sgdG8gdGhlIERFRlVOIGxpbmUuCiEgCQkg ICAgICh3aGVuIChsb29raW5nLWJhY2sgIlsqXS8pXG4iICgtIChwb2ludCkg NCkpCiEgCQkgICAgICAgKGJhY2t3YXJkLXNleHAgMSkKISAJCSAgICAgICAo YmVnaW5uaW5nLW9mLWxpbmUpKQogIAkJICAgICA7OyBJcyB0aGlzIGEgREVG VU4gY29uc3RydWN0PyAgQW5kIGlzIExPQ0FUSU9OIGluIGl0PwogIAkJICAg ICAoaWYgKGFuZCAobG9va2luZy1hdCAiREVGVU5cXGIiKQogIAkJCSAgICAg ICg+PSBsb2NhdGlvbiAocG9pbnQpKSkKLS0tIDgxMyw4NjggLS0tLQogIAkJ CQkJCSAocHJvZ24gKGZvcndhcmQtc2V4cCAxKQogIAkJCQkJCQkocG9pbnQp KSkpCiAgCQkoKG1lbXEgbWFqb3ItbW9kZSBhZGQtbG9nLWMtbGlrZS1tb2Rl cykKISAJCSA7OyBTZWUgd2hldGhlciB0aGUgcG9pbnQgaXMgaW5zaWRlIGEg ZGVmdW4uCiEgCQkgKGxldCogKGhhdmluZy1wcmV2aW91cy1kZWZ1bgohIAkJ CWhhdmluZy1uZXh0LWRlZnVuCiEgCQkJKHByZXZpb3VzLWRlZnVuLWVuZCAo c2F2ZS1leGN1cnNpb24KISAJCQkJCSAgICAgIChzZXRxIGhhdmluZy1wcmV2 aW91cy1kZWZ1bgohIAkJCQkJCSAgICAoYy1iZWdpbm5pbmctb2YtZGVmdW4p KQohIAkJCQkJICAgICAgKGMtZW5kLW9mLWRlZnVuKQohIAkJCQkJICAgICAg OzsgYGMtZW5kLW9mLWRlZnVuJyBtb3ZlCiEgCQkJCQkgICAgICA7OyBwb2lu dCB0byB0aGUgbGluZQohIAkJCQkJICAgICAgOzsgYWZ0ZXIgdGhlIGZ1bmN0 aW9uCiEgCQkJCQkgICAgICA7OyBjbG9zZSwgYnV0IHRoZQohIAkJCQkJICAg ICAgOzsgcG9zaXRpb24gd2UgcHJlZmVyCiEgCQkJCQkgICAgICA7OyBoZXJl IGlzIHRoZSBwb3NpdGlvbgohIAkJCQkJICAgICAgOzsgYWZ0ZXIgdGhlIH0g dGhhdAohIAkJCQkJICAgICAgOzsgY2xvc2VzIHRoZSBmdW5jdGlvbi4KISAJ CQkJCSAgICAgIChiYWNrd2FyZC1zZXhwIDEpCiEgCQkJCQkgICAgICAoZm9y d2FyZC1zZXhwIDEpCiEgCQkJCQkgICAgICAocG9pbnQpKSkKISAJCQkobmV4 dC1kZWZ1bi1iZWdpbm5pbmcgKHNhdmUtZXhjdXJzaW9uCiEgCQkJCQkJKHNl dHEgaGF2aW5nLW5leHQtZGVmdW4KISAJCQkJCQkgICAgICAoYy1lbmQtb2Yt ZGVmdW4pKQohIAkJCQkJCShjLWJlZ2lubmluZy1vZi1kZWZ1bikKISAJCQkJ CQkocG9pbnQpKSkpCiEgCQkgICAoaWYgKGFuZCBoYXZpbmctbmV4dC1kZWZ1 bgohIAkJCSAgICAoPCBsb2NhdGlvbiBuZXh0LWRlZnVuLWJlZ2lubmluZykp CiEgCQkgICAgICAgKHNraXAtc3ludGF4LWZvcndhcmQgIiAiKSkKISAJCSAg IChpZiAoYW5kIGhhdmluZy1wcmV2aW91cy1kZWZ1bgohIAkJCSAgICAoPiBs b2NhdGlvbiBwcmV2aW91cy1kZWZ1bi1lbmQpKQohIAkJICAgICAgIChza2lw LXN5bnRheC1iYWNrd2FyZCAiICIpKQohIAkJICAgKHVubGVzcyAob3IKISAJ CQkgICAgOzsgV2hlbiB0aGVyZSBpcyBubyBwcmV2aW91cyBkZWZ1biwgdGhl CiEgCQkJICAgIDs7IHBvaW50IGlzIG5vdCBpbiBhIGRlZnVuIGlmIGl0IGlz IG5vdCBhdAohIAkJCSAgICA7OyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0 IGRlZnVuLgohIAkJCSAgICAoYW5kIChub3QgaGF2aW5nLXByZXZpb3VzLWRl ZnVuKQohIAkJCQkgKG5vdCAoPSAocG9pbnQpCiEgCQkJCQkgbmV4dC1kZWZ1 bi1iZWdpbm5pbmcpKSkKISAJCQkgICAgOzsgV2hlbiB0aGVyZSBpcyBubyBu ZXh0IGRlZnVuLCB0aGUgcG9pbnQKISAJCQkgICAgOzsgaXMgbm90IGluIGEg ZGVmdW4gaWYgaXQgaXMgbm90IGF0IHRoZQohIAkJCSAgICA7OyBlbmQgb2Yg dGhlIHByZXZpb3VzIGRlZnVuLgohIAkJCSAgICAoYW5kIChub3QgaGF2aW5n LW5leHQtZGVmdW4pCiEgCQkJCSAobm90ICg9IChwb2ludCkKISAJCQkJCSBw cmV2aW91cy1kZWZ1bi1lbmQpKSkKISAJCQkgICAgOzsgSWYgdGhlIHBvaW50 IGlzIGJldHdlZW4gdHdvIGRlZnVucywgaXQKISAJCQkgICAgOzsgaXMgbm90 IGluIGEgZGVmdW4uCiEgCQkJICAgIChhbmQgKD4gKHBvaW50KSBwcmV2aW91 cy1kZWZ1bi1lbmQpCiEgCQkJCSAoPCAocG9pbnQpIG5leHQtZGVmdW4tYmVn aW5uaW5nKSkpCiEgCQkgICAgIDs7IElmIHRoZSBwb2ludCBpcyBhbHJlYWR5 IGF0IHRoZSBiZWdpbm5pbmcgb2YgYQohIAkJICAgICA7OyBkZWZ1biwgdGhl cmUgaXMgbm8gbmVlZCB0byBtb3ZlIHBvaW50IGFnYWluLgohIAkJICAgICAo aWYgKG5vdCAoPSAocG9pbnQpIG5leHQtZGVmdW4tYmVnaW5uaW5nKSkKISAJ CQkgKGMtYmVnaW5uaW5nLW9mLWRlZnVuKSkKICAJCSAgICAgOzsgSXMgdGhp cyBhIERFRlVOIGNvbnN0cnVjdD8gIEFuZCBpcyBMT0NBVElPTiBpbiBpdD8K ICAJCSAgICAgKGlmIChhbmQgKGxvb2tpbmctYXQgIkRFRlVOXFxiIikKICAJ CQkgICAgICAoPj0gbG9jYXRpb24gKHBvaW50KSkpCioqKioqKioqKioqKioq KiAoZGVmdW4gYWRkLWxvZy1jdXJyZW50LWRlZnVuICgpCioqKiA5MDYsOTYw ICoqKioKICAJCQkgICAgICA7OyBDb25zaXN0ZW5jeSBjaGVjazogZ29pbmcg ZG93biBhbmQgdXAKICAJCQkgICAgICA7OyBzaG91bGRuJ3QgdGFrZSB1cyBi YWNrIGJlZm9yZSBCRUcuCiAgCQkJICAgICAgKD4gKHBvaW50KSBiZWcpKQoh IAkJCSAgICAgKGxldCAoZW5kIG1pZGRsZSkKISAJCQkgICAgICAgOzsgRG9u J3QgaW5jbHVkZSBhbnkgZmluYWwgd2hpdGVzcGFjZQohIAkJCSAgICAgICA7 OyBpbiB0aGUgbmFtZSB3ZSB1c2UuCiEgCQkJICAgICAgIChza2lwLWNoYXJz LWJhY2t3YXJkICIgXHRcbiIpCiEgCQkJICAgICAgIChzZXRxIGVuZCAocG9p bnQpKQohIAkJCSAgICAgICAoYmFja3dhcmQtc2V4cCAxKQohIAkJCSAgICAg ICA7OyBOb3cgZmluZCB0aGUgcmlnaHQgYmVnaW5uaW5nIG9mIHRoZSBuYW1l LgohIAkJCSAgICAgICA7OyBJbmNsdWRlIGNlcnRhaW4ga2V5d29yZHMgaWYg dGhleQohIAkJCSAgICAgICA7OyBwcmVjZWRlIHRoZSBuYW1lLgohIAkJCSAg ICAgICAoc2V0cSBtaWRkbGUgKHBvaW50KSkKISAJCQkgICAgICAgOzsgU2lu Z2xlIChmb3J3YXJkLXNleHAgLTEpIGludm9jYXRpb24gaXMKISAJCQkgICAg ICAgOzsgbm90IGVub3VnaCBmb3IgQysrIG1lbWJlciBmdW5jdGlvbiBkZWZp bmVkIAohIAkJCSAgICAgICA7OyBhcyBwYXJ0IG9mIG5lc3RlZCBjbGFzcyBh bmQvb3IgbmFtZXNwYWNlIAohIAkJCSAgICAgICA7OyBsaWtlOgohIAkJCSAg ICAgICA7OwohIAkJCSAgICAgICA7OyAgIHZvaWQgCiEgCQkJICAgICAgIDs7 ICAgZm9vOjpiYXI6OmJhejo6YmF6eiAoKQohIAkJCSAgICAgICA7OyAgIHsg Li4uCiEgCQkJICAgICAgIDs7IAohIAkJCSAgICAgICA7OyBIZXJlIHdlIGhh dmUgdG8gbW92ZSB0aGUgcG9pbnQgdG8gCiEgCQkJICAgICAgIDs7IHRoZSBi ZWdpbm5pbmcgb2YgZm9vLCBub3QgYmF6ei4KISAJCQkgICAgICAgKHdoaWxl IChub3QgKGxvb2tpbmctYmFjayAiXFwoXlxcfFsgXHRdXFwpIikpCiEgCQkJ CSAoZm9yd2FyZC1zZXhwIC0xKSkKISAJCQkgICAgICAgOzsgSXMgdGhpcyBD KysgbWV0aG9kPwohIAkJCSAgICAgICAod2hlbiAoYW5kICg8IDIgbWlkZGxl KQohIAkJCQkJICAoc3RyaW5nPSAoYnVmZmVyLXN1YnN0cmluZyAoLSBtaWRk bGUgMikKISAJCQkJCQkJCSAgICAgbWlkZGxlKQohIAkJCQkJCSAgICI6OiIp KQohIAkJCQkgOzsgSW5jbHVkZSAiY2xhc3NuYW1lOjoiLgohIAkJCQkgKHNl dHEgbWlkZGxlIChwb2ludCkpKQohIAkJCSAgICAgICA7OyBJZ25vcmUgdGhl c2Ugc3VicGFydHMgb2YgYSBjbGFzcyBkZWNsCiEgCQkJICAgICAgIDs7IGFu ZCBtb3ZlIGJhY2sgdG8gdGhlIGNsYXNzIG5hbWUgaXRzZWxmLgohIAkJCSAg ICAgICAod2hpbGUgKGxvb2tpbmctYXQgInB1YmxpYyBcXHxwcml2YXRlICIp CiEgCQkJCSAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0OiIpCiAgCQkJCSAo c2V0cSBlbmQgKHBvaW50KSkKICAJCQkJIChiYWNrd2FyZC1zZXhwIDEpCiAg CQkJCSAoc2V0cSBtaWRkbGUgKHBvaW50KSkKISAJCQkJIChmb3J3YXJkLXdv cmQgLTEpKQohIAkJCSAgICAgICAoYW5kIChib2xwKQohIAkJCQkgICAgKGxv b2tpbmctYXQKISAJCQkJICAgICAiZW51bSBcXHxzdHJ1Y3QgXFx8dW5pb24g XFx8Y2xhc3MgIikKISAJCQkJICAgIChzZXRxIG1pZGRsZSAocG9pbnQpKSkK ICAJCQkgICAgICAgKGdvdG8tY2hhciBlbmQpCiAgCQkJICAgICAgICh3aGVu IChlcSAocHJlY2VkaW5nLWNoYXIpID89KQogIAkJCQkgKGZvcndhcmQtY2hh ciAtMSkKICAJCQkJIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKQogIAkJ CQkgKHNldHEgZW5kIChwb2ludCkpKQohIAkJCSAgICAgICAoYnVmZmVyLXN1 YnN0cmluZy1uby1wcm9wZXJ0aWVzCiEgCQkJCW1pZGRsZSBlbmQpKSkpKSkp KQogIAkJKChtZW1xIG1ham9yLW1vZGUgYWRkLWxvZy10ZXgtbGlrZS1tb2Rl cykKICAJCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZAogIAkJICAgICAgIlxc XFxcXChzdWJcXCkqXFwoc2VjdGlvblxcfHBhcmFncmFwaFxcfGNoYXB0ZXJc XCkiCi0tLSA5MTEsOTcxIC0tLS0KICAJCQkgICAgICA7OyBDb25zaXN0ZW5j eSBjaGVjazogZ29pbmcgZG93biBhbmQgdXAKICAJCQkgICAgICA7OyBzaG91 bGRuJ3QgdGFrZSB1cyBiYWNrIGJlZm9yZSBCRUcuCiAgCQkJICAgICAgKD4g KHBvaW50KSBiZWcpKQohIAkJCSAgICAgKGxldCAoZW5kCiEgCQkJCSAgIG1p ZGRsZQohIAkJCQkgICAoZmlyc3QtaXRlciB0KSkKISAJCQkgICAgICAgKHdo aWxlIChvciBmaXJzdC1pdGVyCiEgCQkJCQkgIChsb29raW5nLWF0CiEgCQkJ CQkgICAiXFwocHVibGljXFx8cHJvdGVjdGVkXFx8cHJpdmF0ZVxcKVsgXHRc bl0iKSkKISAJCQkJIChzZXRxIGZpcnN0LWl0ZXIgbmlsKQohIAkJCQkgOzsg U2tpcCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBmb3IgaWRlbnRpZmllcnMu CiEgCQkJCSAoc2tpcC1jaGFycy1iYWNrd2FyZCAiOiBcdFxuIikKICAJCQkJ IChzZXRxIGVuZCAocG9pbnQpKQogIAkJCQkgKGJhY2t3YXJkLXNleHAgMSkK KyAJCQkJIDs7IE5vdyBmaW5kIHRoZSByaWdodCBiZWdpbm5pbmcgb2YgdGhl IG5hbWUuCisgCQkJCSA7OyBJbmNsdWRlIGNlcnRhaW4ga2V5d29yZHMgaWYg dGhleQorIAkJCQkgOzsgcHJlY2VkZSB0aGUgbmFtZS4KICAJCQkJIChzZXRx IG1pZGRsZSAocG9pbnQpKQohIAkJCQkgOzsgTW92ZSB0aHJvdWdoIEMrKyBu ZXN0ZWQgbmFtZS4KISAJCQkJICh3aGlsZSAobG9va2luZy1iYWNrICI6Olsg XHRcbl0qIikKISAJCQkJICAgKGZvcndhcmQtc2V4cCAtMSkpCiEgCQkJCSAo Zm9yd2FyZC1zZXhwIC0xKQohIAkJCQkgOzsgSXMgdGhpcyBDKysgbWV0aG9k PwohIAkJCQkgKHdoZW4gKGFuZCAoPCAyIG1pZGRsZSkKISAJCQkJCSAgICAo c2F2ZS1leGN1cnNpb24KISAJCQkJCSAgICAgIChnb3RvLWNoYXIgbWlkZGxl KQohIAkJCQkJICAgICAgKGxvb2tpbmctYmFjayAiOjpbIFx0XG5dKiIpKSkK ISAJCQkJICAgOzsgSW5jbHVkZSAiY2xhc3NuYW1lOjoiLgohIAkJCQkgICAo c2F2ZS1leGN1cnNpb24KISAJCQkJICAgICA7OyBUaGUgYGZvcndhcmQtc2V4 cCcgZm9ybSBhZnRlcgohIAkJCQkgICAgIDs7IHRoZSBgd2hpbGUnIGZvcm0g YWJvdmUgbW92ZXMKISAJCQkJICAgICA7OyBiYWNrd2FyZCBvbmUgbW9yZSBz ZXhwLCBzbyB3ZQohIAkJCQkgICAgIDs7IG1vdmUgZm9yd2FyZCBvbmUuCiEg CQkJCSAgICAgKGZvcndhcmQtc2V4cCAxKQohIAkJCQkgICAgIChyZS1zZWFy Y2gtZm9yd2FyZCAiXFwoXFxzIFxcfFxuXFwpKiIpCiEgCQkJCSAgICAgKHNl dHEgbWlkZGxlIChwb2ludCkpKSkpCiEgCQkJICAgICAgIChhbmQKISAJCQkJ OzsgVGhlc2UgZGVmdW5zIGFyZSBub3QgbmVjZXNzYXJ5CiEgCQkJCTs7IHN0 YXJ0aW5nIGF0IGNvbHVtbiAwLgohIAkJCQk7OyAoYm9scCkKISAJCQkJKGxv b2tpbmctYXQKISAJCQkJICJcXChlbnVtXFx8c3RydWN0XFx8dW5pb25cXHxj bGFzc1xcKVsgXHRcbl0iKQohIAkJCQkoc2V0cSBtaWRkbGUgKHBvaW50KSkp CiAgCQkJICAgICAgIChnb3RvLWNoYXIgZW5kKQogIAkJCSAgICAgICAod2hl biAoZXEgKHByZWNlZGluZy1jaGFyKSA/PSkKICAJCQkJIChmb3J3YXJkLWNo YXIgLTEpCiAgCQkJCSAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKICAJ CQkJIChzZXRxIGVuZCAocG9pbnQpKSkKISAJCQkgICAgICAgKGxldCAoKG5h bWUgKGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcwohIAkJCQkJICAg IG1pZGRsZSBlbmQpKSkKISAJCQkJIChzZXRxIG5hbWUgKHJlcGxhY2UtcmVn ZXhwLWluLXN0cmluZwohIAkJCQkJICAgICAiXG4iICIgIiBuYW1lKQohIAkJ CQkgICAgICAgbmFtZSAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCiEgCQkJ CQkgICAgICJcXChlbnVtXFx8c3RydWN0XFx8dW5pb25cXHxjbGFzc1xcKVsg XHRdKyIKISAJCQkJCSAgICAgIlxcMSAiCiEgCQkJCQkgICAgIG5hbWUpCiEg CQkJCSAgICAgICBuYW1lIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcKISAJ CQkJCSAgICAgIlsgXHRdKjo6WyBcdF0qIiAiOjoiIG5hbWUpKSkpKSkpKSkp CiAgCQkoKG1lbXEgbWFqb3ItbW9kZSBhZGQtbG9nLXRleC1saWtlLW1vZGVz KQogIAkJIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkCiAgCQkgICAgICAiXFxc XFxcKHN1YlxcKSpcXChzZWN0aW9uXFx8cGFyYWdyYXBoXFx8Y2hhcHRlclxc KSIK ------=_NextPart_000_3162_4834_2a51 Content-Type: application/octet-stream; name="add_log_test.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="add_log_test.c" DQovKiAxLiBLJlIgQy4gICovDQoNCi8qIFRoaXMgd2lsbCBub3QgZ2V0IGNv cnJlY3QgcmVzdWx0IHVudGlsIHRoZSBidWcgaW4gQ0MgbW9kZSBpcyBmaXhl ZC4NCiAgIFNlZQ0KICAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9o dG1sL2VtYWNzLWRldmVsLzIwMDYtMTIvbXNnMDEzNDEuaHRtbCAgKi8NCmlu dA0KbWFpbjEgKGFyZ2MsIGFyZ3YpDQogICAgIGludCBhcmdjOw0KICAgICBj aGFyICphcmd2W107DQp7DQogIC8qIC4uLiAgKi8NCn0NCg0KaW50DQpmMSAo YXJnKQ0KICAgICBMaXNwX09iamVjdCBhcmc7DQp7DQp9DQoNCmludA0KZjIg KGFyZykNCiAgICAgTGlzcF9PYmplY3QgYXJnOw0KICAgICAvKiBUaGUgYGFy ZycgaXMgYSBMaXNwX09iamVjdC4gICovDQp7DQp9DQoNCkRFRlVOICgiY2F0 Y2giLCBGY2F0Y2gxLCBTY2F0Y2gsIDEsIFVORVZBTExFRCwgMCwNCiAgICAg ICBkb2M6IC8qIEV2YWwgQk9EWSBhbGxvd2luZyBub25sb2NhbCBleGl0cyB1 c2luZyBgdGhyb3cnLg0KVEFHIGlzIGV2YWxsZWQgdG8gZ2V0IHRoZSB0YWcg dG8gdXNlOyBpdCBtdXN0IG5vdCBiZSBuaWwuDQoNClRoZW4gdGhlIEJPRFkg aXMgZXhlY3V0ZWQuDQpXaXRoaW4gQk9EWSwgYSBjYWxsIHRvIGB0aHJvdycg d2l0aCB0aGUgc2FtZSBUQUcgZXhpdHMgQk9EWSBhbmQgdGhpcyBgY2F0Y2gn Lg0KSWYgbm8gdGhyb3cgaGFwcGVucywgYGNhdGNoJyByZXR1cm5zIHRoZSB2 YWx1ZSBvZiB0aGUgbGFzdCBCT0RZIGZvcm0uDQpJZiBhIHRocm93IGhhcHBl bnMsIGl0IHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gYGNh dGNoJy4NCnVzYWdlOiAoY2F0Y2ggVEFHIEJPRFkuLi4pICAqLykNCiAgICAg KGFyZ3MpDQogICAgIExpc3BfT2JqZWN0IGFyZ3M7DQp7DQogIHJlZ2lzdGVy IExpc3BfT2JqZWN0IHRhZzsNCiAgc3RydWN0IGdjcHJvIGdjcHJvMTsNCg0K ICBHQ1BSTzEgKGFyZ3MpOw0KICB0YWcgPSBGZXZhbCAoRmNhciAoYXJncykp Ow0KICBVTkdDUFJPOw0KICByZXR1cm4gaW50ZXJuYWxfY2F0Y2ggKHRhZywg RnByb2duLCBGY2RyIChhcmdzKSk7DQp9DQoNCi8qIE5vdywgc29tZSBiYWRs eSBmb3JtYXR0ZWQgY29kZS4gICovDQoNCiAgIGludA0KIG1haW4yIChhcmdj LCBhcmd2KQ0KICAgICAgaW50IGFyZ2M7DQogICAgICBjaGFyICphcmd2W107 DQogICB7DQogICAgICAgICAgICAgICAgIC8qIC4uLiAgKi8NCiB9DQoNCiAg ICAgICAgICAgICAgICAgICAgICAgIGludA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZjMNCiAgICAgICAgIChhcmcpDQog ICAgICAgICAgICAgICAgICBMaXNwX09iamVjdA0KDQogICAgICAgICAgIGFy Zw0KDQoNCjsNCiAgICAgew0KfQ0KDQppbnQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZjQNCiAgICAgICAgICAgICAgICAoYXJnKQ0KICAgICAgICAg ICAgICAgTGlzcF9PYmplY3QgYXJnOw0KICAgICAvKiBUaGUgYGFyZycgaXMg YSBMaXNwX09iamVjdC4gICovDQogIHsNCiAgICAgICAgICB9DQoNCiAgICAg ICAgICAgICAgICAgICAgICBERUZVTiAoImNhdGNoIiwgRmNhdGNoMiwgU2Nh dGNoLCAxLCBVTkVWQUxMRUQsIDAsDQogICAgICAgICBkb2M6IC8qIEV2YWwg Qk9EWSBhbGxvd2luZyBub25sb2NhbCBleGl0cyB1c2luZyBgdGhyb3cnLg0K ICAgICAgIFRBRyBpcyBldmFsbGVkIHRvIGdldCB0aGUgdGFnIHRvIHVzZTsg aXQgbXVzdCBub3QgYmUgbmlsLg0KDQpUaGVuIHRoZSBCT0RZIGlzIGV4ZWN1 dGVkLg0KV2l0aGluIEJPRFksIGEgY2FsbCB0byBgdGhyb3cnIHdpdGggdGhl IHNhbWUgVEFHIGV4aXRzIEJPRFkgYW5kIHRoaXMgYGNhdGNoJy4NCklmIG5v IHRocm93IGhhcHBlbnMsIGBjYXRjaCcgcmV0dXJucyB0aGUgdmFsdWUgb2Yg dGhlIGxhc3QgQk9EWSBmb3JtLg0KSWYgYSB0aHJvdyBoYXBwZW5zLCBpdCBz cGVjaWZpZXMgdGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIGBjYXRjaCcuDQp1 c2FnZTogKGNhdGNoIFRBRyBCT0RZLi4uKSAgKi8pDQogICAgIChhcmdzKQ0K ICAgICBMaXNwX09iamVjdCBhcmdzOw0Kew0KICByZWdpc3RlciBMaXNwX09i amVjdCB0YWc7DQogIHN0cnVjdCBnY3BybyBnY3BybzE7DQoNCiAgR0NQUk8x IChhcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcg PSBGZXZhbCAoRmNhciAoYXJncykpOw0KICBVTkdDUFJPOw0KICAgICAgICAg ICByZXR1cm4gaW50ZXJuYWxfY2F0Y2ggKHRhZywgRnByb2duLCBGY2RyIChh cmdzKSk7DQogICAgIH0NCg0KLyogMi4gQU5TSS9JU08gQy4gICovDQoNCmlu dA0KbWFpbjMgKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQp9DQoNCmlu dA0KZjUgKExpc3BfT2JqZWN0IGFyZykNCnsNCn0NCg0KaW50DQpmNiAoTGlz cF9PYmplY3QgYXJnKQ0KLyogVGhlIGBhcmcnIGlzIGEgTGlzcF9PYmplY3Qu ICAqLw0Kew0KfQ0KDQpERUZVTiAoImNhdGNoIiwgRmNhdGNoMywgU2NhdGNo LCAxLCBVTkVWQUxMRUQsIDAsDQogICAgICAgZG9jOiAvKiBFdmFsIEJPRFkg YWxsb3dpbmcgbm9ubG9jYWwgZXhpdHMgdXNpbmcgYHRocm93Jy4NClRBRyBp cyBldmFsbGVkIHRvIGdldCB0aGUgdGFnIHRvIHVzZTsgaXQgbXVzdCBub3Qg YmUgbmlsLg0KDQpUaGVuIHRoZSBCT0RZIGlzIGV4ZWN1dGVkLg0KV2l0aGlu IEJPRFksIGEgY2FsbCB0byBgdGhyb3cnIHdpdGggdGhlIHNhbWUgVEFHIGV4 aXRzIEJPRFkgYW5kIHRoaXMgYGNhdGNoJy4NCklmIG5vIHRocm93IGhhcHBl bnMsIGBjYXRjaCcgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgQk9E WSBmb3JtLg0KSWYgYSB0aHJvdyBoYXBwZW5zLCBpdCBzcGVjaWZpZXMgdGhl IHZhbHVlIHRvIHJldHVybiBmcm9tIGBjYXRjaCcuDQp1c2FnZTogKGNhdGNo IFRBRyBCT0RZLi4uKSAgKi8pDQogICAgIChMaXNwX09iamVjdCBhcmdzKQ0K ew0KICByZWdpc3RlciBMaXNwX09iamVjdCB0YWc7DQogIHN0cnVjdCBnY3By byBnY3BybzE7DQoNCiAgR0NQUk8xIChhcmdzKTsNCiAgdGFnID0gRmV2YWwg KEZjYXIgKGFyZ3MpKTsNCiAgVU5HQ1BSTzsNCiAgcmV0dXJuIGludGVybmFs X2NhdGNoICh0YWcsIEZwcm9nbiwgRmNkciAoYXJncykpOw0KfQ0KDQovKiBO b3csIHNvbWUgYmFkbHkgZm9ybWF0dGVkIGNvZGUuICAqLw0KDQogICAgICAg IGludA0KDQogICAgICAgICAgICAgbWFpbjQNCg0KIChpbnQNCmFyZ2MsDQpj aGFyICoNCmFyZ3ZbXSkNCiAgIHsNCiAgICAgICB9DQoNCiAgICAgICAgICAg ICAgICAgIGludA0KZjcNCiAoDQpMaXNwX09iamVjdA0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGFyZykNCiAgICAgICAgIHsNCiAgICAgICAgICAg ICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpbnQN Cg0KICAgICAgICBmOA0KDQooTGlzcF9PYmplY3QNCmFyZykNCi8qIFRoZSBg YXJnJyBpcyBhIExpc3BfT2JqZWN0LiAgKi8NCnsNCn0NCg0KICAgICAgICAg ICAgICAgICAgICAgICAgREVGVU4gKCJjYXRjaCIsIEZjYXRjaDQsIFNjYXRj aCwgMSwgVU5FVkFMTEVELCAwLA0KICAgICAgIGRvYzogLyogRXZhbCBCT0RZ IGFsbG93aW5nIG5vbmxvY2FsIGV4aXRzIHVzaW5nIGB0aHJvdycuDQpUQUcg aXMgZXZhbGxlZCB0byBnZXQgdGhlIHRhZyB0byB1c2U7IGl0IG11c3Qgbm90 IGJlIG5pbC4NCg0KVGhlbiB0aGUgQk9EWSBpcyBleGVjdXRlZC4NCldpdGhp biBCT0RZLCBhIGNhbGwgdG8gYHRocm93JyB3aXRoIHRoZSBzYW1lIFRBRyBl eGl0cyBCT0RZIGFuZCB0aGlzIGBjYXRjaCcuDQpJZiBubyB0aHJvdyBoYXBw ZW5zLCBgY2F0Y2gnIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IEJP RFkgZm9ybS4NCklmIGEgdGhyb3cgaGFwcGVucywgaXQgc3BlY2lmaWVzIHRo ZSB2YWx1ZSB0byByZXR1cm4gZnJvbSBgY2F0Y2gnLg0KdXNhZ2U6IChjYXRj aCBUQUcgQk9EWS4uLikgICovKQ0KICAgICAoTGlzcF9PYmplY3QgYXJncykN CnsNCiAgcmVnaXN0ZXIgTGlzcF9PYmplY3QgdGFnOw0KICBzdHJ1Y3QgZ2Nw cm8gZ2Nwcm8xOw0KDQogIEdDUFJPMSAoYXJncyk7DQogIHRhZyA9IEZldmFs IChGY2FyIChhcmdzKSk7DQogIFVOR0NQUk87DQogIHJldHVybiBpbnRlcm5h bF9jYXRjaCAodGFnLCBGcHJvZ24sIEZjZHIgKGFyZ3MpKTsNCn0NCg0KLyog My4gQysrIGZ1bmN0aW9ucy4gICovDQoNCmludA0KYV9iOjpjX2Q6OmVfZjEg KCkNCnsNCn0NCg0KaW50DQphX2INCjo6DQpjX2Q6OmVfZjIgKCkNCnsNCn0N Cg0KaW50DQogIGFfYg0KICAgIDo6DQogICAgICBjX2QNCiAgICAgICAgOjoN CiAgICAgICAgICBlX2YzDQogICAgICAgICAgICAoKQ0Kew0KfQ0KDQovKiA0 LiBzdHJ1Y3QsIGVudW0sIGNsYXNzLCB1bmlvbjsgcHJpdmF0ZSwgcHJvdGVj dGVkLCBwdWJsaWMuICAqLw0KDQovKiBUaGUgY2FzZXMgb2YgYHN0cnVjdCcg Y2FuIHJlcHJlc2VudCBhbGwgYHN0cnVjdCcsIGBlbnVtJywgYGNsYXNzJywN CiAgIGFuZCBgdW5pb24nLiAgKi8NCg0Kc3RydWN0IHN0cnVjdDENCnsNCn07 DQoNCnN0cnVjdA0Kc3RydWN0Mg0Kew0KfTsNCg0KICAgc3RydWN0IHN0cnVj dDMNCnsNCn07DQoNCiAgIHN0cnVjdA0Kc3RydWN0NA0Kew0KfTsNCg0KY2xh c3MgYV9iMSA6IHB1YmxpYyBjX2QNCnsNCn07DQoNCmNsYXNzIGFfYjINCjog cHVibGljIGNfZA0Kew0KfTsNCg0KY2xhc3MgYV9iMzoNCnB1YmxpYyBjX2QN CnsNCn07DQoNCmNsYXNzIGFfYjQNCjoNCnB1YmxpYyBjX2QNCnsNCn07DQoN CiAgICBjbGFzcw0KYV9iNSA6IHB1YmxpYyBjX2QNCnsNCn07DQoNCiBjbGFz cyBhX2I2DQogICAgOiBwdWJsaWMNCiAgICAgICAgICAgICAgICAgICBjX2QN CnsNCn07DQoNCiBjbGFzcw0KIGFfYjcgICAgICAgICAgIDoNCiAgICAgIHB1 YmxpYyBjX2QNCnsNCn07DQoNCiAgIGNsYXNzDQphX2I4DQogOg0KICAgICAg ICAgIHB1YmxpYw0KY19kDQp7DQp9Ow0KDQpjbGFzcyBhX2I6OmNfZDEgOiBw dWJsaWMgZV9mLCBwdWJsaWMgZ19oIA0Kew0KfTsNCg0KY2xhc3MgYV9iDQo6 Og0KY19kMiANCjogcHVibGljDQogZV9mDQosDQogcHVibGljDQogZ19oIA0K ew0KfTsNCg== ------=_NextPart_000_3162_4834_2a51 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel ------=_NextPart_000_3162_4834_2a51--