summaryrefslogtreecommitdiffstats
path: root/source/ap/vim/patches/7.2.191
diff options
context:
space:
mode:
Diffstat (limited to 'source/ap/vim/patches/7.2.191')
-rw-r--r--source/ap/vim/patches/7.2.1913705
1 files changed, 3705 insertions, 0 deletions
diff --git a/source/ap/vim/patches/7.2.191 b/source/ap/vim/patches/7.2.191
new file mode 100644
index 000000000..f9c33571d
--- /dev/null
+++ b/source/ap/vim/patches/7.2.191
@@ -0,0 +1,3705 @@
+To: vim-dev@vim.org
+Subject: Patch 7.2.191
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.191
+Problem: Mzscheme interface doesn't work on Ubuntu.
+Solution: Change autoconf rules. Define missing macro. Some changes to
+ avoid gcc warnings. Remove per-buffer namespace. (Sergey Khorev)
+Files: runtime/doc/if_mzsch.txt, src/Makefile, src/Make_ming.mak,
+ src/Make_mvc.mak, src/auto/configure, src/configure.in,
+ src/config.mk.in, src/eval.c, src/if_mzsch.c, src/if_mzsch.h,
+ src/main.c, src/proto/if_mzsch.pro
+
+
+*** ../vim-7.2.190/runtime/doc/if_mzsch.txt 2008-08-09 19:36:48.000000000 +0200
+--- runtime/doc/if_mzsch.txt 2009-05-26 18:49:53.000000000 +0200
+***************
+*** 1,4 ****
+! *if_mzsch.txt* For Vim version 7.2. Last change: 2008 Jun 28
+
+
+ VIM REFERENCE MANUAL by Sergey Khorev
+--- 1,4 ----
+! *if_mzsch.txt* For Vim version 7.2. Last change: 2009 May 26
+
+
+ VIM REFERENCE MANUAL by Sergey Khorev
+***************
+*** 42,51 ****
+
+ *:mzfile* *:mzf*
+ :[range]mzf[ile] {file} Execute the MzScheme script in {file}. {not in Vi}
+- All statements are executed in the namespace of the
+- buffer that was current during :mzfile start.
+- If you want to access other namespaces, use
+- 'parameterize'.
+
+ All of these commands do essentially the same thing - they execute a piece of
+ MzScheme code, with the "current range" set to the given line
+--- 42,47 ----
+***************
+*** 54,61 ****
+ In the case of :mzscheme, the code to execute is in the command-line.
+ In the case of :mzfile, the code to execute is the contents of the given file.
+
+- Each buffer has its own MzScheme namespace. Global namespace is bound to
+- the "global-namespace" value from the 'vimext' module.
+ MzScheme interface defines exception exn:vim, derived from exn.
+ It is raised for various Vim errors.
+
+--- 50,55 ----
+***************
+*** 79,118 ****
+ e.g.: >
+ :mzscheme (require (prefix vim- vimext))
+ <
+! All the examples below assume this naming scheme. Note that you need to do
+! this again for every buffer.
+
+- The auto-instantiation can be achieved with autocommands, e.g. you can put
+- something like this in your .vimrc (EOFs should not have indentation): >
+- function s:MzRequire()
+- if has("mzscheme")
+- :mz << EOF
+- (require (prefix vim- vimext))
+- (let ((buf (vim-get-buff-by-name (vim-eval "expand(\"<afile>\")"))))
+- (when (and buf (not (eq? buf (vim-curr-buff))))
+- (parameterize ((current-namespace (vim-get-buff-namespace buf)))
+- (namespace-attach-module vim-global-namespace 'vimext)
+- (namespace-require '(prefix vim vimext)))))
+- EOF
+- endif
+- endfunction
+-
+- function s:MzStartup()
+- if has("mzscheme")
+- au BufNew,BufNewFile,BufAdd,BufReadPre * :call s:MzRequire()
+- :mz << EOF
+- (current-library-collection-paths
+- (cons
+- (build-path (find-system-path 'addon-dir) (version) "collects")
+- (current-library-collection-paths)))
+- EOF
+- endif
+- endfunction
+-
+- call s:MzStartup()
+- <
+-
+- The global namespace just instantiated this module with the prefix "vimext:".
+ *mzscheme-sandbox*
+ When executed in the |sandbox|, access to some filesystem and Vim interface
+ procedures is restricted.
+--- 73,80 ----
+ e.g.: >
+ :mzscheme (require (prefix vim- vimext))
+ <
+! All the examples below assume this naming scheme.
+
+ *mzscheme-sandbox*
+ When executed in the |sandbox|, access to some filesystem and Vim interface
+ procedures is restricted.
+***************
+*** 121,135 ****
+ 2. Examples *mzscheme-examples*
+ >
+ :mzscheme (display "Hello")
+ :mzscheme (vim-set-buff-line 10 "This is line #10")
+ <
+ Inline script usage: >
+ function! <SID>SetFirstLine()
+ :mz << EOF
+ (display "!!!")
+ (vim-set-buff-line 1 "This is line #1")
+ (vim-beep)
+! EOF
+ endfunction
+
+ nmap <F9> :call <SID>SetFirstLine() <CR>
+--- 83,102 ----
+ 2. Examples *mzscheme-examples*
+ >
+ :mzscheme (display "Hello")
++ :mz (display (string-append "Using MzScheme version " (version)))
++ :mzscheme (require (prefix vim- vimext)) ; for MzScheme < 4.x
++ :mzscheme (require (prefix-in vim- 'vimext)) ; MzScheme 4.x
+ :mzscheme (vim-set-buff-line 10 "This is line #10")
+ <
+ Inline script usage: >
+ function! <SID>SetFirstLine()
+ :mz << EOF
+ (display "!!!")
++ (require (prefix vim- vimext))
++ ; for newer versions (require (prefix-in vim- 'vimext))
+ (vim-set-buff-line 1 "This is line #1")
+ (vim-beep)
+! EOF
+ endfunction
+
+ nmap <F9> :call <SID>SetFirstLine() <CR>
+***************
+*** 137,153 ****
+ File execution: >
+ :mzfile supascript.scm
+ <
+! Accessing the current buffer namespace from an MzScheme program running in
+! another buffer within |:mzfile|-executed script : >
+! ; Move to the window below
+! (vim-command "wincmd j")
+! ; execute in the context of buffer, to which window belongs
+! ; assume that buffer has 'textstring' defined
+! (parameterize ((current-namespace
+! (vim-get-buff-namespace (vim-curr-buff))))
+! (eval '(vim-set-buff-line 1 textstring)))
+! <
+
+ ==============================================================================
+ 3. Threads *mzscheme-threads*
+
+--- 104,136 ----
+ File execution: >
+ :mzfile supascript.scm
+ <
+! Vim exception handling: >
+! :mz << EOF
+! (require (prefix vim- vimext))
+! ; for newer versions (require (prefix-in vim- 'vimext))
+! (with-handlers
+! ([exn:vim? (lambda (e) (display (exn-message e)))])
+! (vim-eval "nonsense-string"))
+! EOF
+! <
+! Auto-instantiation of vimext module (can be placed in your |vimrc|): >
+! function! MzRequire()
+! :redir => l:mzversion
+! :mz (version)
+! :redir END
+! if strpart(l:mzversion, 1, 1) < "4"
+! " MzScheme versions < 4.x:
+! :mz (require (prefix vim- vimext))
+! else
+! " newer versions:
+! :mz (require (prefix-in vim- 'vimext))
+! endif
+! endfunction
+
++ if has("mzscheme")
++ silent call MzRequire()
++ endif
++ <
+ ==============================================================================
+ 3. Threads *mzscheme-threads*
+
+***************
+*** 168,178 ****
+ Common
+ ------
+ (command {command-string}) Perform the vim ":Ex" style command.
+! (eval {expr-string}) Evaluate the vim expression to a string.
+! A |List| is turned into a string by
+! joining the items and inserting line
+! breaks.
+! NOTE clashes with MzScheme eval
+ (range-start) Start/End of the range passed with
+ (range-end) the Scheme command.
+ (beep) beep
+--- 151,161 ----
+ Common
+ ------
+ (command {command-string}) Perform the vim ":Ex" style command.
+! (eval {expr-string}) Evaluate the vim expression into
+! respective MzScheme object: |Lists| are
+! represented as Scheme lists,
+! |Dictionaries| as hash tables.
+! NOTE the name clashes with MzScheme eval
+ (range-start) Start/End of the range passed with
+ (range-end) the Scheme command.
+ (beep) beep
+***************
+*** 186,192 ****
+ be set. The symbol 'global can be passed
+ as {buffer-or-window}. Then |:setglobal|
+ will be used.
+- global-namespace The MzScheme main namespace.
+
+ Buffers *mzscheme-buffer*
+ -------
+--- 169,174 ----
+***************
+*** 228,234 ****
+ if there is no such buffer.
+ (get-buff-by-num {buffernum}) Get a buffer by its number (return #f if
+ there is no buffer with this number).
+- (get-buff-namespace [buffer]) Get buffer namespace.
+
+ Windows *mzscheme-window*
+ ------
+--- 210,215 ----
+***************
+*** 250,256 ****
+ (set-cursor (line . col) [window]) Set cursor position.
+
+ ==============================================================================
+! 5. Dynamic loading *mzscheme-dynamic*
+
+ On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version|
+ output then includes |+mzscheme/dyn|.
+--- 231,237 ----
+ (set-cursor (line . col) [window]) Set cursor position.
+
+ ==============================================================================
+! 5. Dynamic loading *mzscheme-dynamic* *E812*
+
+ On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version|
+ output then includes |+mzscheme/dyn|.
+*** ../vim-7.2.190/src/Makefile 2009-05-26 18:12:19.000000000 +0200
+--- src/Makefile 2009-05-26 22:54:48.000000000 +0200
+***************
+*** 536,542 ****
+ # Use this with GCC to check for mistakes, unused arguments, etc.
+ #CFLAGS = -g -Wall -Wextra -Wmissing-prototypes -Wunreachable-code
+ #PYTHON_CFLAGS_EXTRA = -Wno-missing-field-initializers
+! #MZSCHEME_CFLAGS_EXTRA = -Wno-unreachable-code
+
+ # EFENCE - Electric-Fence malloc debugging: catches memory accesses beyond
+ # allocated memory (and makes every malloc()/free() very slow).
+--- 536,542 ----
+ # Use this with GCC to check for mistakes, unused arguments, etc.
+ #CFLAGS = -g -Wall -Wextra -Wmissing-prototypes -Wunreachable-code
+ #PYTHON_CFLAGS_EXTRA = -Wno-missing-field-initializers
+! #MZSCHEME_CFLAGS_EXTRA = -Wno-unreachable-code -Wno-unused-parameter
+
+ # EFENCE - Electric-Fence malloc debugging: catches memory accesses beyond
+ # allocated memory (and makes every malloc()/free() very slow).
+***************
+*** 2200,2205 ****
+--- 2200,2206 ----
+ -rm -f $(TOOLS) auto/osdef.h auto/pathdef.c auto/if_perl.c
+ -rm -f conftest* *~ auto/link.sed
+ -rm -rf $(APPDIR)
++ -rm -rf mzscheme_base.c
+ if test -d $(PODIR); then \
+ cd $(PODIR); $(MAKE) prefix=$(DESTDIR)$(prefix) clean; \
+ fi
+***************
+*** 2433,2440 ****
+ objects/if_xcmdsrv.o: if_xcmdsrv.c
+ $(CCC) -o $@ if_xcmdsrv.c
+
+! objects/if_mzsch.o: if_mzsch.c
+ $(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c
+
+ objects/if_perl.o: auto/if_perl.c
+ $(CCC) -o $@ auto/if_perl.c
+--- 2434,2444 ----
+ objects/if_xcmdsrv.o: if_xcmdsrv.c
+ $(CCC) -o $@ if_xcmdsrv.c
+
+! objects/if_mzsch.o: if_mzsch.c $(MZSCHEME_EXTRA)
+ $(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c
++
++ mzscheme_base.c:
++ $(MZSCHEME_MZC) --c-mods mzscheme_base.c ++lib scheme/base
+
+ objects/if_perl.o: auto/if_perl.c
+ $(CCC) -o $@ auto/if_perl.c
+*** ../vim-7.2.190/src/Make_ming.mak 2007-08-12 15:24:29.000000000 +0200
+--- src/Make_ming.mak 2009-05-26 18:54:15.000000000 +0200
+***************
+*** 115,122 ****
+--- 115,135 ----
+ MZSCHEME_VER=205_000
+ endif
+
++ ifndef MZSCHEME_PRECISE_GC
++ MZSCHEME_PRECISE_GC=no
++ endif
++
++ # for version 4.x we need to generate byte-code for Scheme base
++ ifndef MZSCHEME_GENERATE_BASE
++ MZSCHEME_GENERATE_BASE=no
++ endif
++
+ ifeq (no,$(DYNAMIC_MZSCHEME))
++ ifeq (yes,$(MZSCHEME_PRECISE_GC))
++ MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
++ else
+ MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
++ endif
+ # the modern MinGW can dynamically link to dlls directly.
+ # point MZSCHEME_DLLS to where you put libmzschXXXXXXX.dll and libgcXXXXXXX.dll
+ ifndef MZSCHEME_DLLS
+***************
+*** 410,415 ****
+--- 423,435 ----
+ ifdef MZSCHEME
+ OBJ += $(OUTDIR)/if_mzsch.o
+ MZSCHEME_INCL = if_mzsch.h
++ ifeq (yes,$(MZSCHEME_GENERATE_BASE))
++ CFLAGS += -DINCLUDE_MZSCHEME_BASE
++ MZ_EXTRA_DEP += mzscheme_base.c
++ endif
++ ifeq (yes,$(MZSCHEME_PRECISE_GC))
++ CFLAGS += -DMZ_PRECISE_GC
++ endif
+ endif
+ ifdef PYTHON
+ OBJ += $(OUTDIR)/if_python.o
+***************
+*** 588,593 ****
+--- 608,619 ----
+ $(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_INCL) $(NBDEBUG_SRC)
+ $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o
+
++ $(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP)
++ $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o
++
++ mzscheme_base.c:
++ $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base
++
+ pathdef.c: $(INCL)
+ ifneq (sh.exe, $(SHELL))
+ @echo creating pathdef.c
+*** ../vim-7.2.190/src/Make_mvc.mak 2009-02-04 18:34:54.000000000 +0100
+--- src/Make_mvc.mak 2009-05-26 18:54:51.000000000 +0200
+***************
+*** 34,39 ****
+--- 34,40 ----
+ # MZSCHEME=[Path to MzScheme directory]
+ # DYNAMIC_MZSCHEME=yes (to load the MzScheme DLLs dynamically)
+ # MZSCHEME_VER=[version, 205_000, ...]
++ # MZSCHEME_DEBUG=no
+ #
+ # Perl interface:
+ # PERL=[Path to Perl directory]
+***************
+*** 621,635 ****
+--- 622,658 ----
+ MZSCHEME_VER = 205_000
+ !endif
+ CFLAGS = $(CFLAGS) -DFEAT_MZSCHEME -I $(MZSCHEME)\include
++ !if EXIST("$(MZSCHEME)\collects\scheme\base.ss")
++ # for MzScheme 4.x we need to include byte code for basic Scheme stuff
++ MZSCHEME_EXTRA_DEP = mzscheme_base.c
++ CFLAGS = $(CFLAGS) -DINCLUDE_MZSCHEME_BASE
++ !endif
++ !if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib") \
++ && !EXIST("$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib")
++ !message Building with Precise GC
++ MZSCHEME_PRECISE_GC = yes
++ CFLAGS = $(CFLAGS) -DMZ_PRECISE_GC
++ !endif
+ !if "$(DYNAMIC_MZSCHEME)" == "yes"
++ !if "$(MZSCHEME_PRECISE_GC)" == "yes"
++ !error MzScheme with Precise GC cannot be loaded dynamically
++ !endif
+ !message MzScheme DLLs will be loaded dynamically
+ CFLAGS = $(CFLAGS) -DDYNAMIC_MZSCHEME \
+ -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" \
+ -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
+ !else
++ !if "$(MZSCHEME_DEBUG)" == "yes"
++ CFLAGS = $(CFLAGS) -DMZSCHEME_FORCE_GC
++ !endif
++ !if "$(MZSCHEME_PRECISE_GC)" == "yes"
++ # Precise GC does not use separate dll
++ MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
++ !else
+ MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib \
+ $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
+ !endif
++ !endif
+ MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj
+ !endif
+
+***************
+*** 930,938 ****
+ $(OUTDIR)/if_perlsfio.obj: $(OUTDIR) if_perlsfio.c $(INCL)
+ $(CC) $(CFLAGS) $(PERL_INC) if_perlsfio.c
+
+! $(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c $(INCL)
+ $(CC) $(CFLAGS) if_mzsch.c \
+ -DMZSCHEME_COLLECTS=\"$(MZSCHEME:\=\\)\\collects\"
+
+ $(OUTDIR)/if_python.obj: $(OUTDIR) if_python.c $(INCL)
+ $(CC) $(CFLAGS) $(PYTHON_INC) if_python.c
+--- 953,963 ----
+ $(OUTDIR)/if_perlsfio.obj: $(OUTDIR) if_perlsfio.c $(INCL)
+ $(CC) $(CFLAGS) $(PERL_INC) if_perlsfio.c
+
+! $(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c $(INCL) $(MZSCHEME_EXTRA_DEP)
+ $(CC) $(CFLAGS) if_mzsch.c \
+ -DMZSCHEME_COLLECTS=\"$(MZSCHEME:\=\\)\\collects\"
++ mzscheme_base.c:
++ $(MZSCHEME)\mzc --c-mods mzscheme_base.c ++lib scheme/base
+
+ $(OUTDIR)/if_python.obj: $(OUTDIR) if_python.c $(INCL)
+ $(CC) $(CFLAGS) $(PYTHON_INC) if_python.c
+*** ../vim-7.2.190/src/auto/configure 2009-05-21 23:25:38.000000000 +0200
+--- src/auto/configure 2009-05-26 19:12:29.000000000 +0200
+***************
+*** 701,706 ****
+--- 701,708 ----
+ shrpenv
+ vi_cv_perllib
+ vi_cv_path_perl
++ MZSCHEME_MZC
++ MZSCHEME_EXTRA
+ MZSCHEME_CFLAGS
+ MZSCHEME_LIBS
+ MZSCHEME_PRO
+***************
+*** 4641,4648 ****
+ $as_echo "\"$PLTHOME\"" >&6; }
+ vi_cv_path_mzscheme_pfx="$PLTHOME"
+ else
+! { $as_echo "$as_me:$LINENO: result: \"not set\"" >&5
+! $as_echo "\"not set\"" >&6; }
+ # Extract the first word of "mzscheme", so it can be a program name with args.
+ set dummy mzscheme; ac_word=$2
+ { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+--- 4643,4650 ----
+ $as_echo "\"$PLTHOME\"" >&6; }
+ vi_cv_path_mzscheme_pfx="$PLTHOME"
+ else
+! { $as_echo "$as_me:$LINENO: result: not set" >&5
+! $as_echo "not set" >&6; }
+ # Extract the first word of "mzscheme", so it can be a program name with args.
+ set dummy mzscheme; ac_word=$2
+ { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+***************
+*** 4697,4712 ****
+ if test "${vi_cv_path_mzscheme_pfx+set}" = set; then
+ $as_echo_n "(cached) " >&6
+ else
+! vi_cv_path_mzscheme_pfx=`
+! ${vi_cv_path_mzscheme} -evm \
+! "(display (simplify-path \
+ (build-path (call-with-values \
+ (lambda () (split-path (find-system-path (quote exec-file)))) \
+! (lambda (base name must-be-dir?) base)) (quote up))))"`
+ fi
+ { $as_echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme_pfx" >&5
+ $as_echo "$vi_cv_path_mzscheme_pfx" >&6; }
+! vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
+ fi
+ fi
+ fi
+--- 4699,4714 ----
+ if test "${vi_cv_path_mzscheme_pfx+set}" = set; then
+ $as_echo_n "(cached) " >&6
+ else
+! echo "(display (simplify-path \
+ (build-path (call-with-values \
+ (lambda () (split-path (find-system-path (quote exec-file)))) \
+! (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
+! vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
+! sed -e 's+/$++'`
+ fi
+ { $as_echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme_pfx" >&5
+ $as_echo "$vi_cv_path_mzscheme_pfx" >&6; }
+! rm -f mzdirs.scm
+ fi
+ fi
+ fi
+***************
+*** 4716,4736 ****
+ { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include" >&5
+ $as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include... " >&6; }
+ if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
+! { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
+! $as_echo "\"yes\"" >&6; }
+ else
+! { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
+! $as_echo "\"no\"" >&6; }
+! { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include" >&5
+! $as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include... " >&6; }
+ if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
+! { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
+! $as_echo "\"yes\"" >&6; }
+! SCHEME_INC=/plt
+ else
+! { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
+! $as_echo "\"no\"" >&6; }
+! vi_cv_path_mzscheme_pfx=
+ fi
+ fi
+ fi
+--- 4718,4749 ----
+ { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include" >&5
+ $as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include... " >&6; }
+ if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
+! SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
+! { $as_echo "$as_me:$LINENO: result: yes" >&5
+! $as_echo "yes" >&6; }
+ else
+! { $as_echo "$as_me:$LINENO: result: no" >&5
+! $as_echo "no" >&6; }
+! { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt" >&5
+! $as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt... " >&6; }
+ if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
+! { $as_echo "$as_me:$LINENO: result: yes" >&5
+! $as_echo "yes" >&6; }
+! SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
+ else
+! { $as_echo "$as_me:$LINENO: result: no" >&5
+! $as_echo "no" >&6; }
+! { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in /usr/include/plt/" >&5
+! $as_echo_n "checking if scheme.h can be found in /usr/include/plt/... " >&6; }
+! if test -f /usr/include/plt/scheme.h; then
+! { $as_echo "$as_me:$LINENO: result: yes" >&5
+! $as_echo "yes" >&6; }
+! SCHEME_INC=/usr/include/plt
+! else
+! { $as_echo "$as_me:$LINENO: result: no" >&5
+! $as_echo "no" >&6; }
+! vi_cv_path_mzscheme_pfx=
+! fi
+ fi
+ fi
+ fi
+***************
+*** 4738,4758 ****
+ if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+ if test "x$MACOSX" = "xyes"; then
+ MZSCHEME_LIBS="-framework PLT_MzScheme"
+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
+ else
+! MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+ if test "$GCC" = yes; then
+! MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+ elif test "`(uname) 2>/dev/null`" = SunOS &&
+ uname -r | grep '^5' >/dev/null; then
+! MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
+ fi
+ fi
+ if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
+ SCHEME_COLLECTS=lib/plt/
+ fi
+! MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC} \
+ -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
+ MZSCHEME_SRC="if_mzsch.c"
+ MZSCHEME_OBJ="objects/if_mzsch.o"
+--- 4751,4784 ----
+ if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+ if test "x$MACOSX" = "xyes"; then
+ MZSCHEME_LIBS="-framework PLT_MzScheme"
++ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
++ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
++ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
+ else
+! if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
+! MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
+! MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+! else
+! MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+! fi
+ if test "$GCC" = yes; then
+! MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+ elif test "`(uname) 2>/dev/null`" = SunOS &&
+ uname -r | grep '^5' >/dev/null; then
+! MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
+ fi
+ fi
+ if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
+ SCHEME_COLLECTS=lib/plt/
+ fi
+! if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
+! MZSCHEME_EXTRA="mzscheme_base.c"
+! MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
+! MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
+! fi
+! MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
+ -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
+ MZSCHEME_SRC="if_mzsch.c"
+ MZSCHEME_OBJ="objects/if_mzsch.o"
+***************
+*** 4767,4772 ****
+--- 4793,4800 ----
+
+
+
++
++
+ fi
+
+
+*** ../vim-7.2.190/src/configure.in 2009-05-21 23:25:38.000000000 +0200
+--- src/configure.in 2009-05-26 18:57:35.000000000 +0200
+***************
+*** 414,420 ****
+ AC_MSG_RESULT("$PLTHOME")
+ vi_cv_path_mzscheme_pfx="$PLTHOME"
+ else
+! AC_MSG_RESULT("not set")
+ dnl -- try to find MzScheme executable
+ AC_PATH_PROG(vi_cv_path_mzscheme, mzscheme)
+
+--- 414,420 ----
+ AC_MSG_RESULT("$PLTHOME")
+ vi_cv_path_mzscheme_pfx="$PLTHOME"
+ else
+! AC_MSG_RESULT(not set)
+ dnl -- try to find MzScheme executable
+ AC_PATH_PROG(vi_cv_path_mzscheme, mzscheme)
+
+***************
+*** 430,443 ****
+ if test "X$vi_cv_path_mzscheme" != "X"; then
+ dnl -- find where MzScheme thinks it was installed
+ AC_CACHE_CHECK(MzScheme install prefix,vi_cv_path_mzscheme_pfx,
+! [ vi_cv_path_mzscheme_pfx=`
+! ${vi_cv_path_mzscheme} -evm \
+! "(display (simplify-path \
+ (build-path (call-with-values \
+ (lambda () (split-path (find-system-path (quote exec-file)))) \
+! (lambda (base name must-be-dir?) base)) (quote up))))"` ])
+! dnl Remove a trailing slash.
+! vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
+ fi
+ fi
+ fi
+--- 430,445 ----
+ if test "X$vi_cv_path_mzscheme" != "X"; then
+ dnl -- find where MzScheme thinks it was installed
+ AC_CACHE_CHECK(MzScheme install prefix,vi_cv_path_mzscheme_pfx,
+! dnl different versions of MzScheme differ in command line processing
+! dnl use universal approach
+! echo "(display (simplify-path \
+ (build-path (call-with-values \
+ (lambda () (split-path (find-system-path (quote exec-file)))) \
+! (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
+! dnl Remove a trailing slash
+! [ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
+! sed -e 's+/$++'` ])
+! rm -f mzdirs.scm
+ fi
+ fi
+ fi
+***************
+*** 446,461 ****
+ if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+ AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include)
+ if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
+! AC_MSG_RESULT("yes")
+ else
+! AC_MSG_RESULT("no")
+! AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include)
+ if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
+! AC_MSG_RESULT("yes")
+! SCHEME_INC=/plt
+ else
+! AC_MSG_RESULT("no")
+! vi_cv_path_mzscheme_pfx=
+ fi
+ fi
+ fi
+--- 448,471 ----
+ if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+ AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include)
+ if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
+! SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
+! AC_MSG_RESULT(yes)
+ else
+! AC_MSG_RESULT(no)
+! AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt)
+ if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
+! AC_MSG_RESULT(yes)
+! SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
+ else
+! AC_MSG_RESULT(no)
+! AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/)
+! if test -f /usr/include/plt/scheme.h; then
+! AC_MSG_RESULT(yes)
+! SCHEME_INC=/usr/include/plt
+! else
+! AC_MSG_RESULT(no)
+! vi_cv_path_mzscheme_pfx=
+! fi
+ fi
+ fi
+ fi
+***************
+*** 463,485 ****
+ if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+ if test "x$MACOSX" = "xyes"; then
+ MZSCHEME_LIBS="-framework PLT_MzScheme"
+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
+ else
+! MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+ if test "$GCC" = yes; then
+ dnl Make Vim remember the path to the library. For when it's not in
+ dnl $LD_LIBRARY_PATH.
+! MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+ elif test "`(uname) 2>/dev/null`" = SunOS &&
+ uname -r | grep '^5' >/dev/null; then
+! MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
+ fi
+ fi
+ if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
+ SCHEME_COLLECTS=lib/plt/
+ fi
+! MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC} \
+ -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
+ MZSCHEME_SRC="if_mzsch.c"
+ MZSCHEME_OBJ="objects/if_mzsch.o"
+--- 473,510 ----
+ if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+ if test "x$MACOSX" = "xyes"; then
+ MZSCHEME_LIBS="-framework PLT_MzScheme"
++ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
++ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
++ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
+ else
+! dnl Using shared objects
+! if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
+! MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
+! MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+! else
+! MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+! fi
+ if test "$GCC" = yes; then
+ dnl Make Vim remember the path to the library. For when it's not in
+ dnl $LD_LIBRARY_PATH.
+! MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+ elif test "`(uname) 2>/dev/null`" = SunOS &&
+ uname -r | grep '^5' >/dev/null; then
+! MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
+ fi
+ fi
+ if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
+ SCHEME_COLLECTS=lib/plt/
+ fi
+! if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
+! dnl need to generate bytecode for MzScheme base
+! MZSCHEME_EXTRA="mzscheme_base.c"
+! MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
+! MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
+! fi
+! MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
+ -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
+ MZSCHEME_SRC="if_mzsch.c"
+ MZSCHEME_OBJ="objects/if_mzsch.o"
+***************
+*** 491,496 ****
+--- 516,523 ----
+ AC_SUBST(MZSCHEME_PRO)
+ AC_SUBST(MZSCHEME_LIBS)
+ AC_SUBST(MZSCHEME_CFLAGS)
++ AC_SUBST(MZSCHEME_EXTRA)
++ AC_SUBST(MZSCHEME_MZC)
+ fi
+
+
+*** ../vim-7.2.190/src/config.mk.in 2008-06-25 00:49:03.000000000 +0200
+--- src/config.mk.in 2009-05-26 18:57:49.000000000 +0200
+***************
+*** 41,46 ****
+--- 41,48 ----
+ MZSCHEME_OBJ = @MZSCHEME_OBJ@
+ MZSCHEME_CFLAGS = @MZSCHEME_CFLAGS@
+ MZSCHEME_PRO = @MZSCHEME_PRO@
++ MZSCHEME_EXTRA = @MZSCHEME_EXTRA@
++ MZSCHEME_MZC = @MZSCHEME_MZC@
+
+ PERL = @vi_cv_path_perl@
+ PERLLIB = @vi_cv_perllib@
+*** ../vim-7.2.190/src/eval.c 2009-05-24 13:40:17.000000000 +0200
+--- src/eval.c 2009-05-26 18:58:20.000000000 +0200
+***************
+*** 5866,5872 ****
+ return item1 == NULL && item2 == NULL;
+ }
+
+! #if defined(FEAT_PYTHON) || defined(PROTO)
+ /*
+ * Return the dictitem that an entry in a hashtable points to.
+ */
+--- 5866,5872 ----
+ return item1 == NULL && item2 == NULL;
+ }
+
+! #if defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) || defined(PROTO)
+ /*
+ * Return the dictitem that an entry in a hashtable points to.
+ */
+*** ../vim-7.2.190/src/if_mzsch.c 2009-05-17 16:23:20.000000000 +0200
+--- src/if_mzsch.c 2009-05-26 19:24:18.000000000 +0200
+***************
+*** 4,9 ****
+--- 4,11 ----
+ * Original work by Brent Fulgham <bfulgham@debian.org>
+ * (Based on lots of help from Matthew Flatt)
+ *
++ * TODO Convert byte-strings to char strings?
++ *
+ * This consists of six parts:
+ * 1. MzScheme interpreter main program
+ * 2. Routines that handle the external interface between MzScheme and
+***************
+*** 18,24 ****
+ * garbage collector will do it self
+ * 2. Requires at least NORMAL features. I can't imagine why one may want
+ * to build with SMALL or TINY features but with MzScheme interface.
+! * 3. I don't use K&R-style functions. Anyway, MzScheme headers are ANSI.
+ */
+
+ #include "vim.h"
+--- 20,26 ----
+ * garbage collector will do it self
+ * 2. Requires at least NORMAL features. I can't imagine why one may want
+ * to build with SMALL or TINY features but with MzScheme interface.
+! * 3. I don't use K&R-style functions. Anyways, MzScheme headers are ANSI.
+ */
+
+ #include "vim.h"
+***************
+*** 29,42 ****
+ * depend". */
+ #if defined(FEAT_MZSCHEME) || defined(PROTO)
+
+ /* Base data structures */
+ #define SCHEME_VIMBUFFERP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_buffer_type)
+ #define SCHEME_VIMWINDOWP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_window_type)
+
+ typedef struct
+ {
+! Scheme_Type tag;
+! Scheme_Env *env;
+ buf_T *buf;
+ } vim_mz_buffer;
+
+--- 31,45 ----
+ * depend". */
+ #if defined(FEAT_MZSCHEME) || defined(PROTO)
+
++ #include <assert.h>
++
+ /* Base data structures */
+ #define SCHEME_VIMBUFFERP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_buffer_type)
+ #define SCHEME_VIMWINDOWP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_window_type)
+
+ typedef struct
+ {
+! Scheme_Object so;
+ buf_T *buf;
+ } vim_mz_buffer;
+
+***************
+*** 44,50 ****
+
+ typedef struct
+ {
+! Scheme_Type tag;
+ win_T *win;
+ } vim_mz_window;
+
+--- 47,53 ----
+
+ typedef struct
+ {
+! Scheme_Object so;
+ win_T *win;
+ } vim_mz_window;
+
+***************
+*** 67,85 ****
+ Scheme_Object *port;
+ } Port_Info;
+
+- /* info for closed prim */
+- /*
+- * data have different means:
+- * for do_eval it is char*
+- * for do_apply is Apply_Onfo*
+- * for do_load is Port_Info*
+- */
+- typedef struct
+- {
+- void *data;
+- Scheme_Env *env;
+- } Cmd_Info;
+-
+ /* info for do_apply */
+ typedef struct
+ {
+--- 70,75 ----
+***************
+*** 122,128 ****
+ static Scheme_Object *insert_buffer_line_list(void *, int, Scheme_Object **);
+ static Scheme_Object *get_range_start(void *, int, Scheme_Object **);
+ static Scheme_Object *get_range_end(void *, int, Scheme_Object **);
+- static Scheme_Object *get_buffer_namespace(void *, int, Scheme_Object **);
+ static vim_mz_buffer *get_vim_curr_buffer(void);
+
+ /* Window-related commands */
+--- 112,117 ----
+***************
+*** 163,170 ****
+ static int do_mzscheme_command(exarg_T *, void *, Scheme_Closed_Prim *what);
+ static void startup_mzscheme(void);
+ static char *string_to_line(Scheme_Object *obj);
+- static int mzscheme_io_init(void);
+- static void mzscheme_interface_init(vim_mz_buffer *self);
+ static void do_output(char *mesg, long len);
+ static void do_printf(char *format, ...);
+ static void do_flush(void);
+--- 152,157 ----
+***************
+*** 174,192 ****
+ static Scheme_Object *do_eval(void *, int noargc, Scheme_Object **noargv);
+ static Scheme_Object *do_load(void *, int noargc, Scheme_Object **noargv);
+ static Scheme_Object *do_apply(void *, int noargc, Scheme_Object **noargv);
+! static void register_vim_exn(Scheme_Env *env);
+ static vim_mz_buffer *get_buffer_arg(const char *fname, int argnum,
+ int argc, Scheme_Object **argv);
+ static vim_mz_window *get_window_arg(const char *fname, int argnum,
+ int argc, Scheme_Object **argv);
+- static void add_vim_exn(Scheme_Env *env);
+ static int line_in_range(linenr_T, buf_T *);
+ static void check_line_range(linenr_T, buf_T *);
+ static void mz_fix_cursor(int lo, int hi, int extra);
+
+! static int eval_in_namespace(void *, Scheme_Closed_Prim *, Scheme_Env *,
+! Scheme_Object **ret);
+! static void make_modules(Scheme_Env *);
+
+ #ifdef DYNAMIC_MZSCHEME
+
+--- 161,212 ----
+ static Scheme_Object *do_eval(void *, int noargc, Scheme_Object **noargv);
+ static Scheme_Object *do_load(void *, int noargc, Scheme_Object **noargv);
+ static Scheme_Object *do_apply(void *, int noargc, Scheme_Object **noargv);
+! static void register_vim_exn(void);
+ static vim_mz_buffer *get_buffer_arg(const char *fname, int argnum,
+ int argc, Scheme_Object **argv);
+ static vim_mz_window *get_window_arg(const char *fname, int argnum,
+ int argc, Scheme_Object **argv);
+ static int line_in_range(linenr_T, buf_T *);
+ static void check_line_range(linenr_T, buf_T *);
+ static void mz_fix_cursor(int lo, int hi, int extra);
+
+! static int eval_with_exn_handling(void *, Scheme_Closed_Prim *,
+! Scheme_Object **ret);
+! static void make_modules(void);
+! static void init_exn_catching_apply(void);
+! static int mzscheme_env_main(Scheme_Env *env, int argc, char **argv);
+! static int mzscheme_init(void);
+! #ifdef FEAT_EVAL
+! static Scheme_Object *vim_to_mzscheme(typval_T *vim_value, int depth,
+! Scheme_Hash_Table *visited);
+! #endif
+!
+! #ifdef MZ_PRECISE_GC
+! static int buffer_size_proc(void *obj)
+! {
+! return gcBYTES_TO_WORDS(sizeof(vim_mz_buffer));
+! }
+! static int buffer_mark_proc(void *obj)
+! {
+! return buffer_size_proc(obj);
+! }
+! static int buffer_fixup_proc(void *obj)
+! {
+! return buffer_size_proc(obj);
+! }
+! static int window_size_proc(void *obj)
+! {
+! return gcBYTES_TO_WORDS(sizeof(vim_mz_window));
+! }
+! static int window_mark_proc(void *obj)
+! {
+! return window_size_proc(obj);
+! }
+! static int window_fixup_proc(void *obj)
+! {
+! return window_size_proc(obj);
+! }
+! #endif
+
+ #ifdef DYNAMIC_MZSCHEME
+
+***************
+*** 260,267 ****
+ (Scheme_Closed_Prim *prim, void *data, const char *name, mzshort mina,
+ mzshort maxa);
+ static Scheme_Object *(*dll_scheme_make_integer_value)(long i);
+- static Scheme_Object *(*dll_scheme_make_namespace)(int argc,
+- Scheme_Object *argv[]);
+ static Scheme_Object *(*dll_scheme_make_pair)(Scheme_Object *car,
+ Scheme_Object *cdr);
+ static Scheme_Object *(*dll_scheme_make_prim_w_arity)(Scheme_Prim *prim,
+--- 280,285 ----
+***************
+*** 311,316 ****
+--- 329,345 ----
+ static Scheme_Object *(*dll_scheme_char_string_to_path)
+ (Scheme_Object *s);
+ # endif
++ static Scheme_Hash_Table *(*dll_scheme_make_hash_table)(int type);
++ static void (*dll_scheme_hash_set)(Scheme_Hash_Table *table,
++ Scheme_Object *key, Scheme_Object *value);
++ static Scheme_Object *(*dll_scheme_hash_get)(Scheme_Hash_Table *table,
++ Scheme_Object *key);
++ static Scheme_Object *(*dll_scheme_make_double)(double d);
++ # ifdef INCLUDE_MZSCHEME_BASE
++ static Scheme_Object *(*dll_scheme_make_sized_byte_string)(char *chars,
++ long len, int copy);
++ static Scheme_Object *(*dll_scheme_namespace_require)(Scheme_Object *req);
++ # endif
+
+ /* arrays are imported directly */
+ # define scheme_eof dll_scheme_eof
+***************
+*** 368,374 ****
+ # define scheme_lookup_global dll_scheme_lookup_global
+ # define scheme_make_closed_prim_w_arity dll_scheme_make_closed_prim_w_arity
+ # define scheme_make_integer_value dll_scheme_make_integer_value
+- # define scheme_make_namespace dll_scheme_make_namespace
+ # define scheme_make_pair dll_scheme_make_pair
+ # define scheme_make_prim_w_arity dll_scheme_make_prim_w_arity
+ # if MZSCHEME_VERSION_MAJOR < 299
+--- 397,402 ----
+***************
+*** 403,408 ****
+--- 431,444 ----
+ # define scheme_char_string_to_path \
+ dll_scheme_char_string_to_path
+ # endif
++ # define scheme_make_hash_table dll_scheme_make_hash_table
++ # define scheme_hash_set dll_scheme_hash_set
++ # define scheme_hash_get dll_scheme_hash_get
++ # define scheme_make_double dll_scheme_make_double
++ # ifdef INCLUDE_MZSCHEME_BASE
++ # define scheme_make_sized_byte_string dll_scheme_make_sized_byte_string
++ # define scheme_namespace_require dll_scheme_namespace_require
++ # endif
+
+ typedef struct
+ {
+***************
+*** 468,474 ****
+ {"scheme_make_closed_prim_w_arity",
+ (void **)&dll_scheme_make_closed_prim_w_arity},
+ {"scheme_make_integer_value", (void **)&dll_scheme_make_integer_value},
+- {"scheme_make_namespace", (void **)&dll_scheme_make_namespace},
+ {"scheme_make_pair", (void **)&dll_scheme_make_pair},
+ {"scheme_make_prim_w_arity", (void **)&dll_scheme_make_prim_w_arity},
+ # if MZSCHEME_VERSION_MAJOR < 299
+--- 504,509 ----
+***************
+*** 502,510 ****
+ {"scheme_current_config", (void **)&dll_scheme_current_config},
+ {"scheme_char_string_to_byte_string",
+ (void **)&dll_scheme_char_string_to_byte_string},
+! {"scheme_char_string_to_path",
+! (void **)&dll_scheme_char_string_to_path},
+ # endif
+ {NULL, NULL}};
+
+ static HINSTANCE hMzGC = 0;
+--- 537,552 ----
+ {"scheme_current_config", (void **)&dll_scheme_current_config},
+ {"scheme_char_string_to_byte_string",
+ (void **)&dll_scheme_char_string_to_byte_string},
+! {"scheme_char_string_to_path", (void **)&dll_scheme_char_string_to_path},
+ # endif
++ {"scheme_make_hash_table", (void **)&dll_scheme_make_hash_table},
++ {"scheme_hash_set", (void **)&dll_scheme_hash_set},
++ {"scheme_hash_get", (void **)&dll_scheme_hash_get},
++ {"scheme_make_double", (void **)&dll_scheme_make_double},
++ # ifdef INCLUDE_MZSCHEME_BASE
++ {"scheme_make_sized_byte_string", (void **)&dll_scheme_make_sized_byte_string},
++ {"scheme_namespace_require", (void **)&dll_scheme_namespace_require},
++ #endif
+ {NULL, NULL}};
+
+ static HINSTANCE hMzGC = 0;
+***************
+*** 592,597 ****
+--- 634,644 ----
+ }
+ #endif /* DYNAMIC_MZSCHEME */
+
++ /* need to put it here for dynamic stuff to work */
++ #ifdef INCLUDE_MZSCHEME_BASE
++ # include "mzscheme_base.c"
++ #endif
++
+ /*
+ *========================================================================
+ * 1. MzScheme interpreter startup
+***************
+*** 601,621 ****
+ static Scheme_Type mz_buffer_type;
+ static Scheme_Type mz_window_type;
+
+! static int initialized = 0;
+
+ /* global environment */
+ static Scheme_Env *environment = NULL;
+ /* output/error handlers */
+ static Scheme_Object *curout = NULL;
+ static Scheme_Object *curerr = NULL;
+! /* vim:exn exception */
+ static Scheme_Object *exn_catching_apply = NULL;
+ static Scheme_Object *exn_p = NULL;
+ static Scheme_Object *exn_message = NULL;
+ static Scheme_Object *vim_exn = NULL; /* Vim Error exception */
+! /* values for exn:vim - constructor, predicate, accessors etc */
+! static Scheme_Object *vim_exn_names = NULL;
+! static Scheme_Object *vim_exn_values = NULL;
+
+ static long range_start;
+ static long range_end;
+--- 648,669 ----
+ static Scheme_Type mz_buffer_type;
+ static Scheme_Type mz_window_type;
+
+! static int initialized = FALSE;
+
+ /* global environment */
+ static Scheme_Env *environment = NULL;
+ /* output/error handlers */
+ static Scheme_Object *curout = NULL;
+ static Scheme_Object *curerr = NULL;
+! /* exn:vim exception */
+ static Scheme_Object *exn_catching_apply = NULL;
+ static Scheme_Object *exn_p = NULL;
+ static Scheme_Object *exn_message = NULL;
+ static Scheme_Object *vim_exn = NULL; /* Vim Error exception */
+!
+! #if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
+! static void *stack_base = NULL;
+! #endif
+
+ static long range_start;
+ static long range_end;
+***************
+*** 668,677 ****
+ timer_proc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
+ # elif defined(FEAT_GUI_GTK)
+ static gint
+! timer_proc(gpointer data UNUSED)
+ # elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)
+ static void
+! timer_proc(XtPointer timed_out UNUSED, XtIntervalId *interval_id UNUSED)
+ # elif defined(FEAT_GUI_MAC)
+ pascal void
+ timer_proc(EventLoopTimerRef theTimer, void *userData)
+--- 716,725 ----
+ timer_proc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
+ # elif defined(FEAT_GUI_GTK)
+ static gint
+! timer_proc(gpointer data)
+ # elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)
+ static void
+! timer_proc(XtPointer timed_out, XtIntervalId *interval_id)
+ # elif defined(FEAT_GUI_MAC)
+ pascal void
+ timer_proc(EventLoopTimerRef theTimer, void *userData)
+***************
+*** 751,762 ****
+ #endif
+ }
+
+ static void
+ startup_mzscheme(void)
+ {
+! Scheme_Object *proc_make_security_guard;
+!
+! scheme_set_stack_base(NULL, 1);
+
+ MZ_REGISTER_STATIC(environment);
+ MZ_REGISTER_STATIC(curout);
+--- 799,862 ----
+ #endif
+ }
+
++ void
++ mzscheme_main(void)
++ {
++ #if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400
++ /* use trampoline for precise GC in MzScheme >= 4.x */
++ scheme_main_setup(TRUE, mzscheme_env_main, 0, NULL);
++ #else
++ mzscheme_env_main(NULL, 0, NULL);
++ #endif
++ }
++
++ static int
++ mzscheme_env_main(Scheme_Env *env, int argc, char **argv)
++ {
++ /* neither argument nor return values are used */
++ #ifdef MZ_PRECISE_GC
++ # if MZSCHEME_VERSION_MAJOR < 400
++ /*
++ * Starting from version 4.x, embedding applications must use
++ * scheme_main_setup/scheme_main_stack_setup trampolines
++ * rather than setting stack base directly with scheme_set_stack_base
++ */
++ Scheme_Object *dummy = NULL;
++ MZ_GC_DECL_REG(1);
++ MZ_GC_VAR_IN_REG(0, dummy);
++
++ stack_base = &__gc_var_stack__;
++ # else
++ /* environment has been created by us by Scheme */
++ environment = env;
++ # endif
++ /*
++ * In 4.x, all activities must be performed inside trampoline
++ * so we are forced to initialise GC immediately
++ * This can be postponed in 3.x but I see no point in implementing
++ * a feature which will work in older versions only.
++ * One would better use conservative GC if he needs dynamic MzScheme
++ */
++ mzscheme_init();
++ #else
++ int dummy = 0;
++ stack_base = (void *)&dummy;
++ #endif
++ main_loop(FALSE, FALSE);
++ #if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR < 400
++ /* releasing dummy */
++ MZ_GC_REG();
++ MZ_GC_UNREG();
++ #endif
++ return 0;
++ }
++
+ static void
+ startup_mzscheme(void)
+ {
+! #if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
+! scheme_set_stack_base(stack_base, 1);
+! #endif
+
+ MZ_REGISTER_STATIC(environment);
+ MZ_REGISTER_STATIC(curout);
+***************
+*** 765,774 ****
+ MZ_REGISTER_STATIC(exn_p);
+ MZ_REGISTER_STATIC(exn_message);
+ MZ_REGISTER_STATIC(vim_exn);
+- MZ_REGISTER_STATIC(vim_exn_names);
+- MZ_REGISTER_STATIC(vim_exn_values);
+
+ environment = scheme_basic_env();
+
+ /* redirect output */
+ scheme_console_output = do_output;
+--- 865,899 ----
+ MZ_REGISTER_STATIC(exn_p);
+ MZ_REGISTER_STATIC(exn_message);
+ MZ_REGISTER_STATIC(vim_exn);
+
++ #if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
++ /* in newer versions of precise GC the initial env has been created */
+ environment = scheme_basic_env();
++ #endif
++ MZ_GC_CHECK();
++
++ #ifdef INCLUDE_MZSCHEME_BASE
++ {
++ /*
++ * versions 4.x do not provide Scheme bindings by defaults
++ * we need to add them explicitly
++ */
++ Scheme_Object *scheme_base_symbol = NULL;
++ MZ_GC_DECL_REG(1);
++ MZ_GC_VAR_IN_REG(0, scheme_base_symbol);
++ MZ_GC_REG();
++ /* invoke function from generated and included base.c */
++ declare_modules(environment);
++ scheme_base_symbol = scheme_intern_symbol("scheme/base");
++ MZ_GC_CHECK();
++ scheme_namespace_require(scheme_base_symbol);
++ MZ_GC_CHECK();
++ MZ_GC_UNREG();
++ }
++ #endif
++ register_vim_exn();
++ /* use new environment to initialise exception handling */
++ init_exn_catching_apply();
+
+ /* redirect output */
+ scheme_console_output = do_output;
+***************
+*** 776,823 ****
+
+ #ifdef MZSCHEME_COLLECTS
+ /* setup 'current-library-collection-paths' parameter */
+- scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS,
+- scheme_make_pair(
+ # if MZSCHEME_VERSION_MAJOR >= 299
+! scheme_char_string_to_path(
+! scheme_byte_string_to_char_string(
+! scheme_make_byte_string(MZSCHEME_COLLECTS))),
+ # else
+! scheme_make_string(MZSCHEME_COLLECTS),
+ # endif
+- scheme_null));
+ #endif
+ #ifdef HAVE_SANDBOX
+! /* setup sandbox guards */
+! proc_make_security_guard = scheme_lookup_global(
+! scheme_intern_symbol("make-security-guard"),
+! environment);
+! if (proc_make_security_guard != NULL)
+! {
+! Scheme_Object *args[3];
+! Scheme_Object *guard;
+! args[0] = scheme_get_param(scheme_config, MZCONFIG_SECURITY_GUARD);
+! args[1] = scheme_make_prim_w_arity(sandbox_file_guard,
+! "sandbox-file-guard", 3, 3);
+! args[2] = scheme_make_prim_w_arity(sandbox_network_guard,
+! "sandbox-network-guard", 4, 4);
+! guard = scheme_apply(proc_make_security_guard, 3, args);
+! scheme_set_param(scheme_config, MZCONFIG_SECURITY_GUARD, guard);
+ }
+ #endif
+ /* Create buffer and window types for use in Scheme code */
+ mz_buffer_type = scheme_make_type("<vim-buffer>");
+ mz_window_type = scheme_make_type("<vim-window>");
+
+! register_vim_exn(environment);
+! make_modules(environment);
+
+ /*
+ * setup callback to receive notifications
+ * whether thread scheduling is (or not) required
+ */
+ scheme_notify_multithread = notify_multithread;
+- initialized = 1;
+ }
+
+ /*
+--- 901,1031 ----
+
+ #ifdef MZSCHEME_COLLECTS
+ /* setup 'current-library-collection-paths' parameter */
+ # if MZSCHEME_VERSION_MAJOR >= 299
+! {
+! Scheme_Object *coll_byte_string = NULL;
+! Scheme_Object *coll_char_string = NULL;
+! Scheme_Object *coll_path = NULL;
+! Scheme_Object *coll_pair = NULL;
+! Scheme_Config *config = NULL;
+!
+! MZ_GC_DECL_REG(5);
+! MZ_GC_VAR_IN_REG(0, coll_byte_string);
+! MZ_GC_VAR_IN_REG(1, coll_char_string);
+! MZ_GC_VAR_IN_REG(2, coll_path);
+! MZ_GC_VAR_IN_REG(3, coll_pair);
+! MZ_GC_VAR_IN_REG(4, config);
+! MZ_GC_REG();
+! coll_byte_string = scheme_make_byte_string(MZSCHEME_COLLECTS);
+! MZ_GC_CHECK();
+! coll_char_string = scheme_byte_string_to_char_string(coll_byte_string);
+! MZ_GC_CHECK();
+! coll_path = scheme_char_string_to_path(coll_char_string);
+! MZ_GC_CHECK();
+! coll_pair = scheme_make_pair(coll_path, scheme_null);
+! MZ_GC_CHECK();
+! config = scheme_config;
+! MZ_GC_CHECK();
+! scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
+! MZ_GC_CHECK();
+! MZ_GC_UNREG();
+! }
+ # else
+! {
+! Scheme_Object *coll_string = NULL;
+! Scheme_Object *coll_pair = NULL;
+! Scheme_Config *config = NULL;
+!
+! MZ_GC_DECL_REG(3);
+! MZ_GC_VAR_IN_REG(0, coll_string);
+! MZ_GC_VAR_IN_REG(1, coll_pair);
+! MZ_GC_VAR_IN_REG(2, config);
+! MZ_GC_REG();
+! coll_string = scheme_make_string(MZSCHEME_COLLECTS);
+! MZ_GC_CHECK();
+! coll_pair = scheme_make_pair(coll_string, scheme_null);
+! MZ_GC_CHECK();
+! config = scheme_config;
+! MZ_GC_CHECK();
+! scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
+! MZ_GC_CHECK();
+! MZ_GC_UNREG();
+! }
+ # endif
+ #endif
+ #ifdef HAVE_SANDBOX
+! {
+! Scheme_Object *make_security_guard = NULL;
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, make_security_guard);
+! MZ_GC_REG();
+!
+! #if MZSCHEME_VERSION_MAJOR < 400
+! {
+! Scheme_Object *make_security_guard_symbol = NULL;
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, make_security_guard_symbol);
+! MZ_GC_REG();
+! make_security_guard_symbol = scheme_intern_symbol("make-security-guard");
+! MZ_GC_CHECK();
+! make_security_guard = scheme_lookup_global(
+! make_security_guard_symbol, environment);
+! MZ_GC_UNREG();
+! }
+! #else
+! make_security_guard = scheme_builtin_value("make-security-guard");
+! MZ_GC_CHECK();
+! #endif
+!
+! /* setup sandbox guards */
+! if (make_security_guard != NULL)
+! {
+! Scheme_Object *args[3] = {NULL, NULL, NULL};
+! Scheme_Object *guard = NULL;
+! Scheme_Config *config = NULL;
+! MZ_GC_DECL_REG(5);
+! MZ_GC_ARRAY_VAR_IN_REG(0, args, 3);
+! MZ_GC_VAR_IN_REG(3, guard);
+! MZ_GC_VAR_IN_REG(4, config);
+! MZ_GC_REG();
+! config = scheme_config;
+! MZ_GC_CHECK();
+! args[0] = scheme_get_param(config, MZCONFIG_SECURITY_GUARD);
+! MZ_GC_CHECK();
+! args[1] = scheme_make_prim_w_arity(sandbox_file_guard,
+! "sandbox-file-guard", 3, 3);
+! args[2] = scheme_make_prim_w_arity(sandbox_network_guard,
+! "sandbox-network-guard", 4, 4);
+! guard = scheme_apply(make_security_guard, 3, args);
+! MZ_GC_CHECK();
+! scheme_set_param(config, MZCONFIG_SECURITY_GUARD, guard);
+! MZ_GC_CHECK();
+! MZ_GC_UNREG();
+! }
+! MZ_GC_UNREG();
+ }
+ #endif
+ /* Create buffer and window types for use in Scheme code */
+ mz_buffer_type = scheme_make_type("<vim-buffer>");
++ MZ_GC_CHECK();
+ mz_window_type = scheme_make_type("<vim-window>");
++ MZ_GC_CHECK();
++ #ifdef MZ_PRECISE_GC
++ GC_register_traversers(mz_buffer_type,
++ buffer_size_proc, buffer_mark_proc, buffer_fixup_proc,
++ TRUE, TRUE);
++ GC_register_traversers(mz_window_type,
++ window_size_proc, window_mark_proc, window_fixup_proc,
++ TRUE, TRUE);
++ #endif
+
+! make_modules();
+
+ /*
+ * setup callback to receive notifications
+ * whether thread scheduling is (or not) required
+ */
+ scheme_notify_multithread = notify_multithread;
+ }
+
+ /*
+***************
+*** 827,897 ****
+ static int
+ mzscheme_init(void)
+ {
+- int do_require = FALSE;
+-
+ if (!initialized)
+ {
+- do_require = TRUE;
+ #ifdef DYNAMIC_MZSCHEME
+ if (!mzscheme_enabled(TRUE))
+ {
+! EMSG(_("???: Sorry, this command is disabled, the MzScheme library could not be loaded."));
+ return -1;
+ }
+ #endif
+ startup_mzscheme();
+!
+! if (mzscheme_io_init())
+! return -1;
+!
+! }
+! /* recreate ports each call effectivelly clearing these ones */
+! curout = scheme_make_string_output_port();
+! curerr = scheme_make_string_output_port();
+! scheme_set_param(scheme_config, MZCONFIG_OUTPUT_PORT, curout);
+! scheme_set_param(scheme_config, MZCONFIG_ERROR_PORT, curerr);
+!
+! if (do_require)
+! {
+! /* auto-instantiate in basic env */
+! eval_in_namespace("(require (prefix vimext: vimext))", do_eval,
+! environment, NULL);
+ }
+-
+- return 0;
+- }
+-
+- /*
+- * This routine fills the namespace with various important routines that can
+- * be used within MzScheme.
+- */
+- static void
+- mzscheme_interface_init(vim_mz_buffer *mzbuff)
+- {
+- Scheme_Object *attach;
+-
+- mzbuff->env = (Scheme_Env *)scheme_make_namespace(0, NULL);
+-
+- /*
+- * attach instantiated modules from global namespace
+- * so they can be easily instantiated in the buffer namespace
+- */
+- attach = scheme_lookup_global(
+- scheme_intern_symbol("namespace-attach-module"),
+- environment);
+-
+- if (attach != NULL)
+ {
+! Scheme_Object *ret;
+! Scheme_Object *args[2];
+!
+! args[0] = (Scheme_Object *)environment;
+! args[1] = scheme_intern_symbol("vimext");
+!
+! ret = (Scheme_Object *)mzvim_apply(attach, 2, args);
+ }
+
+! add_vim_exn(mzbuff->env);
+ }
+
+ /*
+--- 1035,1072 ----
+ static int
+ mzscheme_init(void)
+ {
+ if (!initialized)
+ {
+ #ifdef DYNAMIC_MZSCHEME
+ if (!mzscheme_enabled(TRUE))
+ {
+! EMSG(_("E812: Sorry, this command is disabled, the MzScheme libraries could not be loaded."));
+ return -1;
+ }
+ #endif
+ startup_mzscheme();
+! initialized = TRUE;
+ }
+ {
+! Scheme_Config *config = NULL;
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, config);
+! MZ_GC_REG();
+! config = scheme_config;
+! MZ_GC_CHECK();
+! /* recreate ports each call effectivelly clearing these ones */
+! curout = scheme_make_string_output_port();
+! MZ_GC_CHECK();
+! curerr = scheme_make_string_output_port();
+! MZ_GC_CHECK();
+! scheme_set_param(config, MZCONFIG_OUTPUT_PORT, curout);
+! MZ_GC_CHECK();
+! scheme_set_param(config, MZCONFIG_ERROR_PORT, curerr);
+! MZ_GC_CHECK();
+! MZ_GC_UNREG();
+ }
+
+! return 0;
+ }
+
+ /*
+***************
+*** 901,928 ****
+ */
+
+ /*
+! * Evaluate command in namespace with exception handling
+ */
+ static int
+! eval_in_namespace(void *data, Scheme_Closed_Prim *what, Scheme_Env *env,
+! Scheme_Object **ret)
+ {
+! Scheme_Object *value;
+! Scheme_Object *exn;
+! Cmd_Info info; /* closure info */
+!
+! info.data = data;
+! info.env = env;
+!
+! scheme_set_param(scheme_config, MZCONFIG_ENV,
+! (Scheme_Object *) env);
+! /*
+! * ensure all evaluations will be in current buffer namespace,
+! * the second argument to scheme_eval_string isn't enough!
+! */
+! value = _apply_thunk_catch_exceptions(
+! scheme_make_closed_prim_w_arity(what, &info, "mzvim", 0, 0),
+! &exn);
+
+ if (!value)
+ {
+--- 1076,1100 ----
+ */
+
+ /*
+! * Evaluate command with exception handling
+ */
+ static int
+! eval_with_exn_handling(void *data, Scheme_Closed_Prim *what, Scheme_Object **ret)
+ {
+! Scheme_Object *value = NULL;
+! Scheme_Object *exn = NULL;
+! Scheme_Object *prim = NULL;
+!
+! MZ_GC_DECL_REG(3);
+! MZ_GC_VAR_IN_REG(0, value);
+! MZ_GC_VAR_IN_REG(1, exn);
+! MZ_GC_VAR_IN_REG(2, prim);
+! MZ_GC_REG();
+!
+! prim = scheme_make_closed_prim_w_arity(what, data, "mzvim", 0, 0);
+! MZ_GC_CHECK();
+! value = _apply_thunk_catch_exceptions(prim, &exn);
+! MZ_GC_CHECK();
+
+ if (!value)
+ {
+***************
+*** 930,938 ****
+ /* Got an exn? */
+ if (value)
+ {
+! scheme_display(value, curerr); /* Send to stderr-vim */
+ do_flush();
+ }
+ /* `raise' was called on some arbitrary value */
+ return FAIL;
+ }
+--- 1102,1112 ----
+ /* Got an exn? */
+ if (value)
+ {
+! scheme_display(value, curerr); /* Send to stderr-vim */
+! MZ_GC_CHECK();
+ do_flush();
+ }
++ MZ_GC_UNREG();
+ /* `raise' was called on some arbitrary value */
+ return FAIL;
+ }
+***************
+*** 941,949 ****
+--- 1115,1127 ----
+ *ret = value;
+ /* Print any result, as long as it's not a void */
+ else if (!SCHEME_VOIDP(value))
++ {
+ scheme_display(value, curout); /* Send to stdout-vim */
++ MZ_GC_CHECK();
++ }
+
+ do_flush();
++ MZ_GC_UNREG();
+ return OK;
+ }
+
+***************
+*** 957,963 ****
+ range_start = eap->line1;
+ range_end = eap->line2;
+
+! return eval_in_namespace(data, what, get_vim_curr_buffer()->env, NULL);
+ }
+
+ /*
+--- 1135,1141 ----
+ range_start = eap->line1;
+ range_end = eap->line2;
+
+! return eval_with_exn_handling(data, what, NULL);
+ }
+
+ /*
+***************
+*** 974,979 ****
+--- 1152,1158 ----
+ bp->buf = INVALID_BUFFER_VALUE;
+ buf->b_mzscheme_ref = NULL;
+ scheme_gc_ptr_ok(bp);
++ MZ_GC_CHECK();
+ }
+ }
+
+***************
+*** 990,995 ****
+--- 1169,1175 ----
+ wp->win = INVALID_WINDOW_VALUE;
+ win->w_mzscheme_ref = NULL;
+ scheme_gc_ptr_ok(wp);
++ MZ_GC_CHECK();
+ }
+ }
+
+***************
+*** 1014,1031 ****
+ }
+ }
+
+- /* eval MzScheme string */
+- void *
+- mzvim_eval_string(char_u *str)
+- {
+- Scheme_Object *ret = NULL;
+- if (mzscheme_init())
+- return FAIL;
+-
+- eval_in_namespace(str, do_eval, get_vim_curr_buffer()->env, &ret);
+- return ret;
+- }
+-
+ /*
+ * apply MzScheme procedure with arguments,
+ * handling errors
+--- 1194,1199 ----
+***************
+*** 1033,1075 ****
+ Scheme_Object *
+ mzvim_apply(Scheme_Object *proc, int argc, Scheme_Object **argv)
+ {
+- Apply_Info data;
+- Scheme_Object *ret = NULL;
+-
+ if (mzscheme_init())
+ return FAIL;
+
+! data.proc = proc;
+! data.argc = argc;
+! data.argv = argv;
+!
+! eval_in_namespace(&data, do_apply, get_vim_curr_buffer()->env, &ret);
+! return ret;
+ }
+
+ static Scheme_Object *
+ do_load(void *data, int noargc, Scheme_Object **noargv)
+ {
+! Cmd_Info *info = (Cmd_Info *)data;
+! Scheme_Object *result = scheme_void;
+! Scheme_Object *expr;
+! char_u *file = scheme_malloc_fail_ok(
+! scheme_malloc_atomic, MAXPATHL + 1);
+! Port_Info *pinfo = (Port_Info *)(info->data);
+
+ /* make Vim expansion */
+! expand_env((char_u *)pinfo->name, file, MAXPATHL);
+! /* scheme_load looks strange working with namespaces and error handling*/
+ pinfo->port = scheme_open_input_file(file, "mzfile");
+! scheme_count_lines(pinfo->port); /* to get accurate read error location*/
+
+ /* Like REPL but print only last result */
+ while (!SCHEME_EOFP(expr = scheme_read(pinfo->port)))
+! result = scheme_eval(expr, info->env);
+
+ /* errors will be caught in do_mzscheme_comamnd and ex_mzfile */
+ scheme_close_input_port(pinfo->port);
+ pinfo->port = NULL;
+ return result;
+ }
+
+--- 1201,1265 ----
+ Scheme_Object *
+ mzvim_apply(Scheme_Object *proc, int argc, Scheme_Object **argv)
+ {
+ if (mzscheme_init())
+ return FAIL;
++ else
++ {
++ Apply_Info data = {NULL, 0, NULL};
++ Scheme_Object *ret = NULL;
+
+! MZ_GC_DECL_REG(5);
+! MZ_GC_VAR_IN_REG(0, ret);
+! MZ_GC_VAR_IN_REG(1, data.proc);
+! MZ_GC_ARRAY_VAR_IN_REG(2, data.argv, argc);
+! MZ_GC_REG();
+!
+! data.proc = proc;
+! data.argc = argc;
+! data.argv = argv;
+!
+! eval_with_exn_handling(&data, do_apply, &ret);
+! MZ_GC_UNREG();
+! return ret;
+! }
+ }
+
+ static Scheme_Object *
+ do_load(void *data, int noargc, Scheme_Object **noargv)
+ {
+! Scheme_Object *expr = NULL;
+! Scheme_Object *result = NULL;
+! char *file = NULL;
+! Port_Info *pinfo = (Port_Info *)data;
+!
+! MZ_GC_DECL_REG(3);
+! MZ_GC_VAR_IN_REG(0, expr);
+! MZ_GC_VAR_IN_REG(1, result);
+! MZ_GC_VAR_IN_REG(2, file);
+! MZ_GC_REG();
+!
+! file = (char *)scheme_malloc_fail_ok(scheme_malloc_atomic, MAXPATHL + 1);
+! MZ_GC_CHECK();
+
+ /* make Vim expansion */
+! expand_env((char_u *)pinfo->name, (char_u *)file, MAXPATHL);
+ pinfo->port = scheme_open_input_file(file, "mzfile");
+! MZ_GC_CHECK();
+! scheme_count_lines(pinfo->port); /* to get accurate read error location*/
+! MZ_GC_CHECK();
+
+ /* Like REPL but print only last result */
+ while (!SCHEME_EOFP(expr = scheme_read(pinfo->port)))
+! {
+! result = scheme_eval(expr, environment);
+! MZ_GC_CHECK();
+! }
+
+ /* errors will be caught in do_mzscheme_comamnd and ex_mzfile */
+ scheme_close_input_port(pinfo->port);
++ MZ_GC_CHECK();
+ pinfo->port = NULL;
++ MZ_GC_UNREG();
+ return result;
+ }
+
+***************
+*** 1077,1089 ****
+ void
+ ex_mzfile(exarg_T *eap)
+ {
+! Port_Info pinfo;
+
+ pinfo.name = (char *)eap->arg;
+- pinfo.port = NULL;
+ if (do_mzscheme_command(eap, &pinfo, do_load) != OK
+ && pinfo.port != NULL) /* looks like port was not closed */
+ scheme_close_input_port(pinfo.port);
+ }
+
+
+--- 1267,1286 ----
+ void
+ ex_mzfile(exarg_T *eap)
+ {
+! Port_Info pinfo = {NULL, NULL};
+!
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, pinfo.port);
+! MZ_GC_REG();
+
+ pinfo.name = (char *)eap->arg;
+ if (do_mzscheme_command(eap, &pinfo, do_load) != OK
+ && pinfo.port != NULL) /* looks like port was not closed */
++ {
+ scheme_close_input_port(pinfo.port);
++ MZ_GC_CHECK();
++ }
++ MZ_GC_UNREG();
+ }
+
+
+***************
+*** 1103,1116 ****
+ "(with-handlers ([void (lambda (exn) (cons #f exn))]) "
+ "(cons #t (thunk))))";
+
+! /* make sure we have a namespace with the standard syntax: */
+! Scheme_Env *env = (Scheme_Env *)scheme_make_namespace(0, NULL);
+! add_vim_exn(env);
+!
+! exn_catching_apply = scheme_eval_string(e, env);
+! exn_p = scheme_lookup_global(scheme_intern_symbol("exn?"), env);
+! exn_message = scheme_lookup_global(
+! scheme_intern_symbol("exn-message"), env);
+ }
+ }
+
+--- 1300,1311 ----
+ "(with-handlers ([void (lambda (exn) (cons #f exn))]) "
+ "(cons #t (thunk))))";
+
+! exn_catching_apply = scheme_eval_string(e, environment);
+! MZ_GC_CHECK();
+! exn_p = scheme_builtin_value("exn?");
+! MZ_GC_CHECK();
+! exn_message = scheme_builtin_value("exn-message");
+! MZ_GC_CHECK();
+ }
+ }
+
+***************
+*** 1124,1131 ****
+ {
+ Scheme_Object *v;
+
+- init_exn_catching_apply();
+-
+ v = _scheme_apply(exn_catching_apply, 1, &f);
+ /* v is a pair: (cons #t value) or (cons #f exn) */
+
+--- 1319,1324 ----
+***************
+*** 1141,1148 ****
+ static Scheme_Object *
+ extract_exn_message(Scheme_Object *v)
+ {
+- init_exn_catching_apply();
+-
+ if (SCHEME_TRUEP(_scheme_apply(exn_p, 1, &v)))
+ return _scheme_apply(exn_message, 1, &v);
+ else
+--- 1334,1339 ----
+***************
+*** 1152,1167 ****
+ static Scheme_Object *
+ do_eval(void *s, int noargc, Scheme_Object **noargv)
+ {
+! Cmd_Info *info = (Cmd_Info *)s;
+!
+! return scheme_eval_string_all((char *)(info->data), info->env, TRUE);
+ }
+
+ static Scheme_Object *
+ do_apply(void *a, int noargc, Scheme_Object **noargv)
+ {
+! Apply_Info *info = (Apply_Info *)(((Cmd_Info *)a)->data);
+!
+ return scheme_apply(info->proc, info->argc, info->argv);
+ }
+
+--- 1343,1355 ----
+ static Scheme_Object *
+ do_eval(void *s, int noargc, Scheme_Object **noargv)
+ {
+! return scheme_eval_string_all((char *)s, environment, TRUE);
+ }
+
+ static Scheme_Object *
+ do_apply(void *a, int noargc, Scheme_Object **noargv)
+ {
+! Apply_Info *info = (Apply_Info *)a;
+ return scheme_apply(info->proc, info->argc, info->argv);
+ }
+
+***************
+*** 1219,1224 ****
+--- 1407,1413 ----
+ long length;
+
+ buff = scheme_get_sized_string_output(curerr, &length);
++ MZ_GC_CHECK();
+ if (length)
+ {
+ do_err_output(buff, length);
+***************
+*** 1226,1242 ****
+ }
+
+ buff = scheme_get_sized_string_output(curout, &length);
+ if (length)
+ do_output(buff, length);
+ }
+
+- static int
+- mzscheme_io_init(void)
+- {
+- /* Nothing needed so far... */
+- return 0;
+- }
+-
+ /*
+ *========================================================================
+ * 4. Implementation of the Vim Features for MzScheme
+--- 1415,1425 ----
+ }
+
+ buff = scheme_get_sized_string_output(curout, &length);
++ MZ_GC_CHECK();
+ if (length)
+ do_output(buff, length);
+ }
+
+ /*
+ *========================================================================
+ * 4. Implementation of the Vim Features for MzScheme
+***************
+*** 1263,1284 ****
+ vim_eval(void *data, int argc, Scheme_Object **argv)
+ {
+ #ifdef FEAT_EVAL
+! Vim_Prim *prim = (Vim_Prim *)data;
+! char *expr;
+! char *str;
+! Scheme_Object *result;
+
+! expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
+
+! str = (char *)eval_to_string((char_u *)expr, NULL, TRUE);
+
+! if (str == NULL)
+ raise_vim_exn(_("invalid expression"));
+
+! result = scheme_make_string(str);
+!
+! vim_free(str);
+
+ return result;
+ #else
+ raise_vim_exn(_("expressions disabled at compile time"));
+--- 1446,1475 ----
+ vim_eval(void *data, int argc, Scheme_Object **argv)
+ {
+ #ifdef FEAT_EVAL
+! Vim_Prim *prim = (Vim_Prim *)data;
+! char *expr;
+! Scheme_Object *result;
+! /* hash table to store visited values to avoid infinite loops */
+! Scheme_Hash_Table *visited = NULL;
+! typval_T *vim_result;
+!
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, visited);
+! MZ_GC_REG();
+
+! visited = scheme_make_hash_table(SCHEME_hash_ptr);
+! MZ_GC_CHECK();
+
+! expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
+! vim_result = eval_expr((char_u *)expr, NULL);
+
+! if (vim_result == NULL)
+ raise_vim_exn(_("invalid expression"));
+
+! result = vim_to_mzscheme(vim_result, 1, visited);
+! free_tv(vim_result);
+
++ MZ_GC_UNREG();
+ return result;
+ #else
+ raise_vim_exn(_("expressions disabled at compile time"));
+***************
+*** 1318,1324 ****
+ Vim_Prim *prim = (Vim_Prim *)data;
+ char_u *name;
+ long value;
+! char_u *strval;
+ int rc;
+ Scheme_Object *rval;
+ int opt_flags = 0;
+--- 1509,1515 ----
+ Vim_Prim *prim = (Vim_Prim *)data;
+ char_u *name;
+ long value;
+! char *strval;
+ int rc;
+ Scheme_Object *rval;
+ int opt_flags = 0;
+***************
+*** 1333,1338 ****
+--- 1524,1530 ----
+ {
+ MZ_REGISTER_STATIC(M_global);
+ M_global = scheme_intern_symbol("global");
++ MZ_GC_CHECK();
+ }
+
+ if (argv[1] == M_global)
+***************
+*** 1354,1360 ****
+ scheme_wrong_type(prim->name, "vim-buffer/window", 1, argc, argv);
+ }
+
+! rc = get_option_value(name, &value, &strval, opt_flags);
+ curbuf = save_curb;
+ curwin = save_curw;
+
+--- 1546,1552 ----
+ scheme_wrong_type(prim->name, "vim-buffer/window", 1, argc, argv);
+ }
+
+! rc = get_option_value(name, &value, (char_u **)&strval, opt_flags);
+ curbuf = save_curb;
+ curwin = save_curw;
+
+***************
+*** 1364,1369 ****
+--- 1556,1562 ----
+ return scheme_make_integer_value(value);
+ case 0:
+ rval = scheme_make_string(strval);
++ MZ_GC_CHECK();
+ vim_free(strval);
+ return rval;
+ case -1:
+***************
+*** 1393,1398 ****
+--- 1586,1592 ----
+ {
+ MZ_REGISTER_STATIC(M_global);
+ M_global = scheme_intern_symbol("global");
++ MZ_GC_CHECK();
+ }
+
+ if (argv[1] == M_global)
+***************
+*** 1463,1469 ****
+--- 1657,1666 ----
+
+ for (w = firstwin; w != NULL; w = w->w_next)
+ if (w->w_buffer == buf->buf)
++ {
+ list = scheme_make_pair(window_new(w), list);
++ MZ_GC_CHECK();
++ }
+
+ return list;
+ }
+***************
+*** 1471,1477 ****
+ static Scheme_Object *
+ window_new(win_T *win)
+ {
+! vim_mz_window *self;
+
+ /* We need to handle deletion of windows underneath us.
+ * If we add a "w_mzscheme_ref" field to the win_T structure,
+--- 1668,1678 ----
+ static Scheme_Object *
+ window_new(win_T *win)
+ {
+! vim_mz_window *self = NULL;
+!
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, self);
+! MZ_GC_REG();
+
+ /* We need to handle deletion of windows underneath us.
+ * If we add a "w_mzscheme_ref" field to the win_T structure,
+***************
+*** 1485,1497 ****
+ return win->w_mzscheme_ref;
+
+ self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_window));
+-
+ vim_memset(self, 0, sizeof(vim_mz_window));
+ scheme_dont_gc_ptr(self); /* because win isn't visible to GC */
+ win->w_mzscheme_ref = self;
+ self->win = win;
+! self->tag = mz_window_type;
+
+ return (Scheme_Object *)(self);
+ }
+
+--- 1686,1699 ----
+ return win->w_mzscheme_ref;
+
+ self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_window));
+ vim_memset(self, 0, sizeof(vim_mz_window));
+ scheme_dont_gc_ptr(self); /* because win isn't visible to GC */
++ MZ_GC_CHECK();
+ win->w_mzscheme_ref = self;
+ self->win = win;
+! self->so.type = mz_window_type;
+
++ MZ_GC_UNREG();
+ return (Scheme_Object *)(self);
+ }
+
+***************
+*** 1660,1666 ****
+ /*
+ *===========================================================================
+ * 6. Vim Buffer-related Manipulation Functions
+- * Note that each buffer should have its own private namespace.
+ *===========================================================================
+ */
+
+--- 1862,1867 ----
+***************
+*** 1669,1682 ****
+ mzscheme_open_buffer(void *data, int argc, Scheme_Object **argv)
+ {
+ Vim_Prim *prim = (Vim_Prim *)data;
+! char *fname;
+ int num = 0;
+ Scheme_Object *onum;
+
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+! fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
+ /* TODO make open existing file */
+ num = buflist_add(fname, BLN_LISTED | BLN_CURBUF);
+
+--- 1870,1883 ----
+ mzscheme_open_buffer(void *data, int argc, Scheme_Object **argv)
+ {
+ Vim_Prim *prim = (Vim_Prim *)data;
+! char_u *fname;
+ int num = 0;
+ Scheme_Object *onum;
+
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+! fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
+ /* TODO make open existing file */
+ num = buflist_add(fname, BLN_LISTED | BLN_CURBUF);
+
+***************
+*** 1712,1718 ****
+ buf_T *buf;
+ char_u *fname;
+
+! fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
+
+ for (buf = firstbuf; buf; buf = buf->b_next)
+ if (buf->b_ffname == NULL || buf->b_sfname == NULL)
+--- 1913,1919 ----
+ buf_T *buf;
+ char_u *fname;
+
+! fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
+
+ for (buf = firstbuf; buf; buf = buf->b_next)
+ if (buf->b_ffname == NULL || buf->b_sfname == NULL)
+***************
+*** 1783,1789 ****
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf = get_buffer_arg(prim->name, 0, argc, argv);
+
+! return scheme_make_string(buf->buf->b_ffname);
+ }
+
+ /* (curr-buff) */
+--- 1984,1990 ----
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf = get_buffer_arg(prim->name, 0, argc, argv);
+
+! return scheme_make_string((char *)buf->buf->b_ffname);
+ }
+
+ /* (curr-buff) */
+***************
+*** 1796,1802 ****
+ static Scheme_Object *
+ buffer_new(buf_T *buf)
+ {
+! vim_mz_buffer *self;
+
+ /* We need to handle deletion of buffers underneath us.
+ * If we add a "b_mzscheme_ref" field to the buf_T structure,
+--- 1997,2007 ----
+ static Scheme_Object *
+ buffer_new(buf_T *buf)
+ {
+! vim_mz_buffer *self = NULL;
+!
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, self);
+! MZ_GC_REG();
+
+ /* We need to handle deletion of buffers underneath us.
+ * If we add a "b_mzscheme_ref" field to the buf_T structure,
+***************
+*** 1806,1820 ****
+ return buf->b_mzscheme_ref;
+
+ self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_buffer));
+-
+ vim_memset(self, 0, sizeof(vim_mz_buffer));
+! scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */
+ buf->b_mzscheme_ref = self;
+ self->buf = buf;
+! self->tag = mz_buffer_type;
+!
+! mzscheme_interface_init(self); /* Set up namespace */
+
+ return (Scheme_Object *)(self);
+ }
+
+--- 2011,2024 ----
+ return buf->b_mzscheme_ref;
+
+ self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_buffer));
+ vim_memset(self, 0, sizeof(vim_mz_buffer));
+! scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */
+! MZ_GC_CHECK();
+ buf->b_mzscheme_ref = self;
+ self->buf = buf;
+! self->so.type = mz_buffer_type;
+
++ MZ_GC_UNREG();
+ return (Scheme_Object *)(self);
+ }
+
+***************
+*** 1845,1858 ****
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf;
+ int linenr;
+! char *line;
+
+ buf = get_buffer_arg(prim->name, 1, argc, argv);
+ linenr = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
+ line = ml_get_buf(buf->buf, (linenr_T)linenr, FALSE);
+
+ raise_if_error();
+! return scheme_make_string(line);
+ }
+
+
+--- 2049,2062 ----
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf;
+ int linenr;
+! char_u *line;
+
+ buf = get_buffer_arg(prim->name, 1, argc, argv);
+ linenr = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
+ line = ml_get_buf(buf->buf, (linenr_T)linenr, FALSE);
+
+ raise_if_error();
+! return scheme_make_string((char *)line);
+ }
+
+
+***************
+*** 1869,1875 ****
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf;
+ int i, hi, lo, n;
+! Scheme_Object *list;
+
+ buf = get_buffer_arg(prim->name, 2, argc, argv);
+ list = scheme_null;
+--- 2073,2083 ----
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf;
+ int i, hi, lo, n;
+! Scheme_Object *list = NULL;
+!
+! MZ_GC_DECL_REG(1);
+! MZ_GC_VAR_IN_REG(0, list);
+! MZ_GC_REG();
+
+ buf = get_buffer_arg(prim->name, 2, argc, argv);
+ list = scheme_null;
+***************
+*** 1897,1904 ****
+
+ /* Set the list item */
+ list = scheme_make_pair(str, list);
+ }
+!
+ return list;
+ }
+
+--- 2105,2113 ----
+
+ /* Set the list item */
+ list = scheme_make_pair(str, list);
++ MZ_GC_CHECK();
+ }
+! MZ_GC_UNREG();
+ return list;
+ }
+
+***************
+*** 1925,1935 ****
+ */
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf;
+! Scheme_Object *line;
+ char *save;
+- buf_T *savebuf;
+ int n;
+
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+--- 2134,2147 ----
+ */
+ Vim_Prim *prim = (Vim_Prim *)data;
+ vim_mz_buffer *buf;
+! Scheme_Object *line = NULL;
+ char *save;
+ int n;
+
++ MZ_GC_DECL_REG(1);
++ MZ_GC_VAR_IN_REG(0, line);
++ MZ_GC_REG();
++
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+***************
+*** 1943,1949 ****
+
+ if (SCHEME_FALSEP(line))
+ {
+! savebuf = curbuf;
+ curbuf = buf->buf;
+
+ if (u_savedel((linenr_T)n, 1L) == FAIL)
+--- 2155,2162 ----
+
+ if (SCHEME_FALSEP(line))
+ {
+! buf_T *savebuf = curbuf;
+!
+ curbuf = buf->buf;
+
+ if (u_savedel((linenr_T)n, 1L) == FAIL)
+***************
+*** 1962,1994 ****
+
+ curbuf = savebuf;
+
+ raise_if_error();
+ return scheme_void;
+ }
+
+! /* Otherwise it's a line */
+! save = string_to_line(line);
+! savebuf = curbuf;
+
+! curbuf = buf->buf;
+
+- if (u_savesub((linenr_T)n) == FAIL)
+- {
+- curbuf = savebuf;
+- raise_vim_exn(_("cannot save undo information"));
+- }
+- else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL)
+- {
+ curbuf = savebuf;
+- raise_vim_exn(_("cannot replace line"));
+- }
+- else
+- changed_bytes((linenr_T)n, 0);
+
+! curbuf = savebuf;
+
+! raise_if_error();
+! return scheme_void;
+ }
+
+ /*
+--- 2175,2230 ----
+
+ curbuf = savebuf;
+
++ MZ_GC_UNREG();
+ raise_if_error();
+ return scheme_void;
+ }
++ else
++ {
++ /* Otherwise it's a line */
++ buf_T *savebuf = curbuf;
+
+! save = string_to_line(line);
+
+! curbuf = buf->buf;
+!
+! if (u_savesub((linenr_T)n) == FAIL)
+! {
+! curbuf = savebuf;
+! vim_free(save);
+! raise_vim_exn(_("cannot save undo information"));
+! }
+! else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL)
+! {
+! curbuf = savebuf;
+! vim_free(save);
+! raise_vim_exn(_("cannot replace line"));
+! }
+! else
+! {
+! vim_free(save);
+! changed_bytes((linenr_T)n, 0);
+! }
+
+ curbuf = savebuf;
+
+! /* Check that the cursor is not beyond the end of the line now. */
+! if (buf->buf == curwin->w_buffer)
+! check_cursor_col();
+
+! MZ_GC_UNREG();
+! raise_if_error();
+! return scheme_void;
+! }
+! }
+!
+! static void
+! free_array(char **array)
+! {
+! char **curr = array;
+! while (*curr != NULL)
+! vim_free(*curr++);
+! vim_free(array);
+ }
+
+ /*
+***************
+*** 2013,2027 ****
+ * 3. Anything else - this is an error.
+ */
+ Vim_Prim *prim = (Vim_Prim *)data;
+! vim_mz_buffer *buf;
+! Scheme_Object *line_list;
+! Scheme_Object *line;
+! Scheme_Object *rest;
+! char **array;
+! buf_T *savebuf;
+ int i, old_len, new_len, hi, lo;
+ long extra;
+
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+--- 2249,2263 ----
+ * 3. Anything else - this is an error.
+ */
+ Vim_Prim *prim = (Vim_Prim *)data;
+! vim_mz_buffer *buf = NULL;
+! Scheme_Object *line_list = NULL;
+ int i, old_len, new_len, hi, lo;
+ long extra;
+
++ MZ_GC_DECL_REG(1);
++ MZ_GC_VAR_IN_REG(0, line_list);
++ MZ_GC_REG();
++
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+***************
+*** 2047,2053 ****
+
+ if (SCHEME_FALSEP(line_list) || SCHEME_NULLP(line_list))
+ {
+! savebuf = curbuf;
+ curbuf = buf->buf;
+
+ if (u_savedel((linenr_T)lo, (long)old_len) == FAIL)
+--- 2283,2289 ----
+
+ if (SCHEME_FALSEP(line_list) || SCHEME_NULLP(line_list))
+ {
+! buf_T *savebuf = curbuf;
+ curbuf = buf->buf;
+
+ if (u_savedel((linenr_T)lo, (long)old_len) == FAIL)
+***************
+*** 2070,2167 ****
+
+ curbuf = savebuf;
+
+ raise_if_error();
+ return scheme_void;
+ }
+
+! /* List */
+! new_len = scheme_proper_list_length(line_list);
+! if (new_len < 0) /* improper or cyclic list */
+! scheme_wrong_type(prim->name, "proper list",
+! 2, argc, argv);
+
+! /* Using MzScheme allocator, so we don't need to free this and
+! * can safely keep pointers to GC collected strings
+! */
+! array = (char **)scheme_malloc_fail_ok(scheme_malloc,
+! (unsigned)(new_len * sizeof(char *)));
+
+! rest = line_list;
+! for (i = 0; i < new_len; ++i)
+! {
+! line = SCHEME_CAR(rest);
+! rest = SCHEME_CDR(rest);
+! if (!SCHEME_STRINGP(line))
+! scheme_wrong_type(prim->name, "string-list", 2, argc, argv);
+! array[i] = string_to_line(line);
+! }
+
+! savebuf = curbuf;
+! curbuf = buf->buf;
+
+! if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
+! {
+! curbuf = savebuf;
+! raise_vim_exn(_("cannot save undo information"));
+! }
+
+! /*
+! * If the size of the range is reducing (ie, new_len < old_len) we
+! * need to delete some old_len. We do this at the start, by
+! * repeatedly deleting line "lo".
+! */
+! for (i = 0; i < old_len - new_len; ++i)
+! {
+! if (ml_delete((linenr_T)lo, FALSE) == FAIL)
+! {
+! curbuf = savebuf;
+! raise_vim_exn(_("cannot delete line"));
+! }
+! extra--;
+! }
+
+! /*
+! * For as long as possible, replace the existing old_len with the
+! * new old_len. This is a more efficient operation, as it requires
+! * less memory allocation and freeing.
+! */
+! for (i = 0; i < old_len && i < new_len; i++)
+! if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL)
+! {
+! curbuf = savebuf;
+! raise_vim_exn(_("cannot replace line"));
+! }
+
+! /*
+! * Now we may need to insert the remaining new_len. We don't need to
+! * free the string passed back because MzScheme has control of that
+! * memory.
+! */
+! while (i < new_len)
+! {
+! if (ml_append((linenr_T)(lo + i - 1),
+! (char_u *)array[i], 0, FALSE) == FAIL)
+! {
+! curbuf = savebuf;
+! raise_vim_exn(_("cannot insert line"));
+ }
+- ++i;
+- ++extra;
+- }
+
+! /*
+! * Adjust marks. Invalidate any which lie in the
+! * changed range, and move any in the remainder of the buffer.
+! */
+! mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra);
+! changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
+
+! if (buf->buf == curwin->w_buffer)
+! mz_fix_cursor(lo, hi, extra);
+! curbuf = savebuf;
+
+! raise_if_error();
+! return scheme_void;
+ }
+
+ /*
+--- 2306,2426 ----
+
+ curbuf = savebuf;
+
++ MZ_GC_UNREG();
+ raise_if_error();
+ return scheme_void;
+ }
++ else
++ {
++ buf_T *savebuf = curbuf;
+
+! /* List */
+! new_len = scheme_proper_list_length(line_list);
+! MZ_GC_CHECK();
+! if (new_len < 0) /* improper or cyclic list */
+! scheme_wrong_type(prim->name, "proper list",
+! 2, argc, argv);
+! else
+! {
+! char **array = NULL;
+! Scheme_Object *line = NULL;
+! Scheme_Object *rest = NULL;
+!
+! MZ_GC_DECL_REG(2);
+! MZ_GC_VAR_IN_REG(0, line);
+! MZ_GC_VAR_IN_REG(1, rest);
+! MZ_GC_REG();
+
+! array = (char **)alloc(new_len * sizeof(char *));
+! vim_memset(array, 0, new_len * sizeof(char *));
+
+! rest = line_list;
+! for (i = 0; i < new_len; ++i)
+! {
+! line = SCHEME_CAR(rest);
+! rest = SCHEME_CDR(rest);
+! if (!SCHEME_STRINGP(line))
+! {
+! free_array(array);
+! scheme_wrong_type(prim->name, "string-list", 2, argc, argv);
+! }
+! array[i] = string_to_line(line);
+! }
+
+! curbuf = buf->buf;
+
+! if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
+! {
+! curbuf = savebuf;
+! free_array(array);
+! raise_vim_exn(_("cannot save undo information"));
+! }
+
+! /*
+! * If the size of the range is reducing (ie, new_len < old_len) we
+! * need to delete some old_len. We do this at the start, by
+! * repeatedly deleting line "lo".
+! */
+! for (i = 0; i < old_len - new_len; ++i)
+! {
+! if (ml_delete((linenr_T)lo, FALSE) == FAIL)
+! {
+! curbuf = savebuf;
+! free_array(array);
+! raise_vim_exn(_("cannot delete line"));
+! }
+! extra--;
+! }
+
+! /*
+! * For as long as possible, replace the existing old_len with the
+! * new old_len. This is a more efficient operation, as it requires
+! * less memory allocation and freeing.
+! */
+! for (i = 0; i < old_len && i < new_len; i++)
+! if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL)
+! {
+! curbuf = savebuf;
+! free_array(array);
+! raise_vim_exn(_("cannot replace line"));
+! }
+
+! /*
+! * Now we may need to insert the remaining new_len. We don't need to
+! * free the string passed back because MzScheme has control of that
+! * memory.
+! */
+! while (i < new_len)
+! {
+! if (ml_append((linenr_T)(lo + i - 1),
+! (char_u *)array[i], 0, FALSE) == FAIL)
+! {
+! curbuf = savebuf;
+! free_array(array);
+! raise_vim_exn(_("cannot insert line"));
+! }
+! ++i;
+! ++extra;
+! }
+! MZ_GC_UNREG();
+! free_array(array);
+ }
+
+! /*
+! * Adjust marks. Invalidate any which lie in the
+! * changed range, and move any in the remainder of the buffer.
+! */
+! mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra);
+! changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
+
+! if (buf->buf == curwin->w_buffer)
+! mz_fix_cursor(lo, hi, extra);
+! curbuf = savebuf;
+
+! MZ_GC_UNREG();
+! raise_if_error();
+! return scheme_void;
+! }
+ }
+
+ /*
+***************
+*** 2179,2193 ****
+ insert_buffer_line_list(void *data, int argc, Scheme_Object **argv)
+ {
+ Vim_Prim *prim = (Vim_Prim *)data;
+! vim_mz_buffer *buf;
+! Scheme_Object *list;
+! Scheme_Object *line;
+! Scheme_Object *rest;
+! char **array;
+! char *str;
+! buf_T *savebuf;
+ int i, n, size;
+
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+--- 2438,2452 ----
+ insert_buffer_line_list(void *data, int argc, Scheme_Object **argv)
+ {
+ Vim_Prim *prim = (Vim_Prim *)data;
+! vim_mz_buffer *buf = NULL;
+! Scheme_Object *list = NULL;
+! char *str = NULL;
+ int i, n, size;
+
++ MZ_GC_DECL_REG(1);
++ MZ_GC_VAR_IN_REG(0, list);
++ MZ_GC_REG();
++
+ #ifdef HAVE_SANDBOX
+ sandbox_check();
+ #endif
+***************
+*** 2206,2294 ****
+ check_line_range(n, buf->buf);
+ if (SCHEME_STRINGP(list))
+ {
+! str = string_to_line(list);
+
+! savebuf = curbuf;
+ curbuf = buf->buf;
+
+ if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL)
+ {
+ curbuf = savebuf;
+ raise_vim_exn(_("cannot save undo information"));
+ }
+ else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL)
+ {
+ curbuf = savebuf;
+ raise_vim_exn(_("cannot insert line"));
+ }
+ else
+ appended_lines_mark((linenr_T)n, 1L);
+
+ curbuf = savebuf;
+ update_screen(VALID);
+
+ raise_if_error();
+ return scheme_void;
+ }
+
+ /* List */
+ size = scheme_proper_list_length(list);
+ if (size < 0) /* improper or cyclic list */
+ scheme_wrong_type(prim->name, "proper list",
+ 2, argc, argv);
+!
+! /* Using MzScheme allocator, so we don't need to free this and
+! * can safely keep pointers to GC collected strings
+! */
+! array = (char **)scheme_malloc_fail_ok(
+! scheme_malloc, (unsigned)(size * sizeof(char *)));
+!
+! rest = list;
+! for (i = 0; i < size; ++i)
+ {
+! line = SCHEME_CAR(rest);
+! rest = SCHEME_CDR(rest);
+! array[i] = string_to_line(line);
+! }
+
+! savebuf = curbuf;
+! curbuf = buf->buf;
+
+! if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
+! {
+! curbuf = savebuf;
+! raise_vim_exn(_("cannot save undo information"));
+! }
+! else
+! {
+ for (i = 0; i < size; ++i)
+! if (ml_append((linenr_T)(n + i), (char_u *)array[i],
+! 0, FALSE) == FAIL)
+! {
+! curbuf = savebuf;
+! raise_vim_exn(_("cannot insert line"));
+! }
+
+! if (i > 0)
+! appended_lines_mark((linenr_T)n, (long)i);
+! }
+
+! curbuf = savebuf;
+! update_screen(VALID);
+
+ raise_if_error();
+ return scheme_void;
+ }
+
+- /* (get-buff-namespace [buffer]) */
+- static Scheme_Object *
+- get_buffer_namespace(void *data, int argc, Scheme_Object **argv)
+- {
+- Vim_Prim *prim = (Vim_Prim *)data;
+-
+- return (Scheme_Object *)get_buffer_arg(prim->name, 0, argc, argv)->env;
+- }
+-
+ /*
+ * Predicates
+ */
+--- 2465,2563 ----
+ check_line_range(n, buf->buf);
+ if (SCHEME_STRINGP(list))
+ {
+! buf_T *savebuf = curbuf;
+
+! str = string_to_line(list);
+ curbuf = buf->buf;
+
+ if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL)
+ {
+ curbuf = savebuf;
++ vim_free(str);
+ raise_vim_exn(_("cannot save undo information"));
+ }
+ else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL)
+ {
+ curbuf = savebuf;
++ vim_free(str);
+ raise_vim_exn(_("cannot insert line"));
+ }
+ else
++ {
++ vim_free(str);
+ appended_lines_mark((linenr_T)n, 1L);
++ }
+
+ curbuf = savebuf;
+ update_screen(VALID);
+
++ MZ_GC_UNREG();
+ raise_if_error();
+ return scheme_void;
+ }
+
+ /* List */
+ size = scheme_proper_list_length(list);
++ MZ_GC_CHECK();
+ if (size < 0) /* improper or cyclic list */
+ scheme_wrong_type(prim->name, "proper list",
+ 2, argc, argv);
+! else
+ {
+! Scheme_Object *line = NULL;
+! Scheme_Object *rest = NULL;
+! char **array;
+! buf_T *savebuf = curbuf;
+!
+! MZ_GC_DECL_REG(2);
+! MZ_GC_VAR_IN_REG(0, line);
+! MZ_GC_VAR_IN_REG(1, rest);
+! MZ_GC_REG();
+
+! array = (char **)alloc(size * sizeof(char *));
+! vim_memset(array, 0, size * sizeof(char *));
+
+! rest = list;
+ for (i = 0; i < size; ++i)
+! {
+! line = SCHEME_CAR(rest);
+! rest = SCHEME_CDR(rest);
+! array[i] = string_to_line(line);
+! }
+
+! curbuf = buf->buf;
+
+! if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
+! {
+! curbuf = savebuf;
+! free_array(array);
+! raise_vim_exn(_("cannot save undo information"));
+! }
+! else
+! {
+! for (i = 0; i < size; ++i)
+! if (ml_append((linenr_T)(n + i), (char_u *)array[i],
+! 0, FALSE) == FAIL)
+! {
+! curbuf = savebuf;
+! free_array(array);
+! raise_vim_exn(_("cannot insert line"));
+! }
+!
+! if (i > 0)
+! appended_lines_mark((linenr_T)n, (long)i);
+! }
+! free_array(array);
+! MZ_GC_UNREG();
+! curbuf = savebuf;
+! update_screen(VALID);
+! }
+
++ MZ_GC_UNREG();
+ raise_if_error();
+ return scheme_void;
+ }
+
+ /*
+ * Predicates
+ */
+***************
+*** 2343,2383 ****
+ /*
+ * Convert an MzScheme string into a Vim line.
+ *
+! * The result is in allocated memory. All internal nulls are replaced by
+! * newline characters. It is an error for the string to contain newline
+! * characters.
+ *
+ */
+ static char *
+ string_to_line(Scheme_Object *obj)
+ {
+! char *str;
+ long len;
+ int i;
+
+! str = scheme_display_to_string(obj, &len);
+
+ /* Error checking: String must not contain newlines, as we
+ * are replacing a single line, and we must replace it with
+ * a single line.
+ */
+! if (memchr(str, '\n', len))
+ scheme_signal_error(_("string cannot contain newlines"));
+
+ /* Create a copy of the string, with internal nulls replaced by
+ * newline characters, as is the vim convention.
+ */
+ for (i = 0; i < len; ++i)
+ {
+! if (str[i] == '\0')
+! str[i] = '\n';
+ }
+
+! str[i] = '\0';
+
+! return str;
+ }
+
+ /*
+ * Check to see whether a Vim error has been reported, or a keyboard
+ * interrupt (from vim --> got_int) has been detected.
+--- 2612,2784 ----
+ /*
+ * Convert an MzScheme string into a Vim line.
+ *
+! * All internal nulls are replaced by newline characters.
+! * It is an error for the string to contain newline characters.
+ *
++ * Returns pointer to Vim allocated memory
+ */
+ static char *
+ string_to_line(Scheme_Object *obj)
+ {
+! char *scheme_str = NULL;
+! char *vim_str = NULL;
+ long len;
+ int i;
+
+! scheme_str = scheme_display_to_string(obj, &len);
+
+ /* Error checking: String must not contain newlines, as we
+ * are replacing a single line, and we must replace it with
+ * a single line.
+ */
+! if (memchr(scheme_str, '\n', len))
+ scheme_signal_error(_("string cannot contain newlines"));
+
++ vim_str = (char *)alloc(len + 1);
++
+ /* Create a copy of the string, with internal nulls replaced by
+ * newline characters, as is the vim convention.
+ */
+ for (i = 0; i < len; ++i)
+ {
+! if (scheme_str[i] == '\0')
+! vim_str[i] = '\n';
+! else
+! vim_str[i] = scheme_str[i];
+ }
+
+! vim_str[i] = '\0';
+
+! MZ_GC_CHECK();
+! return vim_str;
+ }
+
++ #ifdef FEAT_EVAL
++ /*
++ * Convert Vim value into MzScheme, adopted from if_python.c
++ */
++ static Scheme_Object *
++ vim_to_mzscheme(typval_T *vim_value, int depth, Scheme_Hash_Table *visited)
++ {
++ Scheme_Object *result = NULL;
++ int new_value = TRUE;
++
++ MZ_GC_DECL_REG(1);
++ MZ_GC_VAR_IN_REG(0, result);
++ MZ_GC_REG();
++
++ /* Avoid infinite recursion */
++ if (depth > 100)
++ {
++ MZ_GC_UNREG();
++ return scheme_void;
++ }
++
++ /* Check if we run into a recursive loop. The item must be in visited
++ * then and we can use it again.
++ */
++ result = scheme_hash_get(visited, (Scheme_Object *)vim_value);
++ MZ_GC_CHECK();
++ if (result != NULL) /* found, do nothing */
++ new_value = FALSE;
++ else if (vim_value->v_type == VAR_STRING)
++ {
++ result = scheme_make_string((char *)vim_value->vval.v_string);
++ MZ_GC_CHECK();
++ }
++ else if (vim_value->v_type == VAR_NUMBER)
++ {
++ result = scheme_make_integer((long)vim_value->vval.v_number);
++ MZ_GC_CHECK();
++ }
++ # ifdef FEAT_FLOAT
++ else if (vim_value->v_type == VAR_FLOAT)
++ {
++ result = scheme_make_double((double)vim_value->vval.v_float);
++ MZ_GC_CHECK();
++ }
++ # endif
++ else if (vim_value->v_type == VAR_LIST)
++ {
++ list_T *list = vim_value->vval.v_list;
++ listitem_T *curr;
++
++ if (list == NULL || list->lv_first == NULL)
++ result = scheme_null;
++ else
++ {
++ Scheme_Object *obj = NULL;
++
++ MZ_GC_DECL_REG(1);
++ MZ_GC_VAR_IN_REG(0, obj);
++ MZ_GC_REG();
++
++ curr = list->lv_last;
++ obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited);
++ result = scheme_make_pair(obj, scheme_null);
++ MZ_GC_CHECK();
++
++ while (curr != list->lv_first)
++ {
++ curr = curr->li_prev;
++ obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited);
++ result = scheme_make_pair(obj, result);
++ MZ_GC_CHECK();
++ }
++ }
++ MZ_GC_UNREG();
++ }
++ else if (vim_value->v_type == VAR_DICT)
++ {
++ Scheme_Object *key = NULL;
++ Scheme_Object *obj = NULL;
++
++ MZ_GC_DECL_REG(2);
++ MZ_GC_VAR_IN_REG(0, key);
++ MZ_GC_VAR_IN_REG(1, obj);
++ MZ_GC_REG();
++
++ result = (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr);
++ MZ_GC_CHECK();
++ if (vim_value->vval.v_dict != NULL)
++ {
++ hashtab_T *ht = &vim_value->vval.v_dict->dv_hashtab;
++ long_u todo = ht->ht_used;
++ hashitem_T *hi;
++ dictitem_T *di;
++
++ for (hi = ht->ht_array; todo > 0; ++hi)
++ {
++ if (!HASHITEM_EMPTY(hi))
++ {
++ --todo;
++
++ di = dict_lookup(hi);
++ obj = vim_to_mzscheme(&di->di_tv, depth + 1, visited);
++ key = scheme_make_string((char *)hi->hi_key);
++ MZ_GC_CHECK();
++ scheme_hash_set((Scheme_Hash_Table *)result, key, obj);
++ MZ_GC_CHECK();
++ }
++ }
++ }
++ MZ_GC_UNREG();
++ }
++ else
++ {
++ result = scheme_void;
++ new_value = FALSE;
++ }
++ if (new_value)
++ {
++ scheme_hash_set(visited, (Scheme_Object *)vim_value, result);
++ MZ_GC_CHECK();
++ }
++ MZ_GC_UNREG();
++ return result;
++ }
++ #endif
++
+ /*
+ * Check to see whether a Vim error has been reported, or a keyboard
+ * interrupt (from vim --> got_int) has been detected.
+***************
+*** 2392,2441 ****
+ * register Scheme exn:vim
+ */
+ static void
+! register_vim_exn(Scheme_Env *env)
+ {
+! Scheme_Object *exn_name = scheme_intern_symbol("exn:vim");
+
+ if (vim_exn == NULL)
+ vim_exn = scheme_make_struct_type(exn_name,
+! scheme_builtin_value("struct:exn"), NULL, 0, 0, NULL, NULL
+ #if MZSCHEME_VERSION_MAJOR >= 299
+ , NULL
+ #endif
+ );
+
+- if (vim_exn_values == NULL)
+- {
+- int nc = 0;
+
+! Scheme_Object **exn_names = scheme_make_struct_names(
+! exn_name, scheme_null, 0, &nc);
+! Scheme_Object **exn_values = scheme_make_struct_values(
+! vim_exn, exn_names, nc, 0);
+!
+! vim_exn_names = scheme_make_vector(nc, scheme_false);
+! vim_exn_values = scheme_make_vector(nc, scheme_false);
+! /* remember names and values */
+! mch_memmove(SCHEME_VEC_ELS(vim_exn_names), exn_names,
+! nc * sizeof(Scheme_Object *));
+! mch_memmove(SCHEME_VEC_ELS(vim_exn_values), exn_values,
+! nc * sizeof(Scheme_Object *));
+ }
+!
+! add_vim_exn(env);
+! }
+!
+! /*
+! * Add stuff of exn:vim to env
+! */
+! static void
+! add_vim_exn(Scheme_Env *env)
+! {
+! int i;
+!
+! for (i = 0; i < SCHEME_VEC_SIZE(vim_exn_values); i++)
+! scheme_add_global_symbol(SCHEME_VEC_ELS(vim_exn_names)[i],
+! SCHEME_VEC_ELS(vim_exn_values)[i], env);
+ }
+
+ /*
+--- 2793,2851 ----
+ * register Scheme exn:vim
+ */
+ static void
+! register_vim_exn(void)
+ {
+! int nc = 0;
+! int i;
+! Scheme_Object *struct_exn = NULL;
+! Scheme_Object *exn_name = NULL;
+!
+! MZ_GC_DECL_REG(2);
+! MZ_GC_VAR_IN_REG(0, struct_exn);
+! MZ_GC_VAR_IN_REG(1, exn_name);
+! MZ_GC_REG();
+!
+! exn_name = scheme_intern_symbol("exn:vim");
+! MZ_GC_CHECK();
+! struct_exn = scheme_builtin_value("struct:exn");
+! MZ_GC_CHECK();
+
+ if (vim_exn == NULL)
+ vim_exn = scheme_make_struct_type(exn_name,
+! struct_exn, NULL, 0, 0, NULL, NULL
+ #if MZSCHEME_VERSION_MAJOR >= 299
+ , NULL
+ #endif
+ );
+
+
+! {
+! Scheme_Object **tmp = NULL;
+! Scheme_Object *exn_names[5] = {NULL, NULL, NULL, NULL, NULL};
+! Scheme_Object *exn_values[5] = {NULL, NULL, NULL, NULL, NULL};
+! MZ_GC_DECL_REG(6);
+! MZ_GC_ARRAY_VAR_IN_REG(0, exn_names, 5);
+! MZ_GC_ARRAY_VAR_IN_REG(3, exn_values, 5);
+! MZ_GC_REG();
+!
+! tmp = scheme_make_struct_names(exn_name, scheme_null, 0, &nc);
+! assert(nc <= 5);
+! mch_memmove(exn_names, tmp, nc * sizeof(Scheme_Object *));
+! MZ_GC_CHECK();
+!
+! tmp = scheme_make_struct_values(vim_exn, exn_names, nc, 0);
+! mch_memmove(exn_values, tmp, nc * sizeof(Scheme_Object *));
+! MZ_GC_CHECK();
+!
+! for (i = 0; i < nc; i++)
+! {
+! scheme_add_global_symbol(exn_names[i],
+! exn_values[i], environment);
+! MZ_GC_CHECK();
+! }
+! MZ_GC_UNREG();
+ }
+! MZ_GC_UNREG();
+ }
+
+ /*
+***************
+*** 2444,2469 ****
+ void
+ raise_vim_exn(const char *add_info)
+ {
+! Scheme_Object *argv[2];
+! char_u *fmt = _("Vim error: ~a");
+
+ if (add_info != NULL)
+ {
+! Scheme_Object *info = scheme_make_string(add_info);
+! argv[0] = scheme_byte_string_to_char_string(scheme_make_string(
+! scheme_format(fmt, strlen(fmt), 1, &info, NULL)));
+ SCHEME_SET_IMMUTABLE(argv[0]);
+ }
+ else
+ argv[0] = scheme_make_string(_("Vim error"));
+
+ #if MZSCHEME_VERSION_MAJOR < 360
+ argv[1] = scheme_current_continuation_marks();
+ #else
+ argv[1] = scheme_current_continuation_marks(NULL);
+ #endif
+
+! scheme_raise(scheme_make_struct_instance(vim_exn, 2, argv));
+ }
+
+ void
+--- 2854,2907 ----
+ void
+ raise_vim_exn(const char *add_info)
+ {
+! char *fmt = _("Vim error: ~a");
+! Scheme_Object *argv[2] = {NULL, NULL};
+! Scheme_Object *exn = NULL;
+!
+! MZ_GC_DECL_REG(4);
+! MZ_GC_ARRAY_VAR_IN_REG(0, argv, 2);
+! MZ_GC_VAR_IN_REG(3, exn);
+! MZ_GC_REG();
+
+ if (add_info != NULL)
+ {
+! char *c_string = NULL;
+! Scheme_Object *byte_string = NULL;
+! Scheme_Object *info = NULL;
+!
+! MZ_GC_DECL_REG(3);
+! MZ_GC_VAR_IN_REG(0, c_string);
+! MZ_GC_VAR_IN_REG(1, byte_string);
+! MZ_GC_VAR_IN_REG(2, info);
+! MZ_GC_REG();
+!
+! info = scheme_make_string(add_info);
+! MZ_GC_CHECK();
+! c_string = scheme_format(fmt, STRLEN(fmt), 1, &info, NULL);
+! MZ_GC_CHECK();
+! byte_string = scheme_make_string(c_string);
+! MZ_GC_CHECK();
+! argv[0] = scheme_byte_string_to_char_string(byte_string);
+! MZ_GC_CHECK();
+ SCHEME_SET_IMMUTABLE(argv[0]);
++ MZ_GC_UNREG();
+ }
+ else
+ argv[0] = scheme_make_string(_("Vim error"));
++ MZ_GC_CHECK();
+
+ #if MZSCHEME_VERSION_MAJOR < 360
+ argv[1] = scheme_current_continuation_marks();
++ MZ_GC_CHECK();
+ #else
+ argv[1] = scheme_current_continuation_marks(NULL);
++ MZ_GC_CHECK();
+ #endif
+
+! exn = scheme_make_struct_instance(vim_exn, 2, argv);
+! MZ_GC_CHECK();
+! scheme_raise(exn);
+! MZ_GC_UNREG();
+ }
+
+ void
+***************
+*** 2570,2575 ****
+--- 3008,3015 ----
+ curwin->w_cursor.lnum = lo;
+ check_cursor();
+ }
++ else
++ check_cursor_col();
+ changed_cline_bef_curs();
+ }
+ invalidate_botline();
+***************
+*** 2595,2601 ****
+ {mzscheme_open_buffer, "open-buff", 1, 1},
+ {get_buffer_by_name, "get-buff-by-name", 1, 1},
+ {get_buffer_by_num, "get-buff-by-num", 1, 1},
+- {get_buffer_namespace, "get-buff-namespace", 0, 1},
+ /*
+ * Window-related commands
+ */
+--- 3035,3040 ----
+***************
+*** 2653,2675 ****
+ }
+
+ static void
+! make_modules(Scheme_Env *env)
+ {
+! int i;
+! Scheme_Env *mod;
+!
+! mod = scheme_primitive_module(scheme_intern_symbol("vimext"), env);
+ /* all prims made closed so they can access their own names */
+! for (i = 0; i < sizeof(prims)/sizeof(prims[0]); i++)
+ {
+ Vim_Prim *prim = prims + i;
+! scheme_add_global(prim->name,
+! scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name,
+! prim->mina, prim->maxa),
+! mod);
+ }
+- scheme_add_global("global-namespace", (Scheme_Object *)environment, mod);
+ scheme_finish_primitive_module(mod);
+ }
+
+ #ifdef HAVE_SANDBOX
+--- 3092,3126 ----
+ }
+
+ static void
+! make_modules()
+ {
+! int i;
+! Scheme_Env *mod = NULL;
+! Scheme_Object *vimext_symbol = NULL;
+! Scheme_Object *closed_prim = NULL;
+!
+! MZ_GC_DECL_REG(3);
+! MZ_GC_VAR_IN_REG(0, mod);
+! MZ_GC_VAR_IN_REG(1, vimext_symbol);
+! MZ_GC_VAR_IN_REG(2, closed_prim);
+! MZ_GC_REG();
+!
+! vimext_symbol = scheme_intern_symbol("vimext");
+! MZ_GC_CHECK();
+! mod = scheme_primitive_module(vimext_symbol, environment);
+! MZ_GC_CHECK();
+ /* all prims made closed so they can access their own names */
+! for (i = 0; i < (int)(sizeof(prims)/sizeof(prims[0])); i++)
+ {
+ Vim_Prim *prim = prims + i;
+! closed_prim = scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name,
+! prim->mina, prim->maxa);
+! scheme_add_global(prim->name, closed_prim, mod);
+! MZ_GC_CHECK();
+ }
+ scheme_finish_primitive_module(mod);
++ MZ_GC_CHECK();
++ MZ_GC_UNREG();
+ }
+
+ #ifdef HAVE_SANDBOX
+***************
+*** 2697,2717 ****
+--- 3148,3172 ----
+ {
+ MZ_REGISTER_STATIC(M_write);
+ M_write = scheme_intern_symbol("write");
++ MZ_GC_CHECK();
+ }
+ if (M_read == NULL)
+ {
+ MZ_REGISTER_STATIC(M_read);
+ M_read = scheme_intern_symbol("read");
++ MZ_GC_CHECK();
+ }
+ if (M_execute == NULL)
+ {
+ MZ_REGISTER_STATIC(M_execute);
+ M_execute = scheme_intern_symbol("execute");
++ MZ_GC_CHECK();
+ }
+ if (M_delete == NULL)
+ {
+ MZ_REGISTER_STATIC(M_delete);
+ M_delete = scheme_intern_symbol("delete");
++ MZ_GC_CHECK();
+ }
+
+ while (!SCHEME_NULLP(requested_access))
+*** ../vim-7.2.190/src/if_mzsch.h 2006-03-24 23:43:11.000000000 +0100
+--- src/if_mzsch.h 2009-05-26 19:08:21.000000000 +0200
+***************
+*** 11,16 ****
+--- 11,17 ----
+
+ /* #ifdef needed for "make depend" */
+ #ifdef FEAT_MZSCHEME
++ # include <schvers.h>
+ # include <scheme.h>
+ #endif
+
+***************
+*** 46,49 ****
+--- 47,77 ----
+ # define scheme_byte_string_to_char_string(obj) (obj)
+ #endif
+
++ /* Precise GC macros */
++ #ifndef MZ_GC_DECL_REG
++ # define MZ_GC_DECL_REG(size) /* empty */
++ #endif
++ #ifndef MZ_GC_VAR_IN_REG
++ # define MZ_GC_VAR_IN_REG(x, v) /* empty */
++ #endif
++ #ifndef MZ_GC_ARRAY_VAR_IN_REG
++ # define MZ_GC_ARRAY_VAR_IN_REG(x, v, l) /* empty */
++ #endif
++ #ifndef MZ_GC_REG
++ # define MZ_GC_REG() /* empty */
++ #endif
++ #ifndef MZ_GC_UNREG
++ # define MZ_GC_UNREG() /* empty */
++ #endif
++
++ #ifdef MZSCHEME_FORCE_GC
++ /*
++ * force garbage collection to check all references are registered
++ * seg faults will indicate not registered refs
++ */
++ # define MZ_GC_CHECK() scheme_collect_garbage();
++ #else
++ # define MZ_GC_CHECK() /* empty */
++ #endif
++
+ #endif /* _IF_MZSCH_H_ */
+*** ../vim-7.2.190/src/main.c 2009-05-17 13:30:58.000000000 +0200
+--- src/main.c 2009-05-26 19:09:01.000000000 +0200
+***************
+*** 935,942 ****
+--- 935,948 ----
+
+ /*
+ * Call the main command loop. This never returns.
++ * For embedded MzScheme the main_loop will be called by Scheme
++ * for proper stack tracking
+ */
++ #ifndef FEAT_MZSCHEME
+ main_loop(FALSE, FALSE);
++ #else
++ mzscheme_main();
++ #endif
+
+ return 0;
+ }
+*** ../vim-7.2.190/src/proto/if_mzsch.pro 2004-07-12 17:51:52.000000000 +0200
+--- src/proto/if_mzsch.pro 2009-05-26 19:09:55.000000000 +0200
+***************
+*** 15,24 ****
+ void *mzvim_eval_string __ARGS((char_u *str));
+ struct Scheme_Object *mzvim_apply __ARGS((struct Scheme_Object *, int argc,
+ struct Scheme_Object **));
+! int mzthreads_allowed (void);
+! #ifdef FEAT_GUI_KDE
+! void timer_proc (void);
+! void mzscheme_kde_start_timer (void);
+! void mzscheme_kde_stop_timer (void);
+! #endif
+ /* vim: set ft=c : */
+--- 15,20 ----
+ void *mzvim_eval_string __ARGS((char_u *str));
+ struct Scheme_Object *mzvim_apply __ARGS((struct Scheme_Object *, int argc,
+ struct Scheme_Object **));
+! int mzthreads_allowed __ARGS((void));
+! void mzscheme_main __ARGS((void));
+ /* vim: set ft=c : */
+*** ../vim-7.2.190/src/version.c 2009-05-26 18:12:13.000000000 +0200
+--- src/version.c 2009-05-26 22:52:53.000000000 +0200
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 191,
+ /**/
+
+--
+Scientists decoded the first message from an alien civilization:
+ SIMPLY SEND 6 TIMES 10 TO THE 50 ATOMS OF HYDROGEN TO THE STAR
+SYSTEM AT THE TOP OF THE LIST, CROSS OFF THAT STAR SYSTEM, THEN PUT
+YOUR STAR SYSTEM AT THE BOTTOM OF THE LIST AND SEND IT TO 100 OTHER
+STAR SYSTEMS. WITHIN ONE TENTH GALACTIC ROTATION YOU WILL RECEIVE
+ENOUGH HYDROGREN TO POWER YOUR CIVILIZATION UNTIL ENTROPY REACHES ITS
+MAXIMUM! IT REALLY WORKS!
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///