Package: cc-mode;
Reported by: "Sun, Wei" <waysun <at> amazon.com>
Date: Fri, 20 Dec 2019 15:34:02 UTC
Severity: normal
To reply to this bug, email your comments to 38691 AT debbugs.gnu.org.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-cc-mode <at> gnu.org
:bug#38691
; Package cc-mode
.
(Fri, 20 Dec 2019 15:34:02 GMT) Full text and rfc822 format available."Sun, Wei" <waysun <at> amazon.com>
:bug-cc-mode <at> gnu.org
.
(Fri, 20 Dec 2019 15:34:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: "Sun, Wei" <waysun <at> amazon.com> To: "submit <at> debbugs.gnu.org" <submit <at> debbugs.gnu.org> Subject: CC Mode 5.34 (C++//lhw); `Invalid search bound` when undo Date: Fri, 20 Dec 2019 10:13:32 +0000
Package: cc-mode $> cat test.cpp // 2019-12-20 17:57 emacs -Q test.cpp M-x mark-page RET C-u M-x shell-command-on-region RET sort RET M-x undo RET Debugger entered--Lisp error: (error "Invalid search bound (wrong side of point)") search-forward-regexp("R\"\\([^ ()\\\n\15\11]\\{0,16\\}\\)(" -20 bound) c-after-change-unmark-raw-strings(1 1 21) #f(compiled-function (fn) #<bytecode 0x91e275>)(c-after-change-unmark-raw-strings) mapc(#f(compiled-function (fn) #<bytecode 0x91e275>) (c-depropertize-new-text c-after-change-escape-NL-in-string c-after-change-unmark-raw-strings c-parse-quotes-after-change c-after-change-mark-abnormal-strings c-extend-font-lock-region-for-macros c-neutralize-syntax-in-CPP c-restore-<>-properties c-change-expand-fl-region)) c-after-change(1 1 21) primitive-undo(1 ((1 . 22) (#("// 2019-12-20 17:57\n\n" 0 1 (face font-lock-comment-delimiter-face c-is-sws t c-in-sws t fontified t) 1 3 (face font-lock-comment-delimiter-face c-in-sws t fontified t) 3 20 (face font-lock-comment-face c-in-sws t fontified t) 20 21 (fontified t c-is-sws t)) . 1) (#<marker at 1 in test.cpp> . -21) (#<marker in no buffer> . -21) (#<marker at 1 in test.cpp> . -21) (t 24060 40235 192206 220000) nil (#("-" 0 1 (fontified t)) . 1) nil (#("#include <test.hpp>" 0 1 (face font-lock-preprocessor-face c-is-sws t c-in-sws t fontified t) 1 8 (face font-lock-preprocessor-face c-in-sws t fontified t) 8 9 (c-in-sws t fontified t) 9 10 (category c-<-as-paren-syntax face font-lock-string-face c-in-sws t fontified t) 10 18 (face font-lock-string-face c-in-sws t fontified t) 18 19 (category c->-as-paren-syntax face font-lock-string-face c-in-sws t fontified t)) . 22) (t 24060 40193 724383 390000))) undo-more(1) undo(nil) funcall-interactively(undo nil) call-interactively(undo nil nil) command-execute(undo) Package: cc-mode Emacs : GNU Emacs 27.0.50 (build 6, x86_64-pc-linux-gnu, GTK+ Version 3.18.9) of 2019-12-20 Package: CC Mode 5.34 (C++//lhw) Buffer Style: google c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties 1-bit) current state: ============== (setq c-basic-offset 4 c-comment-only-line-offset 0 c-indent-comment-alist '((other space . 2)) c-indent-comments-syntactically-p t c-block-comment-prefix "* " c-comment-prefix-regexp '((pike-mode . "//+!?\\|\\**") (awk-mode . "#+") (other . "//+\\|\\**")) c-doc-comment-style '((java-mode . javadoc) (pike-mode . autodoc) (c-mode . gtkdoc) (c++-mode . gtkdoc)) c-cleanup-list '(brace-else-brace brace-elseif-brace brace-catch-brace empty-defun-braces defun-close-semi list-close-comma scope-operator) c-hanging-braces-alist '((defun-open after) (defun-close before after) (class-open after) (class-close before after) (inexpr-class-open after) (inexpr-class-close before) (namespace-open after) (inline-open after) (inline-close before after) (block-open after) (block-close . c-snug-do-while) (extern-lang-open after) (extern-lang-close after) (statement-case-open after) (substatement-open after)) c-hanging-colons-alist '((case-label) (label after) (access-label after) (member-init-intro before) (inher-intro)) c-hanging-semi&comma-criteria '(c-semi&comma-no-newlines-for-oneline-inliners c-semi&comma-inside-parenlist c-semi&comma-no-newlines-before-nonblanks) c-backslash-column 48 c-backslash-max-column 72 c-special-indent-hook nil c-label-minimum-indentation 1 c-offsets-alist '((inexpr-class . +) (inexpr-statement . +) (lambda-intro-cont . +) (inlambda . 0) (template-args-cont c-lineup-template-args +) (incomposition . +) (inmodule . +) (innamespace . 0) (inextern-lang . +) (composition-close . 0) (module-close . 0) (namespace-close . 0) (extern-lang-close . 0) (composition-open . 0) (module-open . 0) (namespace-open . 0) (extern-lang-open . 0) (objc-method-call-cont c-lineup-ObjC-method-call-colons c-lineup-ObjC-method-call +) (objc-method-args-cont . c-lineup-ObjC-method-args) (objc-method-intro . [0]) (friend . 0) (cpp-define-intro c-lineup-cpp-define +) (cpp-macro-cont . +) (cpp-macro . [0]) (inclass . +) (stream-op . c-lineup-streamop) (arglist-cont-nonempty c-lineup-gcc-asm-reg c-lineup-arglist) (arglist-cont c-lineup-gcc-asm-reg 0) (comment-intro . 0) (catch-clause . 0) (else-clause . 0) (do-while-closure . 0) (access-label . /) (substatement . +) (statement-case-intro . +) (statement . 0) (brace-entry-open . 0) (brace-list-entry . 0) (brace-list-close . 0) (block-close . 0) (block-open . 0) (inher-cont . c-lineup-multi-inher) (inher-intro . ++) (member-init-cont . c-lineup-multi-inher) (member-init-intro . ++) (annotation-var-cont . +) (annotation-top-cont . 0) (topmost-intro . 0) (knr-argdecl . 0) (func-decl-cont . ++) (inline-close . 0) (class-close . 0) (class-open . 0) (defun-block-intro . +) (defun-close . 0) (defun-open . 0) (c . c-lineup-C-comments) (string . c-lineup-dont-change) (topmost-intro-cont . c-lineup-topmost-intro-cont) (brace-list-intro . +) (brace-list-open . 0) (inline-open . 0) (arglist-close . c-lineup-arglist) (arglist-intro google-c-lineup-expression-plus-4) (statement-cont nil c-lineup-assignments ++) (statement-case-open . +) (label . /) (substatement-label . 2) (substatement-open . 0) (knr-argdecl-intro . +) (statement-block-intro . +) (case-label . +) ) c-buffer-is-cc-mode 'c++-mode c-tab-always-indent t c-syntactic-indentation t c-syntactic-indentation-in-macros t c-ignore-auto-fill '(string cpp code) c-auto-align-backslashes t c-backspace-function 'backward-delete-char-untabify c-delete-function 'delete-char c-electric-pound-behavior nil c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "gnu")) c-enable-xemacs-performance-kludge-p t c-old-style-variable-behavior nil defun-prompt-regexp nil tab-width 4 comment-column 40 parse-sexp-ignore-comments t parse-sexp-lookup-properties t auto-fill-function nil comment-multi-line t comment-start-skip "\\(//+\\|/\\*+\\)\\s *" fill-prefix nil fill-column 80 paragraph-start "[ ]*\\(//+\\|\\**\\)[ ]*$\\|^\f" adaptive-fill-mode t adaptive-fill-regexp "[ ]*\\(//+\\|\\**\\)[ ]*\\([ ]+\\|[ ]*\\([0-9]+\\.\\|\\*+\\)[ ]*\\)" )
bug-cc-mode <at> gnu.org
:bug#38691
; Package cc-mode
.
(Tue, 24 Dec 2019 11:17:02 GMT) Full text and rfc822 format available.Message #8 received at 38691 <at> debbugs.gnu.org (full text, mbox):
From: Alan Mackenzie <acm <at> muc.de> To: "Sun, Wei" <waysun <at> amazon.com> Cc: 38691 <at> debbugs.gnu.org Subject: Re: bug#38691: CC Mode 5.34 (C++//lhw); `Invalid search bound` when undo Date: Tue, 24 Dec 2019 11:16:33 +0000
Hello, Wei. Thanks for taking the trouble to report this bug, and thanks for including a CC Mode configuration dump. On Fri, Dec 20, 2019 at 10:13:32 +0000, Sun, Wei via CC-Mode-help wrote: > Package: cc-mode > $> cat test.cpp > // 2019-12-20 17:57 > emacs -Q test.cpp > M-x mark-page RET > C-u M-x shell-command-on-region RET > sort RET > M-x undo RET > Debugger entered--Lisp error: (error "Invalid search bound (wrong side of point)") > search-forward-regexp("R\"\\([^ ()\\\n\15\11]\\{0,16\\}\\)(" -20 bound) > c-after-change-unmark-raw-strings(1 1 21) > #f(compiled-function (fn) #<bytecode 0x91e275>)(c-after-change-unmark-raw-strings) > mapc(#f(compiled-function (fn) #<bytecode 0x91e275>) (c-depropertize-new-text c-after-change-escape-NL-in-string c-after-change-unmark-raw-strings c-parse-quotes-after-change c-after-change-mark-abnormal-strings c-extend-font-lock-region-for-macros c-neutralize-syntax-in-CPP c-restore-<>-properties c-change-expand-fl-region)) > c-after-change(1 1 21) > primitive-undo(1 ((1 . 22) (#("// 2019-12-20 17:57\n\n" 0 1 (face font-lock-comment-delimiter-face c-is-sws t c-in-sws t fontified t) 1 3 (face font-lock-comment-delimiter-face c-in-sws t fontified t) 3 20 (face font-lock-comment-face c-in-sws t fontified t) 20 21 (fontified t c-is-sws t)) . 1) (#<marker at 1 in test.cpp> . -21) (#<marker in no buffer> . -21) (#<marker at 1 in test.cpp> . -21) (t 24060 40235 192206 220000) nil (#("-" 0 1 (fontified t)) . 1) nil (#("#include <test.hpp>" 0 1 (face font-lock-preprocessor-face c-is-sws t c-in-sws t fontified t) 1 8 (face font-lock-preprocessor-face c-in-sws t fontified t) 8 9 (c-in-sws t fontified t) 9 10 (category c-<-as-paren-syntax face font-lock-string-face c-in-sws t fontified t) 10 18 (face font-lock-string-face c-in-sws t fontified t) 18 19 (category c->-as-paren-syntax face font-lock-string-face c-in-sws t fontified t)) . 22) (t 24060 40193 724383 390000))) > undo-more(1) > undo(nil) > funcall-interactively(undo nil) > call-interactively(undo nil nil) > command-execute(undo) The cause of the bug is in the C routine call_process in the Emacs core. This function calls the external process, and (in this case) writes its output to an Emacs buffer. When it does this, it calls the Emacs hook `before-change-functions' (as it should), but fails to call `after-change-functions'. (These two hooks are documented in the Elisp manual on page "Change Hooks".) This failure to call `after-change-functions' confuses CC Mode. CC Mode does have a workaround for this sort of thing, but it is not good enough to correct for the bug in call_process in this case. So.... I think the CC Mode workaround needs to be improved. I will be looking at this. Also, I am currently negotiating with Eli Zaretskii (the principle Emacs maintainer) to fix call_process. I am confident this will happen. I'm hoping that a fix will be in the Emacs-27 release branch (which was created yesterday) within the next week or so. > Package: cc-mode > Emacs : GNU Emacs 27.0.50 (build 6, x86_64-pc-linux-gnu, GTK+ Version 3.18.9) > of 2019-12-20 > Package: CC Mode 5.34 (C++//lhw) > Buffer Style: google > c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties 1-bit) [ .... ] -- Alan Mackenzie (Nuremberg, Germany).
bug-cc-mode <at> gnu.org
:bug#38691
; Package cc-mode
.
(Wed, 22 Jan 2020 20:29:01 GMT) Full text and rfc822 format available.Message #11 received at 38691 <at> debbugs.gnu.org (full text, mbox):
From: Alan Mackenzie <acm <at> muc.de> To: "Sun, Wei" <waysun <at> amazon.com> Cc: 38691 <at> debbugs.gnu.org Subject: Re: bug#38691: CC Mode 5.34 (C++//lhw); `Invalid search bound` when undo Date: Wed, 22 Jan 2020 20:28:23 +0000
Hello again, Wei. I have now committed the fix to call_process (see below) to the emacs-27 branch at savannah.gnu.org, so the bug should now be fixed in that branch. The fix should find its way into the master branch sometime soon. Could you possibly see your way to testing the bug fix on the emacs-27 branch with your real code, please, so that we can be sure the bug is actually fixed? Then I can close the bug as fixed. Again, thanks for taking the trouble to report this bug, and thanks also for cutting your test case down to a convenient, easy to work with, minimum. On Tue, Dec 24, 2019 at 11:16:33 +0000, Alan Mackenzie wrote: > Hello, Wei. > Thanks for taking the trouble to report this bug, and thanks for > including a CC Mode configuration dump. > On Fri, Dec 20, 2019 at 10:13:32 +0000, Sun, Wei via CC-Mode-help wrote: > > Package: cc-mode > > $> cat test.cpp > > // 2019-12-20 17:57 > > emacs -Q test.cpp > > M-x mark-page RET > > C-u M-x shell-command-on-region RET > > sort RET > > M-x undo RET > > Debugger entered--Lisp error: (error "Invalid search bound (wrong side of point)") > > search-forward-regexp("R\"\\([^ ()\\\n\15\11]\\{0,16\\}\\)(" -20 bound) > > c-after-change-unmark-raw-strings(1 1 21) > > #f(compiled-function (fn) #<bytecode 0x91e275>)(c-after-change-unmark-raw-strings) > > mapc(#f(compiled-function (fn) #<bytecode 0x91e275>) (c-depropertize-new-text c-after-change-escape-NL-in-string c-after-change-unmark-raw-strings c-parse-quotes-after-change c-after-change-mark-abnormal-strings c-extend-font-lock-region-for-macros c-neutralize-syntax-in-CPP c-restore-<>-properties c-change-expand-fl-region)) > > c-after-change(1 1 21) > > primitive-undo(1 ((1 . 22) (#("// 2019-12-20 17:57\n\n" 0 1 (face font-lock-comment-delimiter-face c-is-sws t c-in-sws t fontified t) 1 3 (face font-lock-comment-delimiter-face c-in-sws t fontified t) 3 20 (face font-lock-comment-face c-in-sws t fontified t) 20 21 (fontified t c-is-sws t)) . 1) (#<marker at 1 in test.cpp> . -21) (#<marker in no buffer> . -21) (#<marker at 1 in test.cpp> . -21) (t 24060 40235 192206 220000) nil (#("-" 0 1 (fontified t)) . 1) nil (#("#include <test.hpp>" 0 1 (face font-lock-preprocessor-face c-is-sws t c-in-sws t fontified t) 1 8 (face font-lock-preprocessor-face c-in-sws t fontified t) 8 9 (c-in-sws t fontified t) 9 10 (category c-<-as-paren-syntax face font-lock-string-face c-in-sws t fontified t) 10 18 (face font-lock-string-face c-in-sws t fontified t) 18 19 (category c->-as-paren-syntax face font-lock-string-face c-in-sws t fontified t)) . 22) (t 24060 40193 724383 390000))) > > undo-more(1) > > undo(nil) > > funcall-interactively(undo nil) > > call-interactively(undo nil nil) > > command-execute(undo) > The cause of the bug is in the C routine call_process in the Emacs core. > This function calls the external process, and (in this case) writes its > output to an Emacs buffer. When it does this, it calls the Emacs hook > `before-change-functions' (as it should), but fails to call > `after-change-functions'. (These two hooks are documented in the Elisp > manual on page "Change Hooks".) > This failure to call `after-change-functions' confuses CC Mode. CC Mode > does have a workaround for this sort of thing, but it is not good enough > to correct for the bug in call_process in this case. > So.... I think the CC Mode workaround needs to be improved. I will be > looking at this. Also, I am currently negotiating with Eli Zaretskii > (the principle Emacs maintainer) to fix call_process. I am confident > this will happen. > I'm hoping that a fix will be in the Emacs-27 release branch (which was > created yesterday) within the next week or so. > > Package: cc-mode > > Emacs : GNU Emacs 27.0.50 (build 6, x86_64-pc-linux-gnu, GTK+ Version 3.18.9) > > of 2019-12-20 > > Package: CC Mode 5.34 (C++//lhw) > > Buffer Style: google > > c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties 1-bit) > [ .... ] -- Alan Mackenzie (Nuremberg, Germany).
bug-cc-mode <at> gnu.org
:bug#38691
; Package cc-mode
.
(Thu, 23 Jan 2020 06:26:02 GMT) Full text and rfc822 format available.Message #14 received at 38691 <at> debbugs.gnu.org (full text, mbox):
From: "Sun, Wei" <waysun <at> amazon.com> To: Alan Mackenzie <acm <at> muc.de> Cc: "38691 <at> debbugs.gnu.org" <38691 <at> debbugs.gnu.org> Subject: 答复: bug#38691: CC Mode 5.34 (C++//lhw); `Invalid search bound` when undo Date: Thu, 23 Jan 2020 05:44:30 +0000
Hi Alan, the issue is fixed on emacs-27, thank you very much. ________________________________________ 发件人: Alan Mackenzie <acm <at> muc.de> 发送时间: 2020年1月23日 4:28 收件人: Sun, Wei 抄送: 38691 <at> debbugs.gnu.org 主题: Re: bug#38691: CC Mode 5.34 (C++//lhw); `Invalid search bound` when undo Hello again, Wei. I have now committed the fix to call_process (see below) to the emacs-27 branch at savannah.gnu.org, so the bug should now be fixed in that branch. The fix should find its way into the master branch sometime soon. Could you possibly see your way to testing the bug fix on the emacs-27 branch with your real code, please, so that we can be sure the bug is actually fixed? Then I can close the bug as fixed. Again, thanks for taking the trouble to report this bug, and thanks also for cutting your test case down to a convenient, easy to work with, minimum. On Tue, Dec 24, 2019 at 11:16:33 +0000, Alan Mackenzie wrote: > Hello, Wei. > Thanks for taking the trouble to report this bug, and thanks for > including a CC Mode configuration dump. > On Fri, Dec 20, 2019 at 10:13:32 +0000, Sun, Wei via CC-Mode-help wrote: > > Package: cc-mode > > $> cat test.cpp > > // 2019-12-20 17:57 > > emacs -Q test.cpp > > M-x mark-page RET > > C-u M-x shell-command-on-region RET > > sort RET > > M-x undo RET > > Debugger entered--Lisp error: (error "Invalid search bound (wrong side of point)") > > search-forward-regexp("R\"\\([^ ()\\\n\15\11]\\{0,16\\}\\)(" -20 bound) > > c-after-change-unmark-raw-strings(1 1 21) > > #f(compiled-function (fn) #<bytecode 0x91e275>)(c-after-change-unmark-raw-strings) > > mapc(#f(compiled-function (fn) #<bytecode 0x91e275>) (c-depropertize-new-text c-after-change-escape-NL-in-string c-after-change-unmark-raw-strings c-parse-quotes-after-change c-after-change-mark-abnormal-strings c-extend-font-lock-region-for-macros c-neutralize-syntax-in-CPP c-restore-<>-properties c-change-expand-fl-region)) > > c-after-change(1 1 21) > > primitive-undo(1 ((1 . 22) (#("// 2019-12-20 17:57\n\n" 0 1 (face font-lock-comment-delimiter-face c-is-sws t c-in-sws t fontified t) 1 3 (face font-lock-comment-delimiter-face c-in-sws t fontified t) 3 20 (face font-lock-comment-face c-in-sws t fontified t) 20 21 (fontified t c-is-sws t)) . 1) (#<marker at 1 in test.cpp> . -21) (#<marker in no buffer> . -21) (#<marker at 1 in test.cpp> . -21) (t 24060 40235 192206 220000) nil (#("-" 0 1 (fontified t)) . 1) nil (#("#include <test.hpp>" 0 1 (face font-lock-preprocessor-face c-is-sws t c-in-sws t fontified t) 1 8 (face font-lock-preprocessor-face c-in-sws t fontified t) 8 9 (c-in-sws t fontified t) 9 10 (category c-<-as-paren-syntax face font-lock-string-face c-in-sws t fontified t) 10 18 (face font-lock-string-face c-in-sws t fontified t) 18 19 (category c->-as-paren-syntax face font-lock-string-face c-in-sws t fontified t)) . 22) (t 24060 40193 724383 390000))) > > undo-more(1) > > undo(nil) > > funcall-interactively(undo nil) > > call-interactively(undo nil nil) > > command-execute(undo) > The cause of the bug is in the C routine call_process in the Emacs core. > This function calls the external process, and (in this case) writes its > output to an Emacs buffer. When it does this, it calls the Emacs hook > `before-change-functions' (as it should), but fails to call > `after-change-functions'. (These two hooks are documented in the Elisp > manual on page "Change Hooks".) > This failure to call `after-change-functions' confuses CC Mode. CC Mode > does have a workaround for this sort of thing, but it is not good enough > to correct for the bug in call_process in this case. > So.... I think the CC Mode workaround needs to be improved. I will be > looking at this. Also, I am currently negotiating with Eli Zaretskii > (the principle Emacs maintainer) to fix call_process. I am confident > this will happen. > I'm hoping that a fix will be in the Emacs-27 release branch (which was > created yesterday) within the next week or so. > > Package: cc-mode > > Emacs : GNU Emacs 27.0.50 (build 6, x86_64-pc-linux-gnu, GTK+ Version 3.18.9) > > of 2019-12-20 > > Package: CC Mode 5.34 (C++//lhw) > > Buffer Style: google > > c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties 1-bit) > [ .... ] -- Alan Mackenzie (Nuremberg, Germany).
bug-cc-mode <at> gnu.org
:bug#38691
; Package cc-mode
.
(Thu, 23 Jan 2020 20:24:02 GMT) Full text and rfc822 format available.Message #17 received at 38691 <at> debbugs.gnu.org (full text, mbox):
From: Alan Mackenzie <acm <at> muc.de> To: "Sun, Wei" <waysun <at> amazon.com> Cc: "38691-done <at> debbugs.gnu.org" <38691 <at> debbugs.gnu.org> Subject: Re: 答复: bug#38691: CC Mode 5.34 (C++//lhw); `Invalid search bound` when?undo Date: Thu, 23 Jan 2020 20:23:47 +0000
Hello, Wei. Thanks for the quick test and quick reply. I'm closing the bug with this post. On Thu, Jan 23, 2020 at 05:44:30 +0000, Sun, Wei wrote: > Hi Alan, > the issue is fixed on emacs-27, thank you very much. > ________________________________________ > 发件人: Alan Mackenzie <acm <at> muc.de> > 发送时间: 2020年1月23日 4:28 > 收件人: Sun, Wei > 抄送: 38691 <at> debbugs.gnu.org > 主题: Re: bug#38691: CC Mode 5.34 (C++//lhw); `Invalid search bound` when undo > Hello again, Wei. > I have now committed the fix to call_process (see below) to the emacs-27 > branch at savannah.gnu.org, so the bug should now be fixed in that > branch. The fix should find its way into the master branch sometime > soon. > Could you possibly see your way to testing the bug fix on the emacs-27 > branch with your real code, please, so that we can be sure the bug is > actually fixed? Then I can close the bug as fixed. > Again, thanks for taking the trouble to report this bug, and thanks also > for cutting your test case down to a convenient, easy to work with, > minimum. -- Alan Mackenzie (Nuremberg, Germany).
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.