* Implement mail sending.
authorChris Hanson <org/chris-hanson/cph>
Sun, 21 Apr 1991 00:52:42 +0000 (00:52 +0000)
committerChris Hanson <org/chris-hanson/cph>
Sun, 21 Apr 1991 00:52:42 +0000 (00:52 +0000)
* Implement M-x append-to-file, M-x tabify, C-u M-x indent-region.

* Change M-x undo to move point to the location of the most recent
  undone change.  This restores the behavior that was in effect before
  the last change to undo.

* Implement variable `enable-emacs-write-file-message', by default
  true, which changes file-output messages to be like Emacs.

* Fix simple bugs in auto save code, local variable binding.

* Add new slot to buffer, LOCAL-BINDINGS-INSTALLED?, that speeds up
  the test to determine if the buffer's local bindings are the ones
  currently installed in the variable value cells.

* Reimplement character search, character match, and string match.
  New implementation does not use regular expression primitives.
  A new set of low-level search and match primitives provides more
  power than the old ones did.

* Implement `run-synchronous-process'.  Reimplement `shell-command'
  and `shell-command-region' in terms of this new procedure.

* Implement `insert-region', which copies text directly from one
  buffer to another without making an intermediate copy.

35 files changed:
v7/src/edwin/autosv.scm
v7/src/edwin/buffer.scm
v7/src/edwin/bufinp.scm
v7/src/edwin/bufmnu.scm
v7/src/edwin/cinden.scm
v7/src/edwin/comint.scm
v7/src/edwin/comman.scm
v7/src/edwin/debuge.scm
v7/src/edwin/decls.scm
v7/src/edwin/dired.scm
v7/src/edwin/ed-ffi.scm
v7/src/edwin/edwin.ldr
v7/src/edwin/edwin.pkg
v7/src/edwin/filcom.scm
v7/src/edwin/fileio.scm
v7/src/edwin/fill.scm
v7/src/edwin/hlpcom.scm
v7/src/edwin/info.scm
v7/src/edwin/kilcom.scm
v7/src/edwin/lincom.scm
v7/src/edwin/macros.scm
v7/src/edwin/make.scm
v7/src/edwin/modefs.scm
v7/src/edwin/process.scm
v7/src/edwin/regexp.scm
v7/src/edwin/search.scm
v7/src/edwin/sercom.scm
v7/src/edwin/shell.scm
v7/src/edwin/simple.scm
v7/src/edwin/struct.scm
v7/src/edwin/things.scm
v7/src/edwin/undo.scm
v7/src/edwin/unix.scm
v7/src/edwin/utils.scm
v7/src/runtime/rgxcmp.scm

index b72a87950a6e64cabab651c418226e06713b3a97..d627aef4c9b37cd3ee2e9b3ec31fd7451d0f5caa 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/autosv.scm,v 1.24 1991/04/13 03:58:23 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/autosv.scm,v 1.25 1991/04/21 00:48:49 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -112,10 +112,16 @@ This file is not the file you visited; that changes only when you save."
   (set-buffer-auto-save-pathname! buffer false))
 
 (define (delete-auto-save-file! buffer)
-  (if (ref-variable delete-auto-save-files)
-      (let ((pathname (buffer-auto-save-pathname buffer)))
-       (if (and pathname (file-exists? pathname))
-           (delete-file pathname)))))
+  (and (ref-variable delete-auto-save-files)
+       (let ((auto-save-pathname (buffer-auto-save-pathname buffer)))
+        (and auto-save-pathname
+             (not (let ((pathname (buffer-pathname buffer)))
+                    (and pathname
+                         (pathname=? auto-save-pathname pathname))))
+             (catch-file-errors (lambda () false)
+               (lambda ()
+                 (delete-file auto-save-pathname)
+                 true))))))
 
 (define (rename-auto-save-file! buffer)
   (let ((old-pathname (buffer-auto-save-pathname buffer)))
@@ -124,7 +130,10 @@ This file is not the file you visited; that changes only when you save."
       (if (and old-pathname
               new-pathname
               (not (pathname=? new-pathname old-pathname))
-              (not (pathname=? new-pathname (buffer-pathname buffer)))
+              (not (let ((pathname (buffer-pathname buffer)))
+                     (and pathname
+                          (or (pathname=? new-pathname pathname)
+                              (pathname=? old-pathname pathname)))))
               (file-exists? old-pathname))
          (rename-file old-pathname new-pathname)))))
 
@@ -143,7 +152,8 @@ This file is not the file you visited; that changes only when you save."
          (append-message "done")))))
 
 (define (auto-save-buffer buffer)
-  (region->file (buffer-unclipped-region buffer)
-               (buffer-auto-save-pathname buffer))
+  (write-region (buffer-unclipped-region buffer)
+               (buffer-auto-save-pathname buffer)
+               false)
   (set-buffer-save-length! buffer)
   (set-buffer-auto-saved! buffer))
\ No newline at end of file
index 29c18c912152fe64ecacf398fe158911bfb5e646..45b2211b67962965e29746be5b09789c27f001f2 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/buffer.scm,v 1.141 1991/04/12 23:16:28 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/buffer.scm,v 1.142 1991/04/21 00:48:54 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -59,6 +59,7 @@
   truename
   alist
   local-bindings
+  local-bindings-installed?
   initializations
   auto-save-pathname
   auto-save-state
@@ -103,6 +104,7 @@ The buffer is guaranteed to be deselected at that time."
       (vector-set! buffer buffer-index:truename false)
       (vector-set! buffer buffer-index:alist '())
       (vector-set! buffer buffer-index:local-bindings '())
+      (vector-set! buffer buffer-index:local-bindings-installed? false)
       (vector-set! buffer
                   buffer-index:initializations
                   (list (mode-initialization mode)))
@@ -334,62 +336,113 @@ The buffer is guaranteed to be deselected at that time."
 \f
 ;;;; Local Bindings
 
-(define (make-local-binding! variable new-value)
+(define (define-variable-local-value! buffer variable value)
+  (check-variable-value-validity! variable value)
   (without-interrupts
    (lambda ()
-     (let ((buffer (current-buffer)))
-       (let ((bindings (buffer-local-bindings buffer)))
-        (let ((binding (assq variable bindings)))
-          (if (not binding)
+     (let ((binding (search-local-bindings buffer variable)))
+       (if (buffer-local-bindings-installed? buffer)
+          (begin
+            (if (not binding)
+                (vector-set! buffer
+                             buffer-index:local-bindings
+                             (cons (cons variable (variable-value variable))
+                                   (buffer-local-bindings buffer))))
+            (%set-variable-value! variable value))
+          (if binding
+              (set-cdr! binding value)
               (vector-set! buffer
                            buffer-index:local-bindings
-                           (cons (cons variable (variable-value variable))
-                                 bindings))))))
-     (check-variable-value-validity! variable new-value)
-     (%set-variable-value! variable new-value)
-     (invoke-variable-assignment-daemons! variable))))
+                           (cons (cons variable value)
+                                 (buffer-local-bindings buffer)))))))))
 
-(define (unmake-local-binding! variable)
+(define (undefine-variable-local-value! buffer variable)
   (without-interrupts
    (lambda ()
-     (let ((buffer (current-buffer)))
-       (let ((bindings (buffer-local-bindings buffer)))
-        (let ((binding (assq variable bindings)))
-          (if binding
-              (begin
-                (%set-variable-value! variable (cdr binding))
-                (vector-set! buffer
-                             buffer-index:local-bindings
-                             (delq! binding bindings))
-                (invoke-variable-assignment-daemons! variable)))))))))
+     (let ((binding (search-local-bindings buffer variable)))
+       (if binding
+          (begin
+            (vector-set! buffer
+                         buffer-index:local-bindings
+                         (delq! binding (buffer-local-bindings buffer)))
+            (if (buffer-local-bindings-installed? buffer)
+                (%set-variable-value! variable (cdr binding)))))))))
+
+(define (variable-local-value buffer variable)
+  (let ((binding
+        (and (not (buffer-local-bindings-installed? buffer))
+             (search-local-bindings buffer variable))))
+    (if binding
+       (cdr binding)
+       (variable-value variable))))
+
+(define (set-variable-local-value! buffer variable value)
+  (if (variable-buffer-local? variable)
+      (define-variable-local-value! buffer variable value)
+      (begin
+       (check-variable-value-validity! variable value)
+       (without-interrupts
+        (lambda ()
+          (let ((binding
+                 (and (not (buffer-local-bindings-installed? buffer))
+                      (search-local-bindings buffer variable))))
+            (if binding
+                (set-cdr! binding value)
+                (%set-variable-value! variable value))))))))
+
+(define (variable-default-value variable)
+  (let ((binding (search-local-bindings (current-buffer) variable)))
+    (if binding
+       (cdr binding)
+       (variable-value variable))))
+
+(define (set-variable-default-value! variable value)
+  (check-variable-value-validity! variable value)
+  (without-interrupts
+   (lambda ()
+     (let ((binding (search-local-bindings (current-buffer) variable)))
+       (if binding
+          (set-cdr! binding value)
+          (%set-variable-value! variable value))))))
 
+(define-integrable (search-local-bindings buffer variable)
+  (let loop ((bindings (buffer-local-bindings buffer)))
+    (and (not (null? bindings))
+        (if (eq? (caar bindings) variable)
+            (car bindings)
+            (loop (cdr bindings))))))
+\f
 (define (undo-local-bindings!)
   ;; Caller guarantees that interrupts are disabled.
   (let ((buffer (current-buffer)))
     (let ((bindings (buffer-local-bindings buffer)))
       (do ((bindings bindings (cdr bindings)))
          ((null? bindings))
-       (%set-variable-value! (caar bindings) (cdar bindings)))
+       (%%set-variable-value! (caar bindings) (cdar bindings)))
       (vector-set! buffer buffer-index:local-bindings '())
       (do ((bindings bindings (cdr bindings)))
          ((null? bindings))
        (invoke-variable-assignment-daemons! (caar bindings))))))
-\f
+
 (define (with-current-local-bindings! thunk)
   (let ((wind-bindings
-        (lambda (buffer)
+        (lambda (buffer installed?)
           (do ((bindings (buffer-local-bindings buffer) (cdr bindings)))
               ((null? bindings))
             (let ((old-value (variable-value (caar bindings))))
-              (%set-variable-value! (caar bindings) (cdar bindings))
-              (set-cdr! (car bindings) old-value))))))
-    (dynamic-wind (lambda ()
-                   (let ((buffer (current-buffer)))
-                     (wind-bindings buffer)
-                     (perform-buffer-initializations! buffer)))
-                 thunk
-                 (lambda ()
-                   (wind-bindings (current-buffer))))))
+              (%%set-variable-value! (caar bindings) (cdar bindings))
+              (set-cdr! (car bindings) old-value)))
+          (vector-set! buffer
+                       buffer-index:local-bindings-installed?
+                       installed?))))
+    (dynamic-wind
+     (lambda ()
+       (let ((buffer (current-buffer)))
+        (wind-bindings buffer true)
+        (perform-buffer-initializations! buffer)))
+     thunk
+     (lambda ()
+       (wind-bindings (current-buffer) false)))))
 
 (define (change-local-bindings! old-buffer new-buffer select-buffer!)
   ;; Assumes that interrupts are disabled and that OLD-BUFFER is selected.
@@ -397,15 +450,16 @@ The buffer is guaranteed to be deselected at that time."
     (do ((bindings (buffer-local-bindings old-buffer) (cdr bindings)))
        ((null? bindings))
       (let ((old-value (variable-value (caar bindings))))
-       (%set-variable-value! (caar bindings) (cdar bindings))
+       (%%set-variable-value! (caar bindings) (cdar bindings))
        (set-cdr! (car bindings) old-value))
       (if (not (null? (variable-assignment-daemons (caar bindings))))
          (set! variables (cons (caar bindings) variables))))
+    (vector-set! old-buffer buffer-index:local-bindings-installed? false)
     (select-buffer!)
     (do ((bindings (buffer-local-bindings new-buffer) (cdr bindings)))
        ((null? bindings))
       (let ((old-value (variable-value (caar bindings))))
-       (%set-variable-value! (caar bindings) (cdar bindings))
+       (%%set-variable-value! (caar bindings) (cdar bindings))
        (set-cdr! (car bindings) old-value))
       (if (and (not (null? (variable-assignment-daemons (caar bindings))))
               (not (let loop ((variables variables))
@@ -413,71 +467,13 @@ The buffer is guaranteed to be deselected at that time."
                           (or (eq? (caar bindings) (car variables))
                               (loop (cdr variables)))))))
          (set! variables (cons (caar bindings) variables))))
+    (vector-set! new-buffer buffer-index:local-bindings-installed? true)
     (perform-buffer-initializations! new-buffer)
     (if (not (null? variables))
        (do ((variables variables (cdr variables)))
            ((null? variables))
          (invoke-variable-assignment-daemons! (car variables))))))
 \f
-(define (define-variable-local-value! buffer variable value)
-  (if (current-buffer? buffer)
-      (make-local-binding! variable value)
-      (without-interrupts
-       (lambda ()
-        (let ((binding (search-local-bindings buffer variable)))
-          (if binding
-              (set-cdr! binding value)
-              (vector-set! buffer
-                           buffer-index:local-bindings
-                           (cons (cons variable value)
-                                 (buffer-local-bindings buffer)))))))))
-
-(define (variable-local-value buffer variable)
-  (if (or (not (within-editor?))
-         (current-buffer? buffer))
-      (variable-value variable)
-      (let ((binding (search-local-bindings buffer variable)))
-       (if binding
-           (cdr binding)
-           (variable-default-value variable)))))
-
-(define (set-variable-local-value! buffer variable value)
-  (if (current-buffer? buffer)
-      (set-variable-value! variable value)
-      (let ((binding (search-local-bindings buffer variable)))
-       (if binding
-           (set-cdr! binding value)
-           (set-variable-default-value! variable value)))))
-
-(define (variable-default-value variable)
-  (let ((binding (search-local-bindings (current-buffer) variable)))
-    (if binding
-       (cdr binding)
-       (variable-value variable))))
-
-(define (set-variable-default-value! variable value)
-  (let ((binding (search-local-bindings (current-buffer) variable)))
-    (if binding
-       (set-cdr! binding value)
-       (without-interrupts
-        (lambda ()
-          (check-variable-value-validity! variable value)
-          (%set-variable-value! variable value)
-          (invoke-variable-assignment-daemons! variable))))))
-
-(define (variable-local-value? buffer variable)
-  (let loop ((bindings (buffer-local-bindings buffer)))
-    (and (not (null? bindings))
-        (or (eq? (caar bindings) variable)
-            (loop (cdr bindings))))))
-
-(define-integrable (search-local-bindings buffer variable)
-  (let loop ((bindings (buffer-local-bindings buffer)))
-    (and (not (null? bindings))
-        (if (eq? (caar bindings) variable)
-            (car bindings)
-            (loop (cdr bindings))))))
-\f
 ;;;; Modes
 
 (define-integrable (buffer-major-mode buffer)
index 8b5592c1b98825d1b62e80906555aa8683ea9283..541e8036dcbf802a93dc803fd84f8524542cc2e6 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufinp.scm,v 1.3 1990/11/09 08:56:14 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufinp.scm,v 1.4 1991/04/21 00:49:00 cph Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989, 1990 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
       (if (>= current-index end-index)
          (make-eof-object port)
          (let ((new-index
-                (or (%find-next-char-in-set group current-index end-index
-                                            delimiters)
+                (or (group-find-next-char-in-set group current-index end-index
+                                                 delimiters)
                     end-index)))
            (let ((string
                   (group-extract-string group current-index new-index)))
       (if (< current-index end-index)
          (set-buffer-input-port-state/current-index!
           state
-          (or (%find-next-char-in-set (buffer-input-port-state/group state)
-                                      current-index
-                                      end-index
-                                      delimiters)
+          (or (group-find-next-char-in-set
+               (buffer-input-port-state/group state)
+               current-index
+               end-index
+               delimiters)
               end-index))))))
 
 (define (operation/print-self state port)
index 1a085658197777cb72e0d86166c57ad0861d6251..5b700a4f5c1eb3234d41a3cd78fe238bd5bcf7e3 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufmnu.scm,v 1.112 1991/04/03 04:03:30 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufmnu.scm,v 1.113 1991/04/21 00:49:05 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -346,8 +346,9 @@ You can mark buffers with the \\[buffer-menu-mark] command."
 
 (define (buffer-line-name lstart)
   (let ((start (mark+ lstart 4)))
-    (char-search-forward #\Space start (line-end start 0))
-    (extract-string start (re-match-start 0))))
+    (extract-string
+     start
+     (mark-1+ (char-search-forward #\space start (line-end start 0))))))
 
 (define (buffer-menu-mark lstart column)
   (guarantee-buffer-line lstart)
index 28bd645160eede2214056b05596036ef65e0ac84..5b224b2bd48a3f24a3e2e459778727e2d4e3d0c2 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/cinden.scm,v 1.4 1991/03/15 23:37:44 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/cinden.scm,v 1.5 1991/04/21 00:49:09 cph Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
         (char-match-forward #\( container))))
 
 (define (backward-to-noncomment start end)
-  (define (loop start)
+  (let loop ((start start))
     (let ((mark (whitespace-start start end)))
-      (if (match-backward "*/" mark)
-         (and (search-backward "/*" (re-match-start 0) end)
-              (loop (re-match-start 0)))
-         (let ((mark* (indentation-end mark)))
-           (cond ((not (char-match-forward #\# mark*)) mark)
-                 ((mark<= mark* end) mark*)
-                 (else (loop mark*)))))))
-  (loop start))
+      (let ((m (match-backward "*/" mark)))
+       (if m
+           (let ((m (search-backward "/*" m end)))
+             (and m
+                  (loop m)))
+           (let ((mark* (indentation-end mark)))
+             (cond ((not (char-match-forward #\# mark*)) mark)
+                   ((mark<= mark* end) mark*)
+                   (else (loop mark*)))))))))
 
 (define (backward-to-start-of-continued-exp start end)
   (let ((mark
index a26c22bc091c3eb840135fa3f256da77c0c6330f..c4c6aa10109a8529dc89b382d95de71d42eb2bf3 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comint.scm,v 1.2 1991/03/27 23:36:34 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comint.scm,v 1.3 1991/04/21 00:49:16 cph Exp $
 
 Copyright (c) 1991 Massachusetts Institute of Technology
 
@@ -216,7 +216,8 @@ Thus it can, for instance, track cd/pushd/popd commands issued to the shell."
 Only inputs answering true to this procedure are saved on the input
 history list.  Default is to save anything that isn't all whitespace."
   (lambda (string)
-    (not (re-match-string-forward "\\`\\s *\\'" string))))
+    (not (re-match-string-forward (re-compile-pattern "\\`\\s *\\'" false)
+                                 false (ref-variable syntax-table) string))))
 \f
 (define-command comint-previous-input
   "Cycle backwards through input history."
@@ -271,7 +272,8 @@ history list.  Default is to save anything that isn't all whitespace."
 
 (define (comint-history-search string backward?)
   (let ((ring (ref-variable comint-input-ring))
-       (regexp (re-quote-string string)))
+       (syntax-table (ref-variable syntax-table))
+       (pattern (re-compile-pattern (re-quote-string string) false)))
     (let ((size (+ (ring-size ring) 1)))
       (let ((start
             (command-message-receive comint-input-ring-tag
@@ -282,7 +284,9 @@ history list.  Default is to save anything that isn't all whitespace."
            (cond ((if backward? (>= index size) (< index 0))
                   (set-command-message! comint-input-ring-tag start)
                   (editor-failure "Not found"))
-                 ((re-search-string-forward regexp
+                 ((re-search-string-forward pattern
+                                            false
+                                            syntax-table
                                             (ring-ref ring (- index 1)))
                   (set-variable! comint-last-input-match string)
                   ((ref-command comint-previous-input) (- index start)))
index da28c09664e1d36be9f01103c86f33c48cd8c6bb..b37688caa35c9e564b82a5d64c625ac21587f23b 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comman.scm,v 1.65 1991/03/15 23:49:11 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comman.scm,v 1.66 1991/04/21 00:49:23 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
     (vector-set! variable variable-index:value-validity-test false)
     variable))
 
-(define-integrable (%set-variable-value! variable value)
+(define-integrable (%%set-variable-value! variable value)
   (vector-set! variable variable-index:value value))
 
 (define-integrable (make-variable-buffer-local! variable)
 (define (->variable object)
   (if (variable? object) object (name->variable object)))
 
+(define-integrable (%set-variable-value! variable value)
+  (%%set-variable-value! variable value)
+  (invoke-variable-assignment-daemons! variable))
+
 (define (set-variable-value! variable value)
   (if (variable-buffer-local? variable)
-      (make-local-binding! variable value)
-      (without-interrupts
-       (lambda ()
-        (check-variable-value-validity! variable value)
-        (%set-variable-value! variable value)
-        (invoke-variable-assignment-daemons! variable)))))
+      (define-variable-local-value! (current-buffer) variable value)
+      (begin
+       (check-variable-value-validity! variable value)
+       (without-interrupts
+        (lambda ()
+          (%set-variable-value! variable value))))))
 
 (define (with-variable-value! variable new-value thunk)
   (let ((old-value))
index f9a661dc51dcf69c5f1f363924ddff81a093a168..f71b7d73c2233561e447479676188d8793b460e3 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/debuge.scm,v 1.40 1990/11/02 03:23:28 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/debuge.scm,v 1.41 1991/04/21 00:49:31 cph Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989, 1990 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
@@ -76,7 +76,7 @@
                      (write-string "Writing file '")
                      (write-string filename)
                      (write-string "'")
-                     (region->file (buffer-region buffer) filename)
+                     (write-region (buffer-region buffer) filename false)
                      (write-string " -- done")
                      (set-buffer-pathname! buffer pathname)
                      (set-buffer-truename! buffer truename)
index b21e6dd0c232a3a83bd85c706a0af17aaf907bde..e7481577aa91dae7e858d5180c760ac39aa61856 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/decls.scm,v 1.17 1991/03/22 00:31:17 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/decls.scm,v 1.18 1991/04/21 00:49:38 cph Exp $
 
 Copyright (c) 1989-91 Massachusetts Institute of Technology
 
@@ -92,7 +92,6 @@ MIT in each case. |#
              "rename"
              "rgxcmp"
              "ring"
-             "search"
              "simple"
              "strpad"
              "strtab"
@@ -154,6 +153,7 @@ MIT in each case. |#
              "schmod"
              "scrcom"
              "screen"
+             "sendmail"
              "sercom"
              "shell"
              "struct"
@@ -176,6 +176,7 @@ MIT in each case. |#
   (sf-edwin "grpops" "struct")
   (sf-edwin "regops" "struct")
   (sf-edwin "motion" "struct")
+  (sf-edwin "search" "struct")
   (sf-edwin "buffer" "comman" "modes")
   (sf-edwin "curren" "buffer")
   (sf-class "window" "class")
index 44d86f1a1c23019b30a0daf83c4f636a07ebed9c..b7f88f73446724421c7abfe971cf6b2049ff6925 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/dired.scm,v 1.106 1991/04/11 03:12:28 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/dired.scm,v 1.107 1991/04/21 00:49:47 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -160,16 +160,16 @@ CANNOT contain the 'F' option."
    (string-append "Reading directory "
                  (pathname->string pathname)
                  "..."))
-  (with-working-directory-pathname (pathname-directory-path pathname)
-    (lambda ()
-      (shell-command
-       (string-append "ls "
-                     (ref-variable dired-listing-switches)
-                     " "
-                     (if (file-directory? pathname)
-                         (pathname->string pathname)
-                         (pathname-name-path pathname)))
-       (buffer-point buffer))))
+  (let ((directory (pathname-directory-path pathname)))
+    (with-working-directory-pathname directory
+      (lambda ()
+       (run-synchronous-process false
+                                (buffer-point buffer)
+                                (find-program "ls" directory)
+                                (ref-variable dired-listing-switches)
+                                (if (file-directory? pathname)
+                                    (pathname->string pathname)
+                                    (pathname-name-path pathname))))))
   (append-message "done")
   (let ((point (mark-left-inserting-copy (buffer-point buffer)))
        (group (buffer-group buffer)))
@@ -186,19 +186,18 @@ CANNOT contain the 'F' option."
   (set-buffer-read-only! buffer))
 
 (define (add-dired-entry pathname)
-  (let ((lstart (line-start (current-point) 0)))
-    (if (pathname=? (buffer-default-directory (mark-buffer lstart))
-                   (pathname-directory-path pathname))
+  (let ((lstart (line-start (current-point) 0))
+       (directory (pathname-directory-path pathname)))
+    (if (pathname=? (buffer-default-directory (mark-buffer lstart)) directory)
        (let ((start (mark-right-inserting lstart)))
-         (shell-command
-          (string-append "ls -d "
-                         (ref-variable dired-listing-switches)
-                         "
-                         (pathname->string pathname))
-          lstart)
+         (run-synchronous-process false
+                                  lstart
+                                  (find-program "ls" directory)
+                                  "-d"
+                                  (ref-variable dired-listing-switches)
+                                  (pathname->string pathname))
          (insert-string "  " start)
-         (let ((start
-                (mark-right-inserting (dired-filename-start start))))
+         (let ((start (mark-right-inserting (dired-filename-start start))))
            (insert-string
             (pathname-name-string
              (string->pathname
@@ -319,38 +318,27 @@ CANNOT contain the 'F' option."
 (define-command dired-chmod
   "Change mode of this file."
   "sChange to Mode"
-  (lambda (mode)
-    (let ((pathname (dired-current-pathname)))
-      (subprocess-wait
-       (start-batch-subprocess
-       (find-program "chmod" (buffer-default-directory (current-buffer)))
-       (vector "chmod" mode (pathname->string pathname))
-       false))
-      (dired-redisplay pathname))))
+  (lambda (mode) (dired-change-line "chmod" mode)))
 
 (define-command dired-chgrp
   "Change group of this file."
   "sChange to Group"
-  (lambda (group)
-    (let ((pathname (dired-current-pathname)))
-      (subprocess-wait
-       (start-batch-subprocess
-       (find-program "chgrp" (buffer-default-directory (current-buffer)))
-       (vector "chgrp" group (pathname->string pathname))
-       false))
-      (dired-redisplay pathname))))
+  (lambda (group) (dired-change-line "chgrp" group)))
 
 (define-command dired-chown
   "Change owner of this file."
   "sChange to Owner"
-  (lambda (owner)
-    (let ((pathname (dired-current-pathname)))
-      (subprocess-wait
-       (start-batch-subprocess
-       (find-program "chown" (buffer-default-directory (current-buffer)))
-       (vector "chown" owner (pathname->string pathname))
-       false))
-      (dired-redisplay pathname))))
+  (lambda (owner) (dired-change-line "chown" owner)))
+
+(define (dired-change-line program argument)
+  (let ((pathname (dired-current-pathname)))
+    (run-synchronous-process false
+                            false
+                            (find-program program
+                                          (pathname-directory-path pathname))
+                            argument
+                            (pathname->string pathname))
+    (dired-redisplay pathname)))
 
 (define (dired-redisplay pathname)
   (let ((lstart (mark-right-inserting (line-start (current-point) 0))))
index 89059bce8dcc403ed8494ffdcc2d43574bdb9714..bef9923d2d8df3693116f13cf26c6680bc817ffb 100644 (file)
               edwin-syntax-table)
     ("search"  (edwin)
               syntax-table/system-internal)
+    ("sendmail" (edwin sendmail)
+               edwin-syntax-table)
     ("sercom"  (edwin)
               edwin-syntax-table)
     ("shell"   (edwin)
index a3247e0d665b9d3f9cda5a69710c2e9abc761e98..3234e9d7bd57305dbc1537f488a43674383d23cf 100644 (file)
@@ -1,5 +1,5 @@
 ;;; -*-Scheme-*-
-;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.ldr,v 1.13 1991/03/22 00:31:28 cph Exp $
+;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.ldr,v 1.14 1991/04/21 00:50:02 cph Exp $
 ;;; program to load package contents
 ;;; **** This program (unlike most .ldr files) is not generated by a program.
 
     (load "regcom" (->environment '(EDWIN REGISTER-COMMAND)))
     (load "replaz" environment)
     (load "schmod" environment)
+    (load "sendmail" (->environment '(EDWIN SENDMAIL)))
     (load "sercom" environment)
     (load "iserch" (->environment '(EDWIN INCREMENTAL-SEARCH)))
     (load "shell" environment)
index 133e867970c047c66954d135ffec09e972ed2546..3ab0165bd8947d3867dba5bc39c147ae32aced41 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.pkg,v 1.29 1991/04/12 23:23:58 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.pkg,v 1.30 1991/04/21 00:50:10 cph Exp $
 
 Copyright (c) 1989-91 Massachusetts Institute of Technology
 
@@ -492,32 +492,26 @@ MIT in each case. |#
   (files "regexp")
   (parent (edwin))
   (export (edwin)
-         char-match-backward
-         char-match-forward
-         char-search-backward
-         char-search-forward
-         match-backward
-         match-forward
+         delete-match
+         re-match-buffer-forward
          re-match-end
          re-match-end-index
          re-match-forward
          re-match-start
          re-match-start-index
          re-match-string-forward
-         re-match-string-forward-ci
          re-match-substring-forward
-         re-match-substring-forward-ci
-         re-quote-string
          re-search-backward
+         re-search-buffer-backward
+         re-search-buffer-forward
          re-search-forward
+         re-search-string-backward
          re-search-string-forward
-         re-search-string-forward-ci
+         re-search-substring-backward
          re-search-substring-forward
-         re-search-substring-forward-ci
+         replace-match
          search-backward
-         search-forward
-         skip-chars-backward
-         skip-chars-forward))
+         search-forward))
 
 (define-package (edwin regular-expression-compiler)
   (files "rgxcmp")
@@ -529,6 +523,7 @@ MIT in each case. |#
          re-compile-pattern
          re-compile-string
          re-disassemble-pattern
+         re-quote-string
          re-translation-table))
 
 (define-package (edwin lisp-indentation)
@@ -716,4 +711,22 @@ MIT in each case. |#
          shell-command
          shell-command-region
          start-process
-         stop-process))
\ No newline at end of file
+         stop-process
+         run-synchronous-process))
+
+(define-package (edwin sendmail)
+  (files "sendmail")
+  (parent (edwin))
+  (export (edwin)
+         edwin-mode$mail
+         edwin-variable$mail-archive-file-name
+         edwin-variable$mail-default-reply-to
+         edwin-variable$mail-header-separator
+         edwin-variable$mail-interactive
+         edwin-variable$mail-mode-hook
+         edwin-variable$mail-reply-buffer
+         edwin-variable$mail-self-blind
+         edwin-variable$mail-yank-ignored-headers
+         edwin-variable$send-mail-procedure
+         edwin-variable$sendmail-program
+         make-mail-buffer))
\ No newline at end of file
index 0a698b8d6a43d46944ff18f03ea12ea70f878ead..d647bd3a02d9d247af2db904e791990190a82000 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/filcom.scm,v 1.148 1991/04/12 23:26:32 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/filcom.scm,v 1.149 1991/04/21 00:50:21 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -363,29 +363,42 @@ if you wish to make buffer not be visiting any file."
       (buffer-modified! buffer)))
 
 (define-command write-file
-  "Store buffer in specified file.
-This file becomes the one being visited."
+  "Write current buffer into file FILENAME.
+Makes buffer visit that file, and marks it not modified."
   "FWrite file"
   (lambda (filename)
     (write-file (current-buffer) filename)))
 
 (define (write-file buffer filename)
-  (set-visited-pathname buffer (->pathname filename))
-  (write-buffer-interactive buffer))
+  (if (and filename
+          (not (string-null? filename)))
+      (set-visited-pathname buffer (->pathname filename)))
+  (buffer-modified! buffer)
+  (save-buffer buffer))
 
 (define-command write-region
-  "Store the region in specified file."
-  "FWrite region"
-  (lambda (filename)
-    (write-region (current-region) filename)))
+  "Write current region into specified file."
+  "r\nFWrite region to file"
+  (lambda (region filename)
+    (write-region region filename true)))
+
+(define-command append-to-file
+  "Write current region into specified file."
+  "r\nFAppend to file"
+  (lambda (region filename)
+    (append-to-file region filename true)))
 
 (define-command insert-file
   "Insert contents of file into existing text.
 Leaves point at the beginning, mark at the end."
   "FInsert file"
   (lambda (filename)
-    (set-current-region! (insert-file (current-point) filename))))
-
+    (let ((point (mark-right-inserting (current-point))))
+      (let ((mark (mark-left-inserting point)))
+       (insert-file point filename)
+       (set-current-point! point)
+       (push-current-mark! mark)))))
+\f
 (define (pathname->buffer-name pathname)
   (let ((name (pathname-name pathname)))
     (if name
index ffe4bf758374ca9f5a2b13495dda6db870980869..1f152381550c9ba2af9f6e7a581999d9f98410c8 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/fileio.scm,v 1.95 1991/04/12 23:28:01 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/fileio.scm,v 1.96 1991/04/21 00:50:30 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
   (initialize-buffer-local-variables! buffer))
 
 (define (insert-file mark filename)
-  (let ((pathname (->pathname filename)))
-    (let ((truename (pathname->input-truename pathname)))
-      (if truename
-         (%insert-file mark truename)
-         (editor-error "File " (pathname->string pathname) " not found")))))
+  (%insert-file
+   mark
+   (let ((pathname (->pathname filename)))
+     (let ((truename (pathname->input-truename pathname)))
+       (if (not truename)
+          (editor-error "File " (pathname->string pathname) " not found"))
+       truename))))
 
 (define-variable read-file-message
   "If true, messages are displayed when files are read into the editor."
@@ -236,10 +238,11 @@ at the end of a file."
                        (editor-error
                         "Local variables entry is missing the prefix"))
                    start))))
-         (let ((m2 (if (char-search-forward #\: m1 end)
-                       (re-match-start 0)
-                       (editor-error
-                        "Missing colon in local variables entry"))))
+         (let ((m2
+                (let ((m2 (char-search-forward #\: m1 end)))
+                  (if (not m2)
+                      (editor-error "Missing colon in local variables entry"))
+                  (mark-1+ m2))))
            (let ((var (extract-string m1 (horizontal-space-start m2)))
                  (m3 (horizontal-space-end (mark1+ m2))))
              (if (not (string-ci=? var "End"))
@@ -274,8 +277,10 @@ at the end of a file."
                                      (let ((variable (name->variable var))
                                            (value (evaluate val)))
                                        (lambda ()
-                                         (make-local-binding! variable
-                                                              value))))))))))
+                                         (define-variable-local-value!
+                                          (current-buffer)
+                                          variable
+                                          value))))))))))
                      (loop m4))))))))
 
       (loop start))))
@@ -369,8 +374,10 @@ Otherwise asks confirmation."
 
 (define (write-buffer buffer)
   (let ((truename
-        (write-region (buffer-unclipped-region buffer)
-                      (buffer-pathname buffer))))
+        (string->pathname
+         (write-region (buffer-unclipped-region buffer)
+                       (buffer-pathname buffer)
+                       true))))
     (if truename
        (begin
          (set-buffer-truename! buffer truename)
@@ -379,18 +386,78 @@ Otherwise asks confirmation."
          (buffer-not-modified! buffer)
          (set-buffer-modification-time! buffer
                                         (file-modification-time truename))))))
-
-(define (write-region region filename)
-  (let ((truename (pathname->output-truename (->pathname filename))))
-    (temporary-message "Writing file \"" (pathname->string truename) "\"")
-    (region->file region truename)
-    (append-message " -- done")
-    truename))
-
-(define (region->file region pathname)
-  (call-with-output-file pathname
-    (lambda (port)
-      (write-string (region->string region) port))))
+\f
+(define-variable enable-emacs-write-file-message
+  "If true, generate Emacs-style message when writing files."
+  true
+  boolean?)
+
+(define (write-region region filename message?)
+  (let ((filename (canonicalize-output-filename filename)))
+    (let ((do-it
+          (lambda ()
+            (group-write-to-file (region-group region)
+                                 (region-start-index region)
+                                 (region-end-index region)
+                                 filename))))
+      (cond ((not message?)
+            (do-it))
+           ((ref-variable enable-emacs-write-file-message)
+            (do-it)
+            (message "Wrote " filename))
+           (else
+            (temporary-message "Writing file \"" filename "\"")
+            (do-it)
+            (append-message " -- done"))))
+    filename))
+
+(define (append-to-file region filename message?)
+  (let ((filename (canonicalize-overwrite-filename filename)))
+    (let ((do-it
+          (lambda ()
+            (group-append-to-file (region-group region)
+                                  (region-start-index region)
+                                  (region-end-index region)
+                                  filename))))
+      (cond ((not message?)
+            (do-it))
+           ((ref-variable enable-emacs-write-file-message)
+            (do-it)
+            (message "Wrote " filename))
+           (else
+            (temporary-message "Writing file \"" filename "\"")
+            (do-it)
+            (append-message " -- done"))))
+    filename))
+
+(define (group-write-to-file group start end filename)
+  (let ((channel (file-open-output-channel filename)))
+    (group-write-to-channel group start end channel)
+    (channel-close channel)))
+
+(define (group-append-to-file group start end filename)
+  (let ((channel (file-open-append-channel filename)))
+    (group-write-to-channel group start end channel)
+    (channel-close channel)))
+
+(define (group-write-to-channel group start end channel)
+  (let ((text (group-text group))
+       (gap-start (group-gap-start group))
+       (gap-end (group-gap-end group))
+       (gap-length (group-gap-length group)))
+    (cond ((fix:<= end gap-start)
+          (channel-write-block channel text start end))
+         ((fix:<= gap-start start)
+          (channel-write-block channel
+                               text
+                               (fix:+ start gap-length)
+                               (fix:+ end gap-length)))
+         (else
+          (channel-write-block channel text start gap-start)
+          (channel-write-block channel
+                               text
+                               gap-end
+                               (fix:+ end gap-length))))))
 \f
 (define (require-newline buffer)
   (let ((require-final-newline? (ref-variable require-final-newline)))
index 51e4f74341ca30ab080c25d41102bca25c19cabc..e6dee0a238c6ded16e7261277a1efccf6e44a13b 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/fill.scm,v 1.46 1991/04/13 04:00:31 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/fill.scm,v 1.47 1991/04/21 00:50:39 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -116,12 +116,13 @@ Otherwise the current position of the cursor is used."
                  (let ((end (match-forward fill-prefix point)))
                    (if end
                        (delete-string point end))))
-             (if (char-search-forward #\newline point)
-                 (begin
-                   (move-mark-to! point (re-match-start 0))
-                   (delete-string point (mark1+ point))
-                   (insert-char #\space point)
-                   (loop))))
+             (let ((m (char-search-forward #\newline point end)))
+               (if m
+                   (begin
+                     (move-mark-to! point m)
+                     (delete-left-char point)
+                     (insert-char #\space point)
+                     (loop)))))
            (delete-horizontal-space end)
            (move-mark-to! point start)
            (let loop ()
@@ -132,13 +133,18 @@ Otherwise the current position of the cursor is used."
                    (let ((target (move-to-column point fill-column)))
                      (if (not (group-end? target))
                          (let ((end
-                                (cond ((char-search-backward #\space
+                                (let ((end
+                                       (char-search-backward #\space
                                                              (mark1+ target)
-                                                             point)
-                                       (re-match-end 0))
-                                      ((char-search-forward #\space target)
-                                       (re-match-start 0))
-                                      (else false))))
+                                                             point)))
+                                  (if end
+                                      (mark1+ end)
+                                      (let ((m
+                                             (char-search-forward #\space
+                                                                  target
+                                                                  end)))
+                                        (and m
+                                             (mark-1+ m)))))))
                            (if end
                                (begin
                                  (move-mark-to! point end)
index 0fc8ec41d022070ced1dc8a924039d013e08fb43..9778b8c19a78d65f841a29d9f80bf37a4cf13aa8 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/hlpcom.scm,v 1.95 1991/04/12 23:28:16 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/hlpcom.scm,v 1.96 1991/04/21 00:50:46 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -233,13 +233,13 @@ If you want VALUE to be a string, you must surround it with doublequotes."
     (let ((variable (name->variable variable)))
       (if (not (variable-value-valid? variable value))
          (editor-error "illegal value for variable:" value))
-      (make-local-binding! variable value))))
+      (define-variable-local-value! (current-buffer) variable value))))
 
 (define-command kill-local-variable
   "Make a variable use its global value in the current buffer."
   "vKill local variable"
   (lambda (name)
-    (unmake-local-binding! (name->variable name))))
+    (undefine-variable-local-value! (current-buffer) (name->variable name))))
 \f
 ;;;; Other Stuff
 
index 4f3fea64cf640d831731472049d0bb86e592dc3d..0fee1b7cd15786808084ca4d757124d89094ae72 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/info.scm,v 1.98 1991/04/12 23:28:31 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/info.scm,v 1.99 1991/04/21 00:50:55 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -444,26 +444,26 @@ except for \\[info-cease-edit] to return to Info."
 
 (define (menu-item-keyword item)
   (let ((end (char-search-forward #\: item (line-end item 0))))
-    (if end
-       (extract-string item (re-match-start 0))
-       (error "Menu item missing colon"))))
+    (if (not end)
+       (error "Menu item missing colon"))
+    (extract-string item (mark-1+ end))))
 
 (define (menu-item-name item)
   (let ((colon (char-search-forward #\: item (line-end item 0))))
-    (cond ((not colon) (error "Menu item missing colon"))
-         ((match-forward "::" (re-match-start 0))
-          (extract-string item (re-match-start 0)))
-         (else
-          (%menu-item-name (horizontal-space-end colon))))))
+    (if (not colon)
+       (error "Menu item missing colon."))
+    (if (match-forward "::" (mark-1+ colon))
+       (extract-string item (re-match-start 0))
+       (%menu-item-name (horizontal-space-end colon)))))
 
 (define (%menu-item-name start)
   (if (line-end? start)
-      (error "Menu item missing node name")
-      (extract-string start
-                     (let ((end (line-end start 0)))
-                       (if (re-search-forward "[.,\t]" start end)
-                           (re-match-start 0)
-                           end)))))
+      (error "Menu item missing node name"))
+  (extract-string start
+                 (let ((end (line-end start 0)))
+                   (if (re-search-forward "[.,\t]" start end)
+                       (re-match-start 0)
+                       end))))
 \f
 ;;;; Cross References
 
@@ -490,10 +490,10 @@ The name may be an abbreviation of the reference name."
   (re-search-forward "\\*Note[ \t\n]*" start))
 
 (define (cref-item-keyword item)
-  (let ((colon (char-search-forward #\: item)))
-    (if colon
-       (%cref-item-keyword item (re-match-start 0))
-       (error "Cross reference missing colon"))))
+  (let ((colon (char-search-forward #\: item (group-end item))))
+    (if (not colon)
+       (error "Cross reference missing colon."))
+    (%cref-item-keyword item (mark-1+ colon))))
 
 (define (%cref-item-keyword item colon)
   (let ((string (extract-string item colon)))
@@ -501,12 +501,12 @@ The name may be an abbreviation of the reference name."
     (string-trim string)))
 
 (define (cref-item-name item)
-  (let ((colon (char-search-forward #\: item)))
-    (cond ((not colon) (error "Cross reference missing colon"))
-         ((match-forward "::" (re-match-start 0))
-          (%cref-item-keyword item (re-match-start 0)))
-         (else
-          (%menu-item-name (cref-item-space-end colon))))))
+  (let ((colon (char-search-forward #\: item (group-end item))))
+    (if (not colon)
+       (error "Cross reference missing colon."))
+    (if (match-forward "::" (mark-1+ colon))
+       (%cref-item-keyword item (re-match-start 0))
+       (%menu-item-name (cref-item-space-end colon)))))
 
 (define (cref-item-space-end mark)
   (skip-chars-forward " \t\n" mark))
index 5b64d566424c13c175e72c8f3e8c5bde75740498..ab95a826792a91586315e8f141634238c6319616 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/kilcom.scm,v 1.59 1991/03/22 00:32:08 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/kilcom.scm,v 1.60 1991/04/21 00:51:04 cph Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -163,20 +163,27 @@ appropriate number of spaces and then one space is deleted."
   "P"
   (lambda (argument)
     (define (back n)
-      (let ((m1 (mark- (current-point) n 'LIMIT)))
-       (if (not (char-search-backward #\Tab (current-point) m1))
-           m1
-           (begin (convert-tab-to-spaces! (re-match-start 0))
-                  (back n)))))
+      (let ((point (current-point)))
+       (let ((m1 (mark- point n 'LIMIT)))
+         (let ((tab (char-search-backward #\tab point m1)))
+           (if (not tab)
+               m1
+               (begin
+                 (convert-tab-to-spaces! tab)
+                 (back n)))))))
     (define (forth n)
-      (let ((m1 (mark+ (current-point) n 'LIMIT)))
-       (if (not (char-search-forward #\Tab (current-point) m1))
-           m1
-           (begin (convert-tab-to-spaces! (re-match-start 0))
-                  (forth n)))))
+      (let ((point (current-point)))
+       (let ((m1 (mark+ point n 'LIMIT)))
+         (let ((tab (char-search-forward #\tab point m1)))
+           (if (not tab)
+               m1
+               (begin
+                 (convert-tab-to-spaces! (mark-1+ tab))
+                 (forth n)))))))
     (cond ((not argument)
-          (if (char-match-backward #\Tab)
-              (convert-tab-to-spaces! (mark-1+ (current-point))))
+          (let ((point (current-point)))
+            (if (char-match-backward #\Tab point)
+                (convert-tab-to-spaces! (mark-1+ point))))
           (delete-region (mark-1+ (current-point))))
          ((positive? argument)
           (kill-region (back argument)))
index 47f655d5adad9021c23e8ba1f5113b475838d20e..900918744171957f7d705f4000b0d81642ede9fd 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/lincom.scm,v 1.107 1991/04/12 23:20:06 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/lincom.scm,v 1.108 1991/04/21 00:51:10 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -195,7 +195,7 @@ by the variable indent-line-procedure."
   (lambda (argument)
     (let ((indent-line-procedure (ref-variable indent-line-procedure)))
       (if (eq? indent-line-procedure indent-to-left-margin)
-         (insert-chars #\Tab argument)
+         (insert-chars #\tab argument)
          (indent-line-procedure)))))
 
 (define-command newline-and-indent
@@ -225,6 +225,122 @@ and indent the new line indent according to mode."
     ((ref-command newline) false)
     ((ref-command indent-according-to-mode))))
 \f
+(define-variable indent-tabs-mode
+  "If false, do not use tabs for indentation or horizontal spacing."
+  true
+  boolean?)
+
+(define-command indent-tabs-mode
+  "Enables or disables use of tabs as indentation.
+A positive argument turns use of tabs on;
+zero or negative, turns it off.
+With no argument, the mode is toggled."
+  "P"
+  (lambda (argument)
+    (set-variable! indent-tabs-mode
+                  (if argument
+                      (positive? argument)
+                      (not (ref-variable indent-tabs-mode))))))
+
+(define-command insert-tab
+  "Insert a tab character."
+  ()
+  (lambda ()
+    (if (ref-variable indent-tabs-mode)
+       (insert-char #\tab)
+       (maybe-change-column
+        (let ((tab-width (ref-variable tab-width)))
+          (* tab-width (1+ (quotient (current-column) tab-width))))))))
+
+(define-command indent-relative
+  "Space out to under next indent point in previous nonblank line.
+An indent point is a non-whitespace character following whitespace."
+  ()
+  (lambda ()
+    (let ((point (current-point)))
+      (let ((indentation (indentation-of-previous-non-blank-line point)))
+       (cond ((not (= indentation (current-indentation point)))
+              (change-indentation indentation point))
+             ((line-start? (horizontal-space-start point))
+              (set-current-point! (horizontal-space-end point))))))))
+
+(define (indentation-of-previous-non-blank-line mark)
+  (let ((start (find-previous-non-blank-line mark)))
+    (if start
+       (current-indentation start)
+       0)))
+\f
+(define-variable indent-region-procedure
+  "Function which is short cut to indent each line in region with Tab.
+#F means really call Tab on each line."
+  false
+  (lambda (object)
+    (or (false? object)
+       (and (procedure? object)
+            (procedure-arity-valid? object 2)))))
+
+(define-command indent-region
+  "Indent each nonblank line in the region.
+With no argument, indent each line with Tab.
+With argument COLUMN, indent each line to that column."
+  "r\nP"
+  (lambda (region argument)
+    (let ((start (region-start region))
+         (end (region-end region)))
+      (cond (argument
+            (indent-region start end argument))
+           ((ref-variable indent-region-procedure)
+            ((ref-variable indent-region-procedure) start end))
+           (else
+            (for-each-line-in-region start end
+              (let ((indent-line (ref-variable indent-line-procedure)))
+                (lambda (start)
+                  (set-current-point! start)
+                  (indent-line)))))))))
+
+(define (indent-region start end n-columns)
+  (if (exact-nonnegative-integer? n-columns)
+      (for-each-line-in-region start end
+       (lambda (start)
+         (delete-string start (horizontal-space-end start))
+         (insert-horizontal-space n-columns start)))))
+
+(define-command indent-rigidly
+  "Indent all lines starting in the region sideways by ARG columns."
+  "r\nP"
+  (lambda (region argument)
+    (if argument
+       (indent-rigidly (region-start region) (region-end region) argument))))
+
+(define (indent-rigidly start end n-columns)
+  (for-each-line-in-region start end
+    (lambda (start)
+      (let ((end (horizontal-space-end start)))
+       (if (line-end? end)
+           (delete-string start end)
+           (let ((new-column (max 0 (+ n-columns (mark-column end)))))
+             (delete-string start end)
+             (insert-horizontal-space new-column start)))))))
+
+(define (for-each-line-in-region start end procedure)
+  (if (not (mark<= start end))
+      (error "Marks incorrectly related:" start end))
+  (let ((start (mark-right-inserting-copy (line-start start 0))))
+    (let ((end
+          (mark-left-inserting-copy
+           (if (and (line-start? end) (mark< start end))
+               (mark-1+ end)
+               (line-end end 0)))))
+      (let loop ()
+       (procedure start)
+       (let ((m (line-end start 0)))
+         (if (mark< m end)
+             (begin
+               (move-mark-to! start (mark1+ m))
+               (loop)))))
+      (mark-temporary! start)
+      (mark-temporary! end))))
+\f
 (define-command newline
   "Insert newline, or move onto blank line.
 A blank line is one containing only spaces and tabs
@@ -340,119 +456,50 @@ moves down one line first (killing newline after current line)."
   "\\[delete-indentation] won't insert a space to the left of these."
   (char-set #\)))
 \f
-(define-variable indent-tabs-mode
-  "If false, do not use tabs for indentation or horizontal spacing."
-  true)
-
-(define-command indent-tabs-mode
-  "Enables or disables use of tabs as indentation.
-A positive argument turns use of tabs on;
-zero or negative, turns it off.
-With no argument, the mode is toggled."
-  "P"
-  (lambda (argument)
-    (set-variable! indent-tabs-mode
-                  (if argument
-                      (positive? argument)
-                      (not (ref-variable indent-tabs-mode))))))
-
-(define-command insert-tab
-  "Insert a tab character."
-  ()
-  (lambda ()
-    (if (ref-variable indent-tabs-mode)
-       (insert-char #\Tab)
-       (maybe-change-column
-        (let ((tab-width (ref-variable tab-width)))
-          (* tab-width (1+ (quotient (current-column) tab-width))))))))
-
-(define-command indent-region
-  "Indent all lines between point and mark.
-With argument, indents each line to exactly that column.
-Otherwise, does Tab on each line.
-A line is processed if its first character is in the region.
-The mark is left after the last line processed."
-  "P"
-  (lambda (argument)
-    (cond ((not argument)
-          (not-implemented))
-         ((not (negative? argument))
-          (current-region-of-lines
-           (lambda (start end)
-             (let loop ((mark start))
-               (change-indentation argument mark)
-               (if (not (mark= mark end))
-                   (loop (mark-right-inserting (line-start mark 1)))))))))))
-\f
-(define-command indent-rigidly
-  "Shift text in region sideways as a unit.
-All the lines in the region (first character between point and mark)
-have their indentation incremented by the numeric argument
-of this command (which may be negative).
-Exception: lines containing just spaces and tabs become empty."
-  "P"
-  (lambda (argument)
-    (if argument
-       (current-region-of-lines
-        (lambda (start end)
-          (define (loop mark)
-            (if (line-blank? mark)
-                (delete-horizontal-space mark)
-                (change-indentation
-                 (max (+ argument (current-indentation mark)) 0)
-                 mark))
-            (if (not (mark= mark end))
-                (loop (mark-right-inserting (line-start mark 1)))))
-          (loop start))))))
-
-(define (current-region-of-lines receiver)
-  (let ((r (current-region)))
-    (let ((start (mark-right-inserting (line-start (region-start r) 0))))
-      (receiver start
-               (if (mark= start (line-start (region-end r) 0))
-                   start
-                   (mark-right-inserting
-                    (line-start (region-end r)
-                                (if (line-start? (region-end r)) -1 0))))))))
-
-(define (untabify-region region)
-  (let ((end (region-end region)))
-    (let loop ((start (region-start region)))
-      (if (char-search-forward #\Tab start end)
-         (let ((tab (re-match-start 0))
-               (next (mark-left-inserting (re-match-end 0))))
-           (let ((n-spaces (- (mark-column next) (mark-column tab))))
-             (delete-string tab next)
-             (insert-chars #\Space n-spaces next))
-           (loop next))))))
+;;;; Tabification
 
 (define-command untabify
   "Convert all tabs in region to multiple spaces, preserving columns.
 The variable tab-width controls the action."
   "r"
-  untabify-region)
+  (lambda (region)
+    (untabify-region (region-start region) (region-end region))))
+
+(define (untabify-region start end)
+  (let ((start (mark-right-inserting-copy start))
+       (end (mark-left-inserting-copy end)))
+    (do ()
+       ((not (char-search-forward #\tab start end)))
+      (let ((tab (re-match-start 0)))
+       (move-mark-to! start (re-match-end 0))
+       (let ((n-spaces (- (mark-column start) (mark-column tab))))
+         (delete-string tab start)
+         (insert-chars #\space n-spaces start))))
+    (mark-temporary! start)
+    (mark-temporary! end)))
 
 (define-command tabify
   "Convert multiple spaces in region to tabs when possible.
 A group of spaces is partially replaced by tabs
 when this can be done without changing the column they end at.
 The variable tab-width controls the action."
-  ()
-  (lambda ()
-    (not-implemented)))
-
-(define-command indent-relative
-  "Space out to under next indent point in previous nonblank line.
-An indent point is a non-whitespace character following whitespace."
-  ()
-  (lambda ()
-    (let ((point (current-point)))
-      (let ((indentation (indentation-of-previous-non-blank-line point)))
-       (cond ((not (= indentation (current-indentation point)))
-              (change-indentation indentation point))
-             ((line-start? (horizontal-space-start point))
-              (set-current-point! (horizontal-space-end point))))))))
-
-(define (indentation-of-previous-non-blank-line mark)
-  (let ((start (find-previous-non-blank-line mark)))
-    (if start (current-indentation start) 0)))
\ No newline at end of file
+  "r"
+  (lambda (region)
+    (tabify-region (region-start region) (region-end region))))
+
+(define (tabify-region start end)
+  (let ((start (mark-left-inserting-copy start))
+       (end (mark-left-inserting-copy end))
+       (pattern (re-compile-pattern "[ \t][ \t]+" false))
+       (tab-width (group-tab-width (mark-group start))))
+    (do ()
+       ((not (re-search-buffer-forward pattern false false
+                                       (mark-group start)
+                                       (mark-index start)
+                                       (mark-index end))))
+      (move-mark-to! start (re-match-start 0))
+      (let ((end-column (mark-column (re-match-end 0))))
+       (delete-string start (re-match-end 0))
+       (insert-horizontal-space end-column start tab-width)))
+    (mark-temporary! start)
+    (mark-temporary! end)))
\ No newline at end of file
index 65f29f7bfec4ce5247f30e4fd291120d543e6427..f23a3742f73ab25fb5c6eb6ced972539f739438f 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/macros.scm,v 1.50 1991/03/15 23:26:19 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/macros.scm,v 1.51 1991/04/21 00:51:18 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 
 (syntax-table-define edwin-syntax-table 'LOCAL-SET-VARIABLE!
   (lambda (name #!optional value)
-    `(MAKE-LOCAL-BINDING!
+    `(DEFINE-VARIABLE-LOCAL-VALUE!
+      (CURRENT-BUFFER)
       ,(variable-name->scheme-name (canonicalize-name name))
       ,(if (default-object? value) '#F value))))
 
index cfd35fb0f4b0424248efecfbf2dcdd6d3e313100..5d0c7eccedb5eb631bc376dc00703e2785df5d76 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/make.scm,v 3.34 1991/04/12 23:29:11 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/make.scm,v 3.35 1991/04/21 00:51:24 cph Exp $
 
 Copyright (c) 1989-91 Massachusetts Institute of Technology
 
@@ -37,4 +37,4 @@ MIT in each case. |#
 (declare (usual-integrations))
 
 (package/system-loader "edwin" '() 'QUERY)
-(add-system! (make-system "Edwin" 3 34 '()))
\ No newline at end of file
+(add-system! (make-system "Edwin" 3 35 '()))
\ No newline at end of file
index 255f743d801265625bd23704e5eed4ae49639115..35420db439bfb9ba7a6f3ec9e24683faa857831b 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/modefs.scm,v 1.123 1990/10/03 04:55:37 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/modefs.scm,v 1.124 1991/04/21 00:51:28 cph Exp $
 ;;;
-;;;    Copyright (c) 1985, 1989, 1990 Massachusetts Institute of Technology
+;;;    Copyright (c) 1985, 1989-91 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
@@ -270,6 +270,7 @@ and the cdrs of which are major modes."
 (define-key 'fundamental '(#\c-x #\4 #\b) 'switch-to-buffer-other-window)
 (define-key 'fundamental '(#\c-x #\4 #\d) 'dired-other-window)
 (define-key 'fundamental '(#\c-x #\4 #\f) 'find-file-other-window)
+(define-key 'fundamental '(#\c-x #\4 #\m) 'mail-other-window)
 (define-key 'fundamental '(#\c-x #\5) 'split-window-horizontally)
 (define-key 'fundamental '(#\c-x #\;) 'set-comment-column)
 (define-key 'fundamental '(#\c-x #\=) 'what-cursor-position)
@@ -287,6 +288,7 @@ and the cdrs of which are major modes."
 (define-key 'fundamental '(#\c-x #\j) 'register-to-point)
 (define-key 'fundamental '(#\c-x #\k) 'kill-buffer)
 (define-key 'fundamental '(#\c-x #\l) 'count-lines-page)
+(define-key 'fundamental '(#\c-x #\m) 'mail)
 (define-key 'fundamental '(#\c-x #\n) 'narrow-to-region)
 (define-key 'fundamental '(#\c-x #\o) 'other-window)
 (define-key 'fundamental '(#\c-x #\p) 'narrow-to-page)
index 8401d3c2e2b150f9118c3b2603da03a2a2ac37d7..70973d767dd0a24be81961ed69a4a57424e04ef9 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/process.scm,v 1.3 1991/04/11 03:06:39 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/process.scm,v 1.4 1991/04/21 00:51:34 cph Exp $
 ;;;
 ;;;    Copyright (c) 1991 Massachusetts Institute of Technology
 ;;;
@@ -454,123 +454,119 @@ after the listing is made.)"
 ;;;; Synchronous Subprocesses
 
 (define (shell-command command output-mark)
-  (let ((process
-        (start-pipe-subprocess "/bin/sh" (vector "sh" "-c" command) false))
-       (output-mark (mark-left-inserting output-mark)))
-    (channel-close (subprocess-output-channel process))
-    (let ((output-channel (subprocess-input-channel process)))
-      (channel-nonblocking output-channel)
-      (let ((copy-output
-            (let ((buffer (make-string 512)))
-              (lambda ()
-                (let loop ()
-                  (let ((n (channel-read output-channel buffer 0 512)))
-                    (if (and n (positive? n))
-                        (begin
-                          (insert-substring buffer 0 n output-mark)
-                          (loop)))))))))
-       (let loop ()
-         (copy-output)
-         (let ((status (subprocess-status process)))
-           (if (eq? status 'RUNNING)
-               (loop)
-               (begin
-                 (channel-blocking output-channel)
-                 (copy-output)
-                 (process-termination-message process
-                                              status
-                                              output-mark)))))))))
-
-(define (process-termination-message process status output-mark)
-  (let ((reason (subprocess-exit-reason process)))
-    (let ((abnormal-termination
-          (lambda (message)
-            (guarantee-newlines 2 output-mark)
-            (insert-string "Process " output-mark)
-            (insert-string message output-mark)
-            (insert-string " " output-mark)
-            (insert-string (number->string reason) output-mark)
-            (insert-string "." output-mark)
-            (insert-newline output-mark))))
-      (case status
-       ((STOPPED)
-        (abnormal-termination "stopped with signal")
-        (subprocess-kill process)
-        (subprocess-wait process))
-       ((SIGNALLED)
-        (abnormal-termination "terminated with signal"))
-       ((EXITED)
-        (if (not (eqv? 0 reason))
-            (abnormal-termination "exited abnormally with code"))))))
-  (subprocess-delete process))
-\f
+  (run-synchronous-process false output-mark "/bin/sh" "-c" command))
+
 (define (shell-command-region command output-mark input-region)
+  (run-synchronous-process input-region output-mark "/bin/sh" "-c" command))
+
+(define (run-synchronous-process input-region output-mark program . arguments)
   (let ((process
-        (start-pipe-subprocess "/bin/sh" (vector "sh" "-c" command) false))
-       (output-mark (mark-left-inserting output-mark))
-       (group (region-group input-region))
-       (start-index (region-start-index input-region))
-       (end-index (region-end-index input-region)))
-    (let ((input-channel (subprocess-output-channel process))
-         (output-channel (subprocess-input-channel process)))
-      (channel-nonblocking input-channel)
-      (channel-nonblocking output-channel)
-      (let ((copy-output
-            (let ((buffer (make-string 512)))
-              (lambda ()
-                (let loop ()
-                  (let ((n (channel-read output-channel buffer 0 512)))
-                    (if (and n (positive? n))
-                        (begin
-                          (insert-substring buffer 0 n output-mark)
-                          (loop)))))))))
+        (start-pipe-subprocess program
+                               (list->vector
+                                (cons (os/filename-non-directory program)
+                                      arguments))
+                               false)))
+    (call-with-output-copier process output-mark
+      (lambda (copy-output)
+       (call-with-input-copier process input-region
+         (lambda (copy-input)
+           (let loop ()
+             (copy-input)
+             (copy-output)
+             (let ((status (subprocess-status process)))
+               (if (eq? status 'RUNNING)
+                   (loop)
+                   status)))))))))
+\f
+(define (call-with-output-copier process output-mark receiver)
+  (let ((output-mark (and output-mark (mark-left-inserting output-mark))))
+    (let ((status
+          (if output-mark
+              (let ((output-channel (subprocess-input-channel process)))
+                (let ((copy-output
+                       (let ((buffer (make-string 512)))
+                         (lambda ()
+                           (let loop ()
+                             (let ((n (channel-read output-channel
+                                                    buffer 0 512)))
+                               (if (and n (positive? n))
+                                   (begin
+                                     (insert-substring buffer 0 n output-mark)
+                                     (loop)))))))))
+                  (channel-nonblocking output-channel)
+                  (let ((status (receiver copy-output)))
+                    (channel-blocking output-channel)
+                    (copy-output)
+                    status)))
+              (receiver (lambda () unspecific)))))
+      (let ((reason (subprocess-exit-reason process)))
+       (let ((abnormal-termination
+              (lambda (message)
+                (if output-mark
+                    (begin
+                      (guarantee-newlines 2 output-mark)
+                      (insert-string "Process " output-mark)
+                      (insert-string message output-mark)
+                      (insert-string " " output-mark)
+                      (insert-string (number->string reason) output-mark)
+                      (insert-string "." output-mark)
+                      (insert-newline output-mark))))))
+         (case status
+           ((STOPPED)
+            (abnormal-termination "stopped with signal")
+            (subprocess-kill process)
+            (subprocess-wait process))
+           ((SIGNALLED)
+            (abnormal-termination "terminated with signal"))
+           ((EXITED)
+            (if (not (eqv? 0 reason))
+                (abnormal-termination "exited abnormally with code")))))
+       (subprocess-delete process)
+       (cons status reason)))))
+\f
+(define (call-with-input-copier process input-region receiver)
+  (if input-region
+      (let ((group (region-group input-region))
+           (start-index (region-start-index input-region))
+           (end-index (region-end-index input-region))
+           (input-channel (subprocess-output-channel process)))
+       (channel-nonblocking input-channel)
        (call-with-current-continuation
         (lambda (continuation)
           (bind-condition-handler (list condition-type:system-call-error)
               (lambda (condition)
-                (if (and (eq? 'WRITE
-                              (access-condition condition 'SYSTEM-CALL))
-                         (eq? 'BROKEN-PIPE
-                              (access-condition condition 'ERROR-TYPE)))
-                    (begin
-                      (channel-blocking output-channel)
-                      (copy-output)
-                      (guarantee-newlines 2 output-mark)
-                      (insert-string "broken pipe" output-mark)
-                      (insert-newline output-mark)
-                      (continuation
-                       (process-termination-message process
-                                                    (subprocess-wait process)
-                                                    output-mark)))))
+                (if (and (eq? 'WRITE (system-call-name condition))
+                         (eq? 'BROKEN-PIPE (system-call-error condition)))
+                    (continuation (subprocess-wait process))))
             (lambda ()
-              (let loop ()
-                (if (< start-index end-index)
-                    (let ((index (min (+ start-index 512) end-index)))
-                      (let ((buffer
-                             (group-extract-string group
-                                                   start-index
-                                                   index)))
-                        (let ((n
-                               (channel-write input-channel
-                                              buffer
-                                              0
-                                              (string-length buffer))))
-                          (if n
-                              (begin
-                                (set! start-index (+ start-index n))
-                                (if (= start-index end-index)
-                                    (channel-close input-channel)))))))
-                    (channel-close input-channel))
-                (copy-output)
-                (let ((status (subprocess-status process)))
-                  (if (eq? status 'RUNNING)
-                      (loop)
-                      (begin
-                        (channel-blocking output-channel)
-                        (copy-output)
-                        (process-termination-message process
-                                                     status
-                                                     output-mark)))))))))))))
+              (receiver
+               (lambda ()
+                 (if (< start-index end-index)
+                     (let ((index (min (+ start-index 512) end-index)))
+                       (let ((buffer
+                              (group-extract-string group
+                                                    start-index
+                                                    index)))
+                         (let ((n
+                                (channel-write input-channel
+                                               buffer
+                                               0
+                                               (string-length buffer))))
+                           (if n
+                               (begin
+                                 (set! start-index (+ start-index n))
+                                 (if (= start-index end-index)
+                                     (channel-close input-channel)))))))
+                     (channel-close input-channel)))))))))
+      (begin
+       (channel-close (subprocess-output-channel process))
+       (receiver (lambda () unspecific)))))
+
+(define system-call-name
+  (condition-accessor condition-type:system-call-error 'SYSTEM-CALL))
+
+(define system-call-error
+  (condition-accessor condition-type:system-call-error 'ERROR-TYPE))
 \f
 ;;; These procedures are not specific to the process abstraction.
 
index 73a013e56cb5b0e5ebe870f4696ef7fcd7455685..8131e45bb0b69b23c234c2ef4f5c4f0689907dde 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/regexp.scm,v 1.49 1991/03/15 23:27:48 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/regexp.scm,v 1.50 1991/04/21 00:51:43 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 
 (declare (usual-integrations))
 \f
-(define match-group)
 (define registers (make-vector 20))
+(define match-group)
+(define standard-syntax-table (make-syntax-table))
+
+(define-integrable (re-match-start-index i)
+  (vector-ref registers i))
+
+(define-integrable (re-match-end-index i)
+  (vector-ref registers (+ i 10)))
 
 (define (re-match-start i)
-  (let ((group (unhash match-group)))
+  (guarantee-re-register i 'RE-MATCH-START)
+  (let ((group (object-unhash match-group)))
     (if (not group)
        (error "No match registers" i))
     (make-mark group (re-match-start-index i))))
 
-(define (re-match-start-index i)
-  (if (or (negative? i) (> i 9))
-      (error "No such register" i))
-  (vector-ref registers i))
-
 (define (re-match-end i)
-  (let ((group (unhash match-group)))
+  (guarantee-re-register i 'RE-MATCH-END)
+  (let ((group (object-unhash match-group)))
     (if (not group)
        (error "No match registers" i))
     (make-mark group (re-match-end-index i))))
 
-(define (re-match-end-index i)
-  (if (or (negative? i) (> i 9))
-      (error "No such register" i))
-  (vector-ref registers (+ i 10)))
-
-(define (%re-finish group index)
-  (if index
-      (begin
-       (set! match-group (hash group))
-       (make-mark group index))
-      (begin
-       (set! match-group (hash false))
-       false)))
-
-(define pattern-cache
-  (make-list 32 (cons* "" "" "")))
+(define (guarantee-re-register i operator)
+  (if (not (and (exact-nonnegative-integer? i) (< i 10)))
+      (error:wrong-type-argument i "RE register" operator)))
+
+(define (replace-match replacement)
+  (let ((m (mark-left-inserting-copy (re-match-start 0))))
+    (delete-string m (re-match-end 0))
+    (insert-string m replacement)
+    (mark-temporary! m)
+    m))
+
+(define (delete-match)
+  (let ((m (mark-left-inserting-copy (re-match-start 0))))
+    (delete-string m (re-match-end 0))
+    (mark-temporary! m)
+    m))
+
+(define-integrable (syntax-table-argument syntax-table)
+  (syntax-table/entries (or syntax-table standard-syntax-table)))
+\f
+(define (re-search-buffer-forward pattern case-fold-search syntax-table
+                                 group start end)
+  (let ((index
+        ((ucode-primitive re-search-buffer-forward)
+         pattern
+         (re-translation-table case-fold-search)
+         (syntax-table-argument syntax-table)
+         registers
+         group start end)))
+    (set! match-group (object-hash (and index group)))
+    index))
+
+(define (re-search-buffer-backward pattern case-fold-search syntax-table
+                                  group start end)
+  (let ((index
+        ((ucode-primitive re-search-buffer-backward)
+         pattern
+         (re-translation-table case-fold-search)
+         (syntax-table-argument syntax-table)
+         registers
+         group start end)))
+    (set! match-group (object-hash (and index group)))
+    index))
+
+(define (re-match-buffer-forward pattern case-fold-search syntax-table
+                                group start end)
+  (let ((index
+        ((ucode-primitive re-match-buffer)
+         pattern
+         (re-translation-table case-fold-search)
+         (syntax-table-argument syntax-table)
+         registers
+         group start end)))
+    (set! match-group (object-hash (and index group)))
+    index))
+
+(define (re-match-string-forward pattern case-fold-search syntax-table string)
+  (re-match-substring-forward pattern case-fold-search syntax-table
+                             string 0 (string-length string)))
+
+(define (re-match-substring-forward pattern case-fold-search syntax-table
+                                   string start end)
+  (set! match-group (object-hash false))
+  ((ucode-primitive re-match-substring)
+   pattern
+   (re-translation-table case-fold-search)
+   (syntax-table-argument syntax-table)
+   registers
+   string start end))
 
-(define (compile-pattern regexp)
-  ;; Incredible hair here to prevent excessive consing.
-  ((if (ref-variable case-fold-search) cdr car)
-   (cdr (or (assq regexp pattern-cache)
-           (let ((entry
-                  (cons regexp
-                        (cons (re-compile-pattern regexp false)
-                              (re-compile-pattern regexp true)))))
-             (set! pattern-cache
-                   (cons entry
-                         (except-last-pair! pattern-cache)))
-             entry)))))
+(define (re-search-string-forward pattern case-fold-search syntax-table string)
+  (re-search-substring-forward pattern case-fold-search syntax-table
+                              string 0 (string-length string)))
 
-(define (compile-char char)
-  (re-compile-char char (ref-variable case-fold-search)))
+(define (re-search-substring-forward pattern case-fold-search syntax-table
+                                    string start end)
+  (set! match-group (object-hash false))
+  ((ucode-primitive re-search-substring-forward)
+   pattern
+   (re-translation-table case-fold-search)
+   (syntax-table-argument syntax-table)
+   registers
+   string start end))
 
-(define (compile-string string)
-  (re-compile-string string (ref-variable case-fold-search)))
+(define (re-search-string-backward pattern case-fold-search syntax-table
+                                  string)
+  (re-search-substring-backward pattern case-fold-search syntax-table
+                               string 0 (string-length string)))
+
+(define (re-search-substring-backward pattern case-fold-search syntax-table
+                                     string start end)
+  (set! match-group (object-hash false))
+  ((ucode-primitive re-search-substring-backward)
+   pattern
+   (re-translation-table case-fold-search)
+   (syntax-table-argument syntax-table)
+   registers
+   string start end))
 \f
-;;;; Search
-
 (define-macro (define-search name key-name searcher compile-key
                mark-limit mark-compare)
   `(DEFINE (,name ,key-name #!OPTIONAL START END LIMIT?)
               (ERROR ,(string-append (symbol->string name)
                                      ": Marks incorrectly related")
                      START END))
-          (OR (,searcher (MARK-GROUP START)
-                         (MARK-INDEX START)
-                         (MARK-INDEX END)
-                         (,compile-key ,key-name))
+          (OR (LET ((GROUP (MARK-GROUP START)))
+                (,searcher GROUP
+                           (MARK-INDEX START)
+                           (MARK-INDEX END)
+                           (,compile-key ,key-name
+                                         (GROUP-CASE-FOLD-SEARCH GROUP))))
               (LIMIT-MARK-MOTION LIMIT? END)))))))
 
-(define-search char-search-forward char
-  %re-search-forward compile-char group-end mark<=)
-
 (define-search search-forward string
-  %re-search-forward compile-string group-end mark<=)
+  %re-search-forward re-compile-string group-end mark<=)
 
 (define-search re-search-forward regexp
-  %re-search-forward compile-pattern group-end mark<=)
+  %re-search-forward re-compile-pattern group-end mark<=)
 
 (define (%re-search-forward group start end pattern)
-  (%re-finish group
-             ((ucode-primitive re-search-buffer-forward)
-              pattern
-              (re-translation-table (ref-variable case-fold-search))
-              (syntax-table/entries (ref-variable syntax-table))
-              registers
-              group start end)))
-
-(define-search char-search-backward char
-  %re-search-backward compile-char group-start mark>=)
+  (let ((index
+        (re-search-buffer-forward pattern
+                                  (group-case-fold-search group)
+                                  (group-syntax-table group)
+                                  group start end)))
+    (and index
+        (make-mark group index))))
 
 (define-search search-backward string
-  %re-search-backward compile-string group-start mark>=)
+  %re-search-backward re-compile-string group-start mark>=)
 
 (define-search re-search-backward regexp
-  %re-search-backward compile-pattern group-start mark>=)
+  %re-search-backward re-compile-pattern group-start mark>=)
 
 (define (%re-search-backward group start end pattern)
-  (%re-finish group
-             ((ucode-primitive re-search-buffer-backward)
-              pattern
-              (re-translation-table (ref-variable case-fold-search))
-              (syntax-table/entries (ref-variable syntax-table))
-              registers
-              group end start)))
-\f
-;;;; Match
-
-(define-macro (define-forward-match name key-name compile-key)
-  `(DEFINE (,name ,key-name #!OPTIONAL START END)
-     (LET ((START (IF (DEFAULT-OBJECT? START) (CURRENT-POINT) START)))
-       (LET ((END (IF (DEFAULT-OBJECT? END) (GROUP-END START) END)))
-        (IF (NOT (MARK<= START END))
-            (ERROR ,(string-append (symbol->string name)
-                                   ": Marks incorrectly related")
-                   START END))
-        (%RE-MATCH-FORWARD (MARK-GROUP START)
-                           (MARK-INDEX START)
-                           (MARK-INDEX END)
-                           (,compile-key ,key-name))))))
-
-(define-forward-match char-match-forward char compile-char)
-(define-forward-match match-forward string compile-string)
-(define-forward-match re-match-forward regexp compile-pattern)
-
-(define-macro (define-backward-match name key-name key-length compile-key)
-  `(DEFINE (,name ,key-name #!OPTIONAL START END)
-     (LET ((START (IF (DEFAULT-OBJECT? START) (CURRENT-POINT) START)))
-       (LET ((END (IF (DEFAULT-OBJECT? END) (GROUP-START START) END)))
-        (IF (NOT (MARK>= START END))
-            (ERROR ,(string-append (symbol->string name)
-                                   ": Marks incorrectly related")
-                   START END))
-        (LET ((GROUP (MARK-GROUP START))
-              (START-INDEX (MARK-INDEX START))
-              (END-INDEX (MARK-INDEX END)))
-          (LET ((INDEX (- START-INDEX ,key-length)))
-            (AND (<= END-INDEX INDEX)
-                 (%RE-MATCH-FORWARD GROUP
-                                    INDEX
-                                    START-INDEX
-                                    (,compile-key ,key-name))
-                 (MAKE-MARK GROUP INDEX))))))))
-
-(define-backward-match char-match-backward
-  char
-  1
-  compile-char)
-
-(define-backward-match match-backward
-  string
-  (string-length string)
-  compile-string)
-
-(define (%re-match-forward group start end pattern)
-  (%re-finish group
-             ((ucode-primitive re-match-buffer)
-              pattern
-              (re-translation-table (ref-variable case-fold-search))
-              (syntax-table/entries (ref-variable syntax-table))
-              registers
-              group start end)))
-\f
-;;;; Quote
-
-(define re-quote-string
-  (let ((special (char-set #\[ #\] #\* #\. #\\ #\? #\+ #\^ #\$)))
-    (lambda (string)
-      (let ((end (string-length string)))
-       (let ((n
-              (let loop ((start 0) (n 0))
-                (let ((index
-                       (substring-find-next-char-in-set string start end
-                                                        special)))
-                  (if index
-                      (loop (1+ index) (1+ n))
-                      n)))))
-         (if (zero? n)
-             string
-             (let ((result (string-allocate (+ end n))))
-               (let loop ((start 0) (i 0))
-                 (let ((index
-                        (substring-find-next-char-in-set string start end
-                                                         special)))
-                   (if index
-                       (begin
-                         (substring-move-right! string start index result i)
-                         (let ((i (+ i (- index start))))
-                           (string-set! result i #\\)
-                           (string-set! result
-                                        (1+ i)
-                                        (string-ref string index))
-                           (loop (1+ index) (+ i 2))))
-                       (substring-move-right! string start end result i))))
-               result)))))))
-
-;;;; Char Skip
-
-(define (skip-chars-forward pattern #!optional start end limit?)
-  (let ((start (if (default-object? start) (current-point) start)))
-    (let ((end (if (default-object? end) (group-end start) end)))
-      (let ((limit? (if (default-object? limit?) 'LIMIT limit?)))
-       (if (not (mark<= start end))
-           (error "SKIP-CHARS-FORWARD: Marks incorrectly related" start end))
-       (let ((index
-              (%find-next-char-in-set (mark-group start)
-                                      (mark-index start)
-                                      (mark-index end)
-                                      (re-compile-char-set pattern true))))
-         (if index
-             (make-mark (mark-group start) index)
-             (limit-mark-motion limit? end)))))))
-
-(define (skip-chars-backward pattern #!optional start end limit?)
-  (let ((start (if (default-object? start) (current-point) start)))
-    (let ((end (if (default-object? end) (group-start start) end)))
-      (let ((limit? (if (default-object? limit?) 'LIMIT limit?)))
-       (if (not (mark>= start end))
-           (error "SKIP-CHARS-BACKWARD: Marks incorrectly related" start end))
-       (let ((index
-              (%find-previous-char-in-set (mark-group start)
-                                          (mark-index start)
-                                          (mark-index end)
-                                          (re-compile-char-set pattern
-                                                               true))))
-         (if index
-             (make-mark (mark-group start) index)
-             (limit-mark-motion limit? end)))))))
-\f
-;;;; String Operations
-
-(define (re-match-string-forward pattern string)
-  (re-match-substring-forward pattern string 0 (string-length string)))
-
-(define (re-match-substring-forward pattern string start end)
-  ((ucode-primitive re-match-substring)
-   (re-compile-pattern pattern false)
-   (re-translation-table false)
-   (syntax-table/entries (ref-variable syntax-table))
-   registers
-   string start end))
-
-(define (re-match-string-forward-ci pattern string)
-  (re-match-substring-forward-ci pattern string 0 (string-length string)))
-
-(define (re-match-substring-forward-ci pattern string start end)
-  ((ucode-primitive re-match-substring)
-   (re-compile-pattern pattern true)
-   (re-translation-table false)
-   (syntax-table/entries (ref-variable syntax-table))
-   registers
-   string start end))
-
-(define (re-search-string-forward pattern string)
-  (re-search-substring-forward pattern string 0 (string-length string)))
-
-(define (re-search-substring-forward pattern string start end)
-  ((ucode-primitive re-search-substring-forward)
-   (re-compile-pattern pattern false)
-   (re-translation-table false)
-   (syntax-table/entries (ref-variable syntax-table))
-   registers
-   string start end))
-
-(define (re-search-string-forward-ci pattern string)
-  (re-search-substring-forward-ci pattern string 0 (string-length string)))
-
-(define (re-search-substring-forward-ci pattern string start end)
-  ((ucode-primitive re-search-substring-forward)
-   (re-compile-pattern pattern true)
-   (re-translation-table false)
-   (syntax-table/entries (ref-variable syntax-table))
-   registers
-   string start end))
\ No newline at end of file
+  (let ((index
+        (re-search-buffer-backward pattern
+                                   (group-case-fold-search group)
+                                   (group-syntax-table group)
+                                   group end start)))
+    (and index
+        (make-mark group index))))
+
+(define (re-match-forward regexp start #!optional end case-fold-search)
+  (let ((group (mark-group start)))
+    (let ((case-fold-search
+          (if (default-object? case-fold-search)
+              (group-case-fold-search group)
+              case-fold-search)))
+      (let ((index
+            (re-match-buffer-forward
+             (re-compile-pattern regexp case-fold-search)
+             case-fold-search
+             (group-syntax-table group)
+             group
+             (mark-index start)
+             (if (default-object? end)
+                 (group-end-index group)
+                 (begin
+                   (if (not (and (eq? group (mark-group end))
+                                 (fix:<= (mark-index start)
+                                         (mark-index end))))
+                       (error "Marks incorrectly related:" start end))
+                   (mark-index end))))))
+       (and index
+            (make-mark group index))))))
\ No newline at end of file
index 081600cd1d7f14d980f424a3e2c3a3467d913614..9b0913cb817f3423dd8f6f9fc2bae36d4bce06f6 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/search.scm,v 1.147 1990/11/02 03:13:38 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/search.scm,v 1.148 1991/04/21 00:51:57 cph Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989, 1990 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
 
 ;;;; Search/Match Primitives
 
-;;; The operations in this file are for internal editor use only.  For
-;;; the user level search and match primitives, see the regular
-;;; expression search and match procedures.
-
 (declare (usual-integrations))
 \f
-;;;; Character Search
-#|
-(define (find-next-char start end char)
-  (if (not (mark<= start end))
-      (error "Marks incorrectly related: FIND-NEXT-CHAR" start end))
-  (let ((index (%find-next-char (mark-group start)
-                               (mark-index start)
-                               (mark-index end)
-                               char)))
-    (and index (make-mark (mark-group start) index))))
-
-(define (find-previous-char start end char)
-  (if (not (mark>= start end))
-      (error "Marks incorrectly related: FIND-PREVIOUS-CHAR" start end))
-  (let ((index (%find-previous-char (mark-group start)
-                                   (mark-index start)
-                                   (mark-index end)
-                                   char)))
-    (and index (make-mark (mark-group start) index))))
-|#
-(define (%find-next-newline group start end)
-  ;; Assume (FIX:<= START END)
-  (and (not (fix:= start end))
-       (let ((start (group-index->position group start true))
-            (end (group-index->position group end false)))
-        (let ((position
-               (if (and (fix:<= start (group-gap-start group))
-                        (fix:<= (group-gap-end group) end))
-                   (or (substring-find-next-char (group-text group)
-                                                 start
-                                                 (group-gap-start group)
-                                                 #\newline)
-                       (substring-find-next-char (group-text group)
-                                                 (group-gap-end group)
-                                                 end
-                                                 #\newline))
-                   (substring-find-next-char (group-text group)
-                                             start
-                                             end
-                                             #\newline))))
-          (and position
-               (group-position->index group position))))))
-
-(define (%find-previous-newline group start end)
-  ;; Assume (FIX:>= START END)
-  (and (not (fix:= start end))
-       (let ((start (group-index->position group start false))
-            (end (group-index->position group end true)))
-        (let ((position
-               (if (and (fix:<= end (group-gap-start group))
-                        (fix:<= (group-gap-end group) start))
-                   (or (substring-find-previous-char (group-text group)
-                                                     (group-gap-end group)
-                                                     start
-                                                     #\newline)
-                       (substring-find-previous-char (group-text group)
-                                                     end
-                                                     (group-gap-start group)
-                                                     #\newline))
-                   (substring-find-previous-char (group-text group)
-                                                 end
-                                                 start
-                                                 #\newline))))
-          (and position
-               (fix:+ (group-position->index group position) 1))))))
-\f
-;;;; Character-set Search
-#|
-(define ((char-set-forward-search char-set) start end #!optional limit?)
-  (or (find-next-char-in-set start end char-set)
-      (limit-mark-motion (and (not (default-object? limit?)) limit?) end)))
-
-(define ((char-set-backward-search char-set) start end #!optional limit?)
-  (or (find-previous-char-in-set start end char-set)
-      (limit-mark-motion (and (not (default-object? limit?)) limit?) end)))
-
-(define (find-next-char-in-set start end char-set)
-  (if (not (mark<= start end))
-      (error "Marks incorrectly related: FIND-NEXT-CHAR-IN-SET" start end))
-  (let ((index
-        (%find-next-char-in-set (mark-group start)
-                                (mark-index start)
-                                (mark-index end)
-                                char-set)))
-    (and index
-        (make-mark (mark-group start) index))))
-
-(define (find-previous-char-in-set start end char-set)
-  (if (not (mark>= start end))
-      (error "Marks incorrectly related: FIND-PREVIOUS-CHAR-IN-SET" start end))
-  (let ((index
-        (%find-previous-char-in-set (mark-group start)
-                                    (mark-index start)
-                                    (mark-index end)
-                                    char-set)))
+;;;; Character Search and Match
+
+(let-syntax
+    ((define-forward-search
+       (macro (name find-next)
+        `(DEFINE (,name GROUP START END CHAR)
+           ;; Assume (FIX:<= START END)
+           (AND (NOT (FIX:= START END))
+                (COND ((FIX:<= END (GROUP-GAP-START GROUP))
+                       (,find-next (GROUP-TEXT GROUP) START END CHAR))
+                      ((FIX:<= (GROUP-GAP-START GROUP) START)
+                       (LET ((POSITION
+                              (,find-next
+                               (GROUP-TEXT GROUP)
+                               (FIX:+ START (GROUP-GAP-LENGTH GROUP))
+                               (FIX:+ END (GROUP-GAP-LENGTH GROUP))
+                               CHAR)))
+                         (AND POSITION
+                              (FIX:- POSITION (GROUP-GAP-LENGTH GROUP)))))
+                      ((,find-next (GROUP-TEXT GROUP)
+                                   START
+                                   (GROUP-GAP-START GROUP)
+                                   CHAR))
+                      (ELSE
+                       (LET ((POSITION
+                              (,find-next (GROUP-TEXT GROUP)
+                                          (GROUP-GAP-END GROUP)
+                                          (FIX:+ END (GROUP-GAP-LENGTH GROUP))
+                                          CHAR)))
+                         (AND POSITION
+                              (FIX:- POSITION
+                                     (GROUP-GAP-LENGTH GROUP)))))))))))
+(define-forward-search group-find-next-char substring-find-next-char)
+(define-forward-search group-find-next-char-ci substring-find-next-char-ci)
+(define-forward-search group-find-next-char-in-set
+  substring-find-next-char-in-set))
+
+(let-syntax
+    ((define-backward-search
+       (macro (name find-previous)
+        `(DEFINE (,name GROUP START END CHAR)
+           ;; Assume (FIX:<= START END)
+           (AND (NOT (FIX:= START END))
+                (COND ((FIX:<= END (GROUP-GAP-START GROUP))
+                       (,find-previous (GROUP-TEXT GROUP) START END CHAR))
+                      ((FIX:<= (GROUP-GAP-START GROUP) START)
+                       (LET ((POSITION
+                              (,find-previous
+                               (GROUP-TEXT GROUP)
+                               (FIX:+ START (GROUP-GAP-LENGTH GROUP))
+                               (FIX:+ END (GROUP-GAP-LENGTH GROUP))
+                               CHAR)))
+                         (AND POSITION
+                              (FIX:- POSITION (GROUP-GAP-LENGTH GROUP)))))
+                      ((,find-previous (GROUP-TEXT GROUP)
+                                       (GROUP-GAP-END GROUP)
+                                       (FIX:+ END (GROUP-GAP-LENGTH GROUP))
+                                       CHAR)
+                       => (LAMBDA (POSITION)
+                            (FIX:- POSITION (GROUP-GAP-LENGTH GROUP))))
+                      (else
+                       (,find-previous (GROUP-TEXT GROUP)
+                                       START
+                                       (GROUP-GAP-START GROUP)
+                                       CHAR))))))))
+(define-backward-search group-find-previous-char substring-find-previous-char)
+(define-backward-search group-find-previous-char-ci
+  substring-find-previous-char-ci)
+(define-backward-search group-find-previous-char-in-set
+  substring-find-previous-char-in-set))
+
+(define-integrable (%find-next-newline group start end)
+  (group-find-next-char group start end #\newline))
+
+(define-integrable (%find-previous-newline group start end)
+  ;; Note reversal of index arguments here.
+  (let ((index (group-find-previous-char group end start #\newline)))
     (and index
-        (make-mark (mark-group start) index))))
-|#
-(define (%find-next-char-in-set group start end char-set)
-  (and (not (= start end))
-       (let ((start (group-index->position group start true))
-            (end (group-index->position group end false))
-            (gap-start (group-gap-start group))
-            (gap-end (group-gap-end group))
-            (text (group-text group)))
-        (let ((pos
-               (if (and (<= start gap-start)
-                        (<= gap-end end))
-                   (or (substring-find-next-char-in-set text start gap-start
-                                                        char-set)
-                       (substring-find-next-char-in-set text gap-end end
-                                                        char-set))
-                   (substring-find-next-char-in-set text start end
-                                                    char-set))))
-          (and pos (group-position->index group pos))))))
-
-(define (%find-previous-char-in-set group start end char-set)
-  (and (not (= start end))
-       (let ((start (group-index->position group start false))
-            (end (group-index->position group end true))
-            (gap-start (group-gap-start group))
-            (gap-end (group-gap-end group))
-            (text (group-text group)))
-        (let ((pos
-               (if (and (<= end gap-start)
-                        (<= gap-end start))
-                   (or (substring-find-previous-char-in-set text gap-end start
-                                                            char-set)
-                       (substring-find-previous-char-in-set text end gap-start
-                                                            char-set))
-                   (substring-find-previous-char-in-set text end start
-                                                        char-set))))
-          (and pos (1+ (group-position->index group pos)))))))
+        (fix:+ index 1))))
 \f
-;;;; String Search
-#|
-(define (find-next-string start-mark end-mark string)
-  (find-next-substring start-mark end-mark string 0 (string-length string)))
-
-(define (find-next-substring start-mark end-mark string start end)
-  (if (not (mark<= start-mark end-mark))
-      (error "Marks incorrectly related: FIND-NEXT-SUBSTRING"
-            start-mark end-mark))
-  (if (= start end)
-      start-mark
-      (let ((index
-            (%find-next-substring (mark-group start-mark)
-                                  (mark-index start-mark)
-                                  (mark-index end-mark)
-                                  string start end)))
-       (and index (make-mark (mark-group start-mark) index)))))
-
-(define (%find-next-string group start-index end-index string)
-  (%find-next-substring group start-index end-index
-                       string 0 (string-length string)))
-
-(define (find-previous-string start-mark end-mark string)
-  (find-previous-substring start-mark end-mark
-                          string 0 (string-length string)))
-
-(define (find-previous-substring start-mark end-mark string start end)
-  (if (not (mark>= start-mark end-mark))
-      (error "Marks incorrectly related: FIND-PREVIOUS-SUBSTRING"
-            start-mark end-mark))
-  (if (= start end)
-      end-mark
-      (let ((index
-            (%find-previous-substring (mark-group start-mark)
-                                      (mark-index start-mark)
-                                      (mark-index end-mark)
-                                      string start end)))
-       (and index (make-mark (mark-group start-mark) index)))))
-
-(define (%find-previous-string group start-index end-index string)
-  (%find-previous-substring group start-index end-index
-                           string 0 (string-length string)))
-
-(define (%find-next-substring group start-index end-index string start end)
-  (let ((char (string-ref string start))
-       (bound (- end-index (-1+ (- end start)))))
-    (define (loop first)
-      (and first
-          (if (%match-next-substring group first end-index string start end)
-              first
-              (and (< first bound)
-                   (loop (%find-next-char group (1+ first) bound char))))))
-    (and (< start-index bound)
-        (loop (%find-next-char group start-index bound char)))))
-
-(define (%find-previous-substring group start-index end-index string start end)
-  (let ((char (string-ref string (-1+ end)))
-       (bound (+ end-index (-1+ (- end start)))))
-    (define (loop first)
-      (and first
-          (if (%match-previous-substring group first end-index
-                                         string start end)
-              first
-              (and (> first bound)
-                   (loop (%find-previous-char group (-1+ first) bound
-                                              char))))))
-    (and (> start-index bound)
-        (loop (%find-previous-char group start-index bound char)))))
+(define (char-search-forward char start end #!optional case-fold-search)
+  (let ((group (mark-group start))
+       (start-index (mark-index start))
+       (end-index (mark-index end)))
+    (if (not (and (eq? group (mark-group end))
+                 (fix:<= start-index end-index)))
+       (error "Marks incorrectly related:" start end))
+    (let ((index
+          (if (if (default-object? case-fold-search)
+                  (group-case-fold-search group)
+                  case-fold-search)
+              (group-find-next-char-ci group start-index end-index char)
+              (group-find-next-char group start-index end-index char))))
+      (and index
+          (make-mark group (fix:+ index 1))))))
+
+(define (char-search-backward char start end #!optional case-fold-search)
+  (let ((group (mark-group start))
+       (start-index (mark-index start))
+       (end-index (mark-index end)))
+    (if (not (and (eq? group (mark-group end))
+                 (fix:>= start-index end-index)))
+       (error "Marks incorrectly related:" start end))
+    (let ((index
+          (if (if (default-object? case-fold-search)
+                  (group-case-fold-search group)
+                  case-fold-search)
+              (group-find-next-char-ci group end-index start-index char)
+              (group-find-next-char group end-index start-index char))))
+      (and index
+          (make-mark group index)))))
+
+(define (char-match-forward char mark #!optional case-fold-search)
+  (let ((group (mark-group mark))
+       (index (mark-index mark)))
+    (and (not (group-end-index? group index))
+        (if (if (default-object? case-fold-search)
+                (group-case-fold-search group)
+                case-fold-search)
+            (char-ci=? char (group-right-char group index))
+            (char=? char (group-right-char group index))))))
+
+(define (char-match-backward char mark #!optional case-fold-search)
+  (let ((group (mark-group mark))
+       (index (mark-index mark)))
+    (and (not (group-start-index? group index))
+        (if (if (default-object? case-fold-search)
+                (group-case-fold-search group)
+                case-fold-search)
+            (char-ci=? char (group-left-char group index))
+            (char=? char (group-left-char group index))))))
+
+(define (skip-chars-forward pattern #!optional start end limit?)
+  (let ((start (if (default-object? start) (current-point) start)))
+    (let ((end (if (default-object? end) (group-end start) end)))
+      (let ((limit? (if (default-object? limit?) 'LIMIT limit?)))
+       (if (not (mark<= start end))
+           (error "SKIP-CHARS-FORWARD: Marks incorrectly related" start end))
+       (let ((index
+              (group-find-next-char-in-set (mark-group start)
+                                           (mark-index start)
+                                           (mark-index end)
+                                           (re-compile-char-set pattern
+                                                                true))))
+         (if index
+             (make-mark (mark-group start) index)
+             (limit-mark-motion limit? end)))))))
+
+(define (skip-chars-backward pattern #!optional start end limit?)
+  (let ((start (if (default-object? start) (current-point) start)))
+    (let ((end (if (default-object? end) (group-start start) end)))
+      (let ((limit? (if (default-object? limit?) 'LIMIT limit?)))
+       (if (not (mark>= start end))
+           (error "SKIP-CHARS-BACKWARD: Marks incorrectly related" start end))
+       (let ((index
+              (group-find-previous-char-in-set (mark-group start)
+                                               (mark-index end)
+                                               (mark-index start)
+                                               (re-compile-char-set pattern
+                                                                    true))))
+         (if index
+             (make-mark (mark-group start) (fix:+ index 1))
+             (limit-mark-motion limit? end)))))))
 \f
-;;;; String Match
-
-(define (match-next-strings start end strings)
-  (let loop ((strings strings))
-    (and (not (null? strings))
-        (or (match-next-string start end (car strings))
-            (loop (cdr strings))))))
-
-(define (match-next-string start end string)
-  (match-next-substring start end string 0 (string-length string)))
-
-(define (match-next-substring start-mark end-mark string start end)
-  (if (not (mark<= start-mark end-mark))
-      (error "marks incorrectly related" start-mark end-mark))
-  (let ((index
-        (%match-next-substring (mark-group start-mark)
-                               (mark-index start-mark)
-                               (mark-index end-mark)
-                               string start end)))
-    (and index
-        (make-mark (mark-group start-mark) index))))
-
-(define (match-previous-strings start end strings)
-  (let loop ((strings strings))
-    (and (not (null? strings))
-        (or (match-previous-string start end (car strings))
-            (loop (cdr strings))))))
-
-(define (match-previous-string start end string)
-  (match-previous-substring start end string 0 (string-length string)))
-
-(define (match-previous-substring start-mark end-mark string start end)
-  (if (not (mark>= start-mark end-mark))
-      (error "marks incorrectly related" start-mark end-mark))
-  (let ((index
-        (%match-previous-substring (mark-group start-mark)
-                                   (mark-index start-mark)
-                                   (mark-index end-mark)
-                                   string start end)))
-    (and index
-        (make-mark (mark-group start-mark) index))))
-
-(define (%match-next-string group start-index end-index string)
-  (%match-next-substring group start-index end-index
-                        string 0 (string-length string)))
-
-(define (%match-previous-string group start-index end-index string)
-  (%match-previous-substring group start-index end-index
-                            string 0 (string-length string)))
-
-(define (%match-next-substring group start-index end-index string start end)
-  (let ((end-index* (+ start-index (- end start))))
-    (and (<= end-index* end-index)
-        (%%match-substring group start-index end-index* string start end)
-        end-index*)))
-
-(define (%match-previous-substring group start-index end-index
-                                  string start end)
-  (let ((end-index* (- start-index (- end start))))
-    (and (>= end-index* end-index)
-        (%%match-substring group end-index* start-index string start end)
-        end-index*)))
-
-(define (%%match-substring group start-index end-index string start end)
-  (and (not (= start-index end-index))
-       (let ((start* (group-index->position group start-index true))
-            (end* (group-index->position group end-index false))
-            (gap-start (group-gap-start group))
-            (gap-end (group-gap-end group))
-            (text (group-text group)))
-        (if (and (<= start* gap-start) (<= gap-end end*))
-            (let ((split (+ start (- gap-start start*))))
-              (and (substring-ci=? text start* gap-start string start split)
-                   (substring-ci=? text gap-end end* string split end)))
-            (substring-ci=? text start* end* string start end)))))
+;;;; String Search and Match
+
+(define (group-match-substring-forward group start end
+                                      string string-start string-end)
+  (let ((text (group-text group))
+       (gap-start (group-gap-start group))
+       (gap-length (group-gap-length group)))
+    (let ((match
+          (lambda (s1 e1 s2)
+            (let loop ((i1 s1) (i2 s2))
+              (if (or (fix:= i1 e1)
+                      (fix:= i2 string-end)
+                      (not (char=? (string-ref text i1)
+                                   (string-ref string i2))))
+                  i1
+                  (loop (fix:+ i1 1) (fix:+ i2 1)))))))
+      (cond ((fix:<= end gap-start)
+            (match start end string-start))
+           ((fix:<= gap-start start)
+            (fix:- (match (fix:+ start gap-length)
+                          (fix:+ end gap-length)
+                          string-start)
+                   gap-length))
+           (else
+            (let ((index (match start gap-start string-start)))
+              (if (fix:= index gap-start)
+                  (fix:- (match (fix:+ gap-start gap-length)
+                                (fix:+ end gap-length)
+                                (fix:+ string-start (fix:- gap-start start)))
+                         gap-length)
+                  index)))))))
+
+(define (group-match-substring-backward group start end
+                                       string string-start string-end)
+  (let ((text (group-text group))
+       (gap-start (group-gap-start group))
+       (gap-length (group-gap-length group)))
+    (let ((match
+          (lambda (s1 e1 e2)
+            (let loop ((i1 (fix:- e1 1)) (i2 (fix:- e2 1)))
+              (cond ((not (char=? (string-ref text i1)
+                                  (string-ref string i2)))
+                     (fix:+ i1 1))
+                    ((or (fix:= i1 s1) (fix:= i2 string-start))
+                     i1)
+                    (else
+                     (loop (fix:- i1 1) (fix:- i2 1))))))))
+      (cond ((or (fix:= start end) (fix:= string-start string-end))
+            end)
+           ((fix:<= end gap-start)
+            (match start end string-end))
+           ((fix:<= gap-start start)
+            (fix:- (match (fix:+ start gap-length)
+                          (fix:+ end gap-length)
+                          string-end)
+                   gap-length))
+           (else
+            (let ((index
+                   (fix:- (match (fix:+ gap-start gap-length)
+                                 (fix:+ end gap-length)
+                                 string-end)
+                          gap-length)))
+              (if (fix:= index gap-start)
+                  (match start
+                         gap-start
+                         (fix:- string-end (fix:- end gap-start)))
+                  index)))))))
 \f
-;;;; Character Match
-
-(define (match-next-char start end char)
-  (%match-next-char (mark-group start)
-                   (mark-index start)
-                   (mark-index end)
-                   char))
-
-(define (%match-next-char group start end char)
-  (and (< start end)
-       (char=? char (group-right-char group start))
-       (1+ start)))
-
-(define (match-previous-char start end char)
-  (%match-previous-char (mark-group start)
-                       (mark-index start)
-                       (mark-index end)
-                       char))
-
-(define (%match-previous-char group start end char)
-  (and (> start end)
-       (char=? char (group-left-char group start))
-       (-1+ start)))
-
-(define (match-next-char-in-set start end char-set)
-  (%match-next-char-in-set (mark-group start)
-                          (mark-index start)
-                          (mark-index end)
-                          char-set))
-
-(define (%match-next-char-in-set group start end char-set)
-  (and (< start end)
-       (char-set-member? char-set (group-right-char group start))
-       (1+ start)))
-
-(define (match-previous-char-in-set start end char-set)
-  (%match-previous-char-in-set (mark-group start)
-                              (mark-index start)
-                              (mark-index end)
-                              char-set))
-
-(define (%match-previous-char-in-set group start end char-set)
-  (and (> start end)
-       (char-set-member? char-set (group-left-char group start))
-       (-1+ start)))
-|#
\ No newline at end of file
+(define (group-match-substring-forward-ci group start end
+                                         string string-start string-end)
+  (let ((text (group-text group))
+       (gap-start (group-gap-start group))
+       (gap-length (group-gap-length group)))
+    (let ((match
+          (lambda (s1 e1 s2)
+            (let loop ((i1 s1) (i2 s2))
+              (if (or (fix:= i1 e1)
+                      (fix:= i2 string-end)
+                      (not (char-ci=? (string-ref text i1)
+                                      (string-ref string i2))))
+                  i1
+                  (loop (fix:+ i1 1) (fix:+ i2 1)))))))
+      (cond ((fix:<= end gap-start)
+            (match start end string-start))
+           ((fix:<= gap-start start)
+            (fix:- (match (fix:+ start gap-length)
+                          (fix:+ end gap-length)
+                          string-start)
+                   gap-length))
+           (else
+            (let ((index (match start gap-start string-start)))
+              (if (fix:= index gap-start)
+                  (fix:- (match (fix:+ gap-start gap-length)
+                                (fix:+ end gap-length)
+                                (fix:+ string-start (fix:- gap-start start)))
+                         gap-length)
+                  index)))))))
+
+(define (group-match-substring-backward-ci group start end
+                                          string string-start string-end)
+  (let ((text (group-text group))
+       (gap-start (group-gap-start group))
+       (gap-length (group-gap-length group)))
+    (let ((match
+          (lambda (s1 e1 e2)
+            (let loop ((i1 (fix:- e1 1)) (i2 (fix:- e2 1)))
+              (cond ((not (char-ci=? (string-ref text i1)
+                                     (string-ref string i2)))
+                     (fix:+ i1 1))
+                    ((or (fix:= i1 s1) (fix:= i2 string-start))
+                     i1)
+                    (else
+                     (loop (fix:- i1 1) (fix:- i2 1))))))))
+      (cond ((or (fix:= start end) (fix:= string-start string-end))
+            end)
+           ((fix:<= end gap-start)
+            (match start end string-end))
+           ((fix:<= gap-start start)
+            (fix:- (match (fix:+ start gap-length)
+                          (fix:+ end gap-length)
+                          string-end)
+                   gap-length))
+           (else
+            (let ((index
+                   (fix:- (match (fix:+ gap-start gap-length)
+                                 (fix:+ end gap-length)
+                                 string-end)
+                          gap-length)))
+              (if (fix:= index gap-start)
+                  (match start
+                         gap-start
+                         (fix:- string-end (fix:- end gap-start)))
+                  index)))))))
+\f
+(define (match-forward string mark #!optional case-fold-search)
+  (let ((group (mark-group mark))
+       (start (mark-index mark))
+       (length (string-length string)))
+    (let ((end (fix:+ start length)))
+      (and (fix:<= end (group-end-index group))
+          (fix:= (if (if (default-object? case-fold-search)
+                         (group-case-fold-search group)
+                         case-fold-search)
+                     (group-match-substring-forward-ci group start end
+                                                       string 0 length)
+                     (group-match-substring-forward group start end
+                                                    string 0 length))
+                 end)
+          (make-mark group end)))))
+
+(define (match-backward string mark #!optional case-fold-search)
+  (let ((group (mark-group mark))
+       (end (mark-index mark))
+       (length (string-length string)))
+    (let ((start (fix:- end length)))
+      (and (fix:>= start (group-start-index group))
+          (fix:= (if (if (default-object? case-fold-search)
+                         (group-case-fold-search group)
+                         case-fold-search)
+                     (group-match-substring-backward-ci group start end
+                                                        string 0 length)
+                     (group-match-substring-backward group start end
+                                                     string 0 length))
+                 start)
+          (make-mark group start)))))
\ No newline at end of file
index 8e6a2df2791372ffbe5f75039046d6d047701f6c..0e20d873dca65fa079cbfec82e47d9283cbdde08 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/sercom.scm,v 1.55 1989/08/08 10:06:29 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/sercom.scm,v 1.56 1991/04/21 00:52:01 cph Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
@@ -231,7 +231,10 @@ Special characters:
 (define (character-search forward?)
   (define (char-search char)
     (search-finish
-     ((if forward? char-search-forward char-search-backward) char)))
+     (let ((point (current-point)))
+       (if forward?
+          (char-search-forward char point (group-end point))
+          (char-search-backward char point (group-start point))))))
 
   (define (string-search operator)
     (search-finish (operator (ref-variable search-last-string))))
index 666fe9789e8b7fe0028e7b7d12c3c3d269eefc26..1647f84e8a43c40347e79bbbcc8817b8c38ba7e0 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/shell.scm,v 1.1 1991/03/16 00:00:00 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/shell.scm,v 1.2 1991/04/21 00:52:05 cph Exp $
 
 Copyright (c) 1991 Massachusetts Institute of Technology
 
@@ -155,13 +155,20 @@ Otherwise, one argument `-i' is passed to the shell."
 
 (define (shell-directory-tracker string)
   (if (ref-variable shell-dirtrack?)
-      (let ((start (re-match-string-forward "^\\s *" string))
+      (let ((start
+            (re-match-string-forward (re-compile-pattern "^\\s *" false)
+                                     false
+                                     (ref-variable syntax-table)
+                                     string))
            (end (string-length string)))
        (let ((try
               (let ((match
                      (lambda (regexp start)
-                       (re-match-substring-forward regexp
-                                                   string start end))))
+                       (re-match-substring-forward
+                        (re-compile-pattern regexp false)
+                        false
+                        (ref-variable syntax-table)
+                        string start end))))
                 (lambda (command)
                   (let ((eoc (match command start)))
                     (cond ((not eoc)
index 6d3ab64773f8dda0e4785002515b2275f1cc45ef..774593fc2991f9f85c3be3d1ad3a113205302e96 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/simple.scm,v 1.34 1991/04/11 03:04:45 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/simple.scm,v 1.35 1991/04/21 00:52:09 cph Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989-91 Massachusetts Institute of Technology
 ;;;
       (if (group-end-index? group index)
          (editor-error "Attempt to delete past end of buffer")
          (group-delete-right-char! group index)))))
-
+\f
 (define (insert-string string #!optional point)
   (let ((point (if (default-object? point) (current-point) point)))
     (group-insert-string! (mark-group point) (mark-index point) string)))
   (let ((point (if (default-object? point) (current-point) point)))
     (group-insert-substring! (mark-group point) (mark-index point)
                             string start end)))
+
+(define (insert-region start end #!optional point)
+  (if (not (mark<= start end))
+      (error "Marks incorrectly related:" start end))
+  (let ((point (if (default-object? point) (current-point) point)))
+    (if (mark~ start point)
+       (error "Can't copy to same group:" start))
+    (let ((group (mark-group start))
+         (start (mark-index start))
+         (end (mark-index end)))
+      (let ((text (group-text group))
+           (gap-start (group-gap-start group))
+           (gap-end (group-gap-end group))
+           (gap-length (group-gap-length group)))
+       (cond ((<= end gap-start)
+              (group-insert-substring! (mark-group point)
+                                       (mark-index point)
+                                       text
+                                       start
+                                       end))
+             ((<= gap-end start)
+              (group-insert-substring! (mark-group point)
+                                       (mark-index point)
+                                       text
+                                       (+ start gap-length)
+                                       (+ end gap-length)))
+             (else
+              (let ((point (mark-left-inserting-copy point)))
+                (group-insert-substring! (mark-group point)
+                                         (mark-index point)
+                                         text
+                                         start
+                                         gap-start)
+                (group-insert-substring! (mark-group point)
+                                         (mark-index point)
+                                         text
+                                         gap-end
+                                         (+ end gap-length))
+                (mark-temporary! point))))))))
 \f
 (define (extract-string mark #!optional point)
   (let ((point (if (default-object? point) (current-point) point)))
index f14f861c130b7242f4d6c7c1fd90b26218dbe559..e41565d95f9e8cc7f2e7ff6ae61a22958823dd35 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/struct.scm,v 1.76 1991/04/02 19:56:05 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/struct.scm,v 1.77 1991/04/21 00:52:14 cph Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989-91 Massachusetts Institute of Technology
 ;;;
   (vector-set! group group-index:modified? sense))
 
 (define-integrable (set-group-point! group point)
-  (vector-set! group group-index:point (mark-left-inserting point)))
+  (vector-set! group group-index:point (mark-left-inserting-copy point)))
 
 (define (with-narrowed-region! region thunk)
   (with-group-text-clipped! (region-group region)
               group-index:clip-daemons
               (delq! daemon (vector-ref group group-index:clip-daemons))))
 
+(define (group-local-ref group variable)
+  (variable-local-value (let ((buffer (group-buffer group)))
+                         (if (not buffer)
+                             (error:bad-range-argument group
+                                                       'GROUP-LOCAL-REF))
+                         buffer)
+                       variable))
+
 (define-integrable (group-tab-width group)
-  (variable-local-value (group-buffer group) (ref-variable-object tab-width)))
+  (group-local-ref group (ref-variable-object tab-width)))
+
+(define-integrable (group-case-fold-search group)
+  (group-local-ref group (ref-variable-object case-fold-search)))
+
+(define-integrable (group-syntax-table group)
+  (group-local-ref group (ref-variable-object syntax-table)))
 \f
 ;;;; Marks
 
                                            mark
                                            (group-marks group)))))
   mark)
+
+(define-integrable (mark-local-ref mark variable)
+  (group-local-ref (mark-group mark) variable))
 \f
 (define-integrable (mark~ mark1 mark2)
   (eq? (mark-group mark1) (mark-group mark2)))
index eee28162a8c075b693d97d53b28bcb1548754c61..8daecb05d57d2d29dd1a06baef785d87612f37c1 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/things.scm,v 1.79 1991/03/22 00:33:08 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/things.scm,v 1.80 1991/04/21 00:52:20 cph Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989-91 Massachusetts Institute of Technology
 ;;;
 (define (horizontal-space-end mark)
   (skip-chars-forward " \t" mark (line-end mark 0)))
 
-(define (compute-horizontal-space c1 c2 receiver)
+(define (compute-horizontal-space c1 c2 tab-width)
   ;; Compute the number of tabs/spaces required to fill from column C1
   ;; to C2 with whitespace.  It is assumed that C1 >= C2.
-  (if (ref-variable indent-tabs-mode)
-      (let ((tab-width (ref-variable tab-width)))
-       (let ((qr1 (integer-divide c1 tab-width))
-             (qr2 (integer-divide c2 tab-width)))
-         (if (> (integer-divide-quotient qr1) (integer-divide-quotient qr2))
-             (receiver (- (integer-divide-quotient qr1)
-                          (integer-divide-quotient qr2))
-                       (integer-divide-remainder qr1))
-             (receiver 0
-                       (- (integer-divide-remainder qr1)
-                          (integer-divide-remainder qr2))))))
-      (receiver 0 (- c2 c1))))
-
-(define (insert-horizontal-space target-column #!optional point)
-  (let ((point
-        (if (default-object? point)
-            (current-point)
-            (mark-left-inserting point))))
-    (compute-horizontal-space target-column (mark-column point)
+  (if tab-width
+      (let ((qr1 (integer-divide c1 tab-width))
+           (qr2 (integer-divide c2 tab-width)))
+       (if (> (integer-divide-quotient qr1) (integer-divide-quotient qr2))
+           (values (- (integer-divide-quotient qr1)
+                      (integer-divide-quotient qr2))
+                   (integer-divide-remainder qr1))
+           (values 0
+                   (- (integer-divide-remainder qr1)
+                      (integer-divide-remainder qr2)))))
+      (values 0 (- c2 c1))))
+
+(define (insert-horizontal-space target-column #!optional point tab-width)
+  (let* ((point
+         (mark-left-inserting-copy
+          (if (default-object? point) (current-point) point)))
+        (tab-width
+         (if (default-object? tab-width)
+             (let ((buffer (mark-buffer point)))
+               (and buffer
+                    (variable-local-value
+                     buffer
+                     (ref-variable-object indent-tabs-mode))
+                    (variable-local-value
+                     buffer
+                     (ref-variable-object tab-width))))
+             tab-width)))
+    (with-values
+       (lambda ()
+         (compute-horizontal-space target-column
+                                   (mark-column point)
+                                   tab-width))
       (lambda (n-tabs n-spaces)
-       (insert-chars #\Tab n-tabs point)
-       (insert-chars #\Space n-spaces point)))))
+       (insert-chars #\tab n-tabs point)
+       (insert-chars #\space n-spaces point)))
+    (mark-temporary! point)))
 
 (define (delete-horizontal-space #!optional point)
   (let ((point (if (default-object? point) (current-point) point)))
index b37bd1d912c4922280bd7c164e3d0f5e70d65d80..6d89ff01cc3a9d6b3e11b2762a58e9ccba3e1dc1 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/undo.scm,v 1.46 1991/04/12 23:23:41 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/undo.scm,v 1.47 1991/04/21 00:52:26 cph Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -306,31 +306,37 @@ A numeric argument serves as a repeat count."
   "p"
   (lambda (argument)
     (if (positive? argument)
-       (let ((buffer (current-buffer)))
-         (let ((undo-data (group-undo-data (buffer-group buffer))))
-           (if (not undo-data)
-               (editor-error "Undo information not kept for this buffer"))
-           (without-interrupts
-            (lambda ()
-              (command-message-receive undo-command-tag
-                (lambda ()
-                  (if (= -1 last-undone-record)
-                      (editor-error cant-undo-more)))
-                (lambda ()
-                  (set! number-records-undone 0)
-                  (set! number-chars-left
-                        (string-length (undo-data-chars undo-data)))
-                  (set! last-undone-record (undo-data-next-record undo-data))
-                  (set! last-undone-char (undo-data-next-char undo-data))
-                  ;; This accounts for the boundary that is inserted
-                  ;; just before this command is called.
-                  (set! argument (+ argument 1))
-                  unspecific))
-              (undo-n-records undo-data
-                              buffer
-                              (count-records-to-undo undo-data argument))))
-           (set-command-message! undo-command-tag)
-           (temporary-message "Undo!"))))))
+       (begin
+         (let ((buffer (current-buffer)))
+           (let ((auto-saved? (buffer-auto-saved? buffer))
+                 (undo-data (group-undo-data (buffer-group buffer))))
+             (if (not undo-data)
+                 (editor-error "Undo information not kept for this buffer"))
+             (without-interrupts
+              (lambda ()
+                (command-message-receive undo-command-tag
+                  (lambda ()
+                    (if (= -1 last-undone-record)
+                        (editor-error cant-undo-more)))
+                  (lambda ()
+                    (set! number-records-undone 0)
+                    (set! number-chars-left
+                          (string-length (undo-data-chars undo-data)))
+                    (set! last-undone-record
+                          (undo-data-next-record undo-data))
+                    (set! last-undone-char (undo-data-next-char undo-data))
+                    ;; This accounts for the boundary that is inserted
+                    ;; just before this command is called.
+                    (set! argument (+ argument 1))
+                    unspecific))
+                (undo-n-records undo-data
+                                buffer
+                                (count-records-to-undo undo-data
+                                                       argument))))
+             (if (and auto-saved? (not (buffer-modified? buffer)))
+                 (delete-auto-save-file! buffer))))
+         (set-command-message! undo-command-tag)
+         (temporary-message "Undo!")))))
 \f
 (define (count-records-to-undo undo-data argument)
   (let ((records (undo-data-records undo-data)))
@@ -382,8 +388,10 @@ A numeric argument serves as a repeat count."
               (let ((end (+ start (undo-record-length record))))
                 (if (> end (group-end-index group))
                     (editor-error outside-visible-range))
-                (group-delete! group start end)))
+                (group-delete! group start end))
+              (set-current-point! (make-mark group start)))
              ((INSERT)
+              (set-current-point! (make-mark group start))
               (let ((ic (- last-undone-char (undo-record-length record))))
                 (if (>= ic 0)
                     (begin
@@ -401,7 +409,7 @@ A numeric argument serves as a repeat count."
                         (buffer-modification-time buffer))
                   (buffer-not-modified! buffer)))
              ((BOUNDARY NOT-UNDOABLE)
-              (set-current-point! (make-mark group start)))
+              unspecific)
              (else
               (error "Losing undo record type" (undo-record-type record))))))
        (set! last-undone-record ir)))))
\ No newline at end of file
index 11e397d303231a3ca454eb0615ed93d126b28bd2..50a087701452b7217a61d9eec2ca38393edf422f 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/unix.scm,v 1.14 1991/04/13 03:58:36 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/unix.scm,v 1.15 1991/04/21 00:52:35 cph Exp $
 ;;;
 ;;;    Copyright (c) 1989-91 Massachusetts Institute of Technology
 ;;;
@@ -284,6 +284,20 @@ Includes the new backup.  Must be > 0"
 (define-integrable (os/filename-as-directory filename)
   (string-append filename "/"))
 
+(define (os/filename-directory filename)
+  (let ((end (string-length filename)))
+    (let ((index (substring-find-previous-char filename 0 end #\/)))
+      (if index
+         (substring filename 0 (+ index 1))
+         "./"))))
+
+(define (os/filename-non-directory filename)
+  (let ((end (string-length filename)))
+    (let ((index (substring-find-previous-char filename 0 end #\/)))
+      (if index
+         (substring filename (+ index 1) end)
+         filename))))
+
 (define (os/completion-ignored-extensions)
   (list-copy
    '(".o" ".elc" "~" ".bin" ".lbin" ".fasl"
@@ -308,7 +322,7 @@ Includes the new backup.  Must be > 0"
 
 (define (os/init-file-name)
   "~/.edwin")
-
+\f
 (define os/find-file-initialization-filename
   (let ((name-path (string->pathname ".edwin-ffi")))
     (lambda (pathname)
index 1748bb3826256ca64dc2b71d9c2052e1b996ffbb..465311ffccac3303b87b05a759f0019e62c1f730 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/utils.scm,v 1.21 1991/02/15 18:14:14 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/utils.scm,v 1.22 1991/04/21 00:52:42 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
 
 (define (pathname=? x y)
   (string=? (pathname->string x)
-           (pathname->string y)))
\ No newline at end of file
+           (pathname->string y)))
+
+(define (string-or-false? object)
+  ;; Useful as a type for option variables.
+  (or (false? object)
+      (string? object)))
\ No newline at end of file
index 0b636a680e5c62807bbb8ec509e89cbf13ac3550..7654a637c45dade61fb83a48f6f5d5e960c9d7a7 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/rgxcmp.scm,v 1.105 1991/03/15 23:28:50 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/rgxcmp.scm,v 1.106 1991/04/21 00:51:52 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-91 Massachusetts Institute of Technology
 ;;;
                     (let ((j (fix:+ i 255)))
                       (substring-move-right! string i j result (fix:+ p 2))
                       (loop (fix:- n 255) j (fix:+ p 257)))))))))))
+
+(define re-quote-string
+  (let ((special (char-set #\[ #\] #\* #\. #\\ #\? #\+ #\^ #\$)))
+    (lambda (string)
+      (let ((end (string-length string)))
+       (let ((n
+              (let loop ((start 0) (n 0))
+                (let ((index
+                       (substring-find-next-char-in-set string start end
+                                                        special)))
+                  (if index
+                      (loop (1+ index) (1+ n))
+                      n)))))
+         (if (zero? n)
+             string
+             (let ((result (string-allocate (+ end n))))
+               (let loop ((start 0) (i 0))
+                 (let ((index
+                        (substring-find-next-char-in-set string start end
+                                                         special)))
+                   (if index
+                       (begin
+                         (substring-move-right! string start index result i)
+                         (let ((i (+ i (- index start))))
+                           (string-set! result i #\\)
+                           (string-set! result
+                                        (1+ i)
+                                        (string-ref string index))
+                           (loop (1+ index) (+ i 2))))
+                       (substring-move-right! string start end result i))))
+               result)))))))
 \f
 ;;;; Char-Set Compiler