changeset 274:8fa8d7964cf1 v7.0073

updated for version 7.0073
author vimboss
date Thu, 19 May 2005 21:08:39 +0000
parents 2463194c8cdd
children fb70e333c94e
files runtime/doc/todo.txt runtime/doc/version7.txt runtime/indent/lisp.vim runtime/syntax/mma.vim src/digraph.c src/edit.c src/eval.c src/ex_cmds.c src/ex_cmds.h src/ex_cmds2.c src/if_mzsch.c src/if_mzsch.h src/if_python.c src/if_tcl.c src/memline.c src/misc1.c src/ops.c src/option.c src/po/it.po src/proto/misc2.pro src/search.c src/syntax.c src/ui.c
diffstat 23 files changed, 331 insertions(+), 208 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.0aa.  Last change: 2005 May 18
+*todo.txt*      For Vim version 7.0aa.  Last change: 2005 May 19
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -88,10 +88,6 @@ Win32: Balloon text can't contain line b
 
 setline() should accept a List.
 
-smsg() uses IObuff.  The checks for the result not fitting are complicated,
-find another solution.  Add vsnprintf() and snprintf() functions?
-    http://www.ijs.si/software/snprintf/
-
 Add ":[range]sort" command.  Sort on specified field, using a regexp?  Remove
 duplicates?
 
--- a/runtime/doc/version7.txt
+++ b/runtime/doc/version7.txt
@@ -1,4 +1,4 @@
-*version7.txt*  For Vim version 7.0aa.  Last change: 2005 May 18
+*version7.txt*  For Vim version 7.0aa.  Last change: 2005 May 19
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1068,4 +1068,8 @@ prompt the argument index was advanced a
 When "~" is in 'iskeyword' the "gd" doesn't work, it's used for the previous
 substitute pattern.  Put "\V" in the pattern to avoid that.
 
+Use of sprintf() sometimes didn't check properly for buffer overflow.  Also
+when using smsg().  Included code for snprintf() to avoid having to do size
+checks where invoking them
+
  vim:tw=78:ts=8:ft=help:norl:
--- a/runtime/indent/lisp.vim
+++ b/runtime/indent/lisp.vim
@@ -1,7 +1,8 @@
 " Vim indent file
 " Language:	Lisp
-" Maintainer:	noone
-" Last Change:	2005 Mar 28
+" Maintainer:    Sergey Khorev <sergey.khorev@gmail.com>
+" URL:		 http://iamphet.nm.ru/vim
+" Last Change:	2005 May 19
 
 " Only load this indent file when no other was loaded.
 if exists("b:did_indent")
@@ -9,7 +10,6 @@ if exists("b:did_indent")
 endif
 let b:did_indent = 1
 
-" Autoindent is the best we can do.
-setlocal ai
+setlocal ai nosi
 
-let b:undo_indent = "setl ai<"
+let b:undo_indent = "setl ai< si<"
--- a/runtime/syntax/mma.vim
+++ b/runtime/syntax/mma.vim
@@ -14,11 +14,7 @@
 " I also recommend setting the default 'Comment' hilighting to something
 " other than the color used for 'Function', since both are plentiful in
 " most mathematica files, and they are often the same color (when using 
-" background=dark).  I use
-"
-"   hi Comment ctermfg=darkcyan
-"   
-" darkgreen also looks good on my terminal.
+" background=dark).
 "
 " Credits:
 " o  Original Mathematica syntax version written by
@@ -45,16 +41,6 @@ syntax cluster mmaCommentStrings contain
 syntax cluster mmaStrings contains=@mmaCommentStrings,mmaString
 syntax cluster mmaTop contains=mmaOperator,mmaGenericFunction,mmaPureFunction,mmaVariable
 
-" Variables:
-"   Dollar sign variables
-syntax match mmaVariable "$\a\+\d*"
-"   Preceding contexts
-syntax match mmaVariable "`\=\a\+\d*`"
-
-" Numbers:
-syntax match mmaNumber "\<\%(\d\+\.\=\d*\|\d*\.\=\d\+\)\>"
-syntax match mmaNumber "`\d\+\>"
-
 " Predefined Constants:
 "   to list all predefined Symbols would be too insane...
 "   it's probably smarter to define a select few, and get the rest from
@@ -89,41 +75,24 @@ syntax keyword mmaVariable Black Blue Br
 " function attributes
 syntax keyword mmaVariable Protected Listable OneIdentity Orderless Flat Constant NumericFunction Locked ReadProtected HoldFirst HoldRest HoldAll HoldAllComplete SequenceHold NHoldFirst NHoldRest NHoldAll Temporary Stub 
 
-" Strings:
-"   "string"
-"   'string' is not accepted (until literal strings are supported!)
-syntax region mmaString start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+
-syntax region mmaCommentString oneline start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ contained
-
-" Function Usage Messages:
-"   "SymbolName::item"
-syntax match mmaMessage "$\=\a\+\d*::\a\+\d*"
+" Comment Sections:
+"   this:
+"   :that:
+syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\a\)[a-zA-Z0-9 ]\+:" contained contains=@mmaNotes
 
-" Pure Functions:
-syntax match mmaPureFunction "#\%(#\|\d\+\)\="
-syntax match mmaPureFunction "&"
-
-" Named Functions:
-" Since everything is pretty much a function, get this straight 
-" from context
-syntax match mmaGenericFunction "[A-Za-z0-9`]\+\s*\%([@[]\|/:\|/\=/@\)\@=" contains=mmaOperator
-syntax match mmaGenericFunction "\~\s*[^~]\+\s*\~"hs=s+1,he=e-1 contains=mmaOperator,mmaBoring
-syntax match mmaGenericFunction "//\s*[A-Za-z0-9`]\+"hs=s+2 contains=mmaOperator
- 
 " Comment Keywords:
 syntax keyword mmaTodo TODO NOTE HEY contained
 syntax match mmaTodo "X\{3,}" contained
 syntax keyword mmaFixme FIX[ME] FIXTHIS BROKEN contained
 " yay pirates...
 syntax match mmaFixme "\%(Y\=A\+R\+G\+\|GRR\+\|CR\+A\+P\+\)\%(!\+\)\=" contained
-syntax match mmaemPHAsis "\(_\+\)[ a-zA-Z0-9]\+\1" contained
 
-" Comment Sections:
-"   this:
-"   :that:
-syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\a\)[a-zA-Z0-9 ]\+:" contained contains=@mmaNotes
+" EmPHAsis:
+" this unnecessary, but whatever :)
+syntax match mmaemPHAsis "\%(^\|\s\)\([_/]\)[a-zA-Z0-9]\+\%(\s\+[a-zA-Z0-9]\+\)*\1\%(\s\|$\)" contained contains=mmaemPHAsis
+syntax match mmaemPHAsis "\%(^\|\s\)(\@<!\*[a-zA-Z0-9]\+\%(\s\+[a-zA-Z0-9]\+\)*)\@!\*\%(\s\|$\)" contained contains=mmaemPHAsis
 
-" Actual Mathematica Comments:
+" Regular Comments:
 "   (* *)
 "   allow nesting (* (* *) *) even though the frontend
 "   won't always like it.
@@ -141,6 +110,19 @@ syntax match mmaComment "(\*\*\+)"
 " catch preceding *
 syntax match mmaCommentStar "^\s*\*\+" contained
 
+" Variables:
+"   Dollar sign variables
+syntax match mmaVariable "$\a\+\d*"
+"   Preceding contexts
+syntax match mmaVariable "`\=\a\+\d*`"
+
+" Strings:
+"   "string"
+"   'string' is not accepted (until literal strings are supported!)
+syntax region mmaString start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+
+syntax region mmaCommentString oneline start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ contained
+
+
 " Patterns:
 "   Each pattern marker below can be Blank[] (_), BlankSequence[] (__)
 "   or BlankNullSequence[] (___).  Most examples below can also be 
@@ -197,7 +179,25 @@ syntax match mmaOperator "[*+=^.:?-]"
 syntax match mmaOperator "\%(\~\~\=\)"
 syntax match mmaOperator "\%(=\{2,3}\|=\=!=\|||\=\|&&\|!\)" contains=ALLBUT,mmaPureFunction
 
-  
+" Function Usage Messages:
+"   "SymbolName::item"
+syntax match mmaMessage "$\=\a\+\d*::\a\+\d*"
+
+" Pure Functions:
+syntax match mmaPureFunction "#\%(#\|\d\+\)\="
+syntax match mmaPureFunction "&"
+
+" Named Functions:
+" Since everything is pretty much a function, get this straight 
+" from context
+syntax match mmaGenericFunction "[A-Za-z0-9`]\+\s*\%([@[]\|/:\|/\=/@\)\@=" contains=mmaOperator
+syntax match mmaGenericFunction "\~\s*[^~]\+\s*\~"hs=s+1,he=e-1 contains=mmaOperator,mmaBoring
+syntax match mmaGenericFunction "//\s*[A-Za-z0-9`]\+"hs=s+2 contains=mmaOperator
+
+" Numbers:
+syntax match mmaNumber "\<\%(\d\+\.\=\d*\|\d*\.\=\d\+\)\>"
+syntax match mmaNumber "`\d\+\%(\d\@!\.\|\>\)"
+
 " Special Characters:
 "   \[Name]     named character
 "   \ooo        octal
@@ -243,10 +243,10 @@ if version >= 508 || !exists("did_mma_sy
     HiLink mmaFunctionComment   Comment
     HiLink mmaLooseQuote        Comment
 	HiLink mmaGenericFunction   Function
+	HiLink mmaVariable          Identifier
 	HiLink mmaOperator          Operator
     HiLink mmaPatternOp         Operator
 	HiLink mmaPureFunction      Operator
-	HiLink mmaVariable          Identifier
 	HiLink mmaString            String
     HiLink mmaCommentString     String
 	HiLink mmaUnicode           String
--- a/src/digraph.c
+++ b/src/digraph.c
@@ -2459,7 +2459,7 @@ ex_loadkeymap(eap)
      */
     for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
     {
-	sprintf((char *)buf, "<buffer> %s %s",
+	vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s",
 				((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from,
 				 ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to);
 	(void)do_map(2, buf, LANGMAP, FALSE);
@@ -2492,8 +2492,8 @@ keymap_unload()
     /* clear the ":lmap"s */
     for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
     {
-	sprintf((char *)buf, "<buffer> %s",
-		((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from);
+	vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s",
+			       ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from);
 	(void)do_map(1, buf, LANGMAP, FALSE);
     }
 
--- a/src/edit.c
+++ b/src/edit.c
@@ -2218,8 +2218,8 @@ ins_compl_dictionaries(dict, pat, dir, f
 	    fp = mch_fopen((char *)files[i], "r");  /* open dictionary file */
 	    if (flags != DICT_EXACT)
 	    {
-		sprintf((char*)IObuff, _("Scanning dictionary: %s"),
-							    (char *)files[i]);
+		vim_snprintf((char *)IObuff, IOSIZE,
+			      _("Scanning dictionary: %s"), (char *)files[i]);
 		msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
 	    }
 
@@ -2827,7 +2827,7 @@ ins_compl_get_exp(ini, dir)
 		    dict = ins_buf->b_fname;
 		    dict_f = DICT_EXACT;
 		}
-		sprintf((char *)IObuff, _("Scanning: %s"),
+		vim_snprintf((char *)IObuff, IOSIZE, _("Scanning: %s"),
 			ins_buf->b_fname == NULL
 			    ? buf_spname(ins_buf)
 			    : ins_buf->b_sfname == NULL
--- a/src/eval.c
+++ b/src/eval.c
@@ -11414,7 +11414,7 @@ remote_common(argvars, rettv, expr)
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
 	dictitem_T	v;
-	char_u	str[30];
+	char_u		str[30];
 
 	sprintf((char *)str, "0x%x", (unsigned int)w);
 	v.di_tv.v_type = VAR_STRING;
@@ -16867,7 +16867,7 @@ call_user_func(fp, argcount, argvars, re
 	{
 	    ++no_wait_return;
 	    msg_scroll = TRUE;	    /* always scroll up, don't overwrite */
-	    msg_str((char_u *)_("calling %s"), sourcing_name);
+	    smsg((char_u *)_("calling %s"), sourcing_name);
 	    if (p_verbose >= 14)
 	    {
 		char_u	buf[MSG_BUF_LEN];
@@ -16950,30 +16950,26 @@ call_user_func(fp, argcount, argvars, re
     /* when being verbose, mention the return value */
     if (p_verbose >= 12)
     {
-	char_u	*sn;
-
 	++no_wait_return;
 	msg_scroll = TRUE;	    /* always scroll up, don't overwrite */
 
-	/* Make sure the output fits in IObuff. */
-	sn = sourcing_name;
-	if (STRLEN(sourcing_name) > IOSIZE / 2 - 50)
-	    sn = sourcing_name + STRLEN(sourcing_name) - (IOSIZE / 2 - 50);
-
 	if (aborting())
-	    smsg((char_u *)_("%s aborted"), sn);
+	    smsg((char_u *)_("%s aborted"), sourcing_name);
 	else if (fc.rettv->v_type == VAR_NUMBER)
-	    smsg((char_u *)_("%s returning #%ld"), sn,
-					      (long)fc.rettv->vval.v_number);
+	    smsg((char_u *)_("%s returning #%ld"), sourcing_name,
+					       (long)fc.rettv->vval.v_number);
 	else
 	{
 	    char_u	buf[MSG_BUF_LEN];
 	    char_u	numbuf[NUMBUFLEN];
 	    char_u	*tofree;
 
+	    /* The value may be very long.  Skip the middle part, so that we
+	     * have some idea how it starts and ends. smsg() would always
+	     * truncate it at the end. */
 	    trunc_string(tv2string(fc.rettv, &tofree, numbuf),
 							   buf, MSG_BUF_CLEN);
-	    smsg((char_u *)_("%s returning %s"), sn, buf);
+	    smsg((char_u *)_("%s returning %s"), sourcing_name, buf);
 	    vim_free(tofree);
 	}
 	msg_puts((char_u *)"\n");   /* don't overwrite this either */
@@ -16994,7 +16990,7 @@ call_user_func(fp, argcount, argvars, re
     {
 	++no_wait_return;
 	msg_scroll = TRUE;	    /* always scroll up, don't overwrite */
-	msg_str((char_u *)_("continuing in %s"), sourcing_name);
+	smsg((char_u *)_("continuing in %s"), sourcing_name);
 	msg_puts((char_u *)"\n");   /* don't overwrite this either */
 	cmdline_row = msg_row;
 	--no_wait_return;
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -89,8 +89,9 @@ do_ascii(eap)
 	else
 #endif
 	    buf2[0] = NUL;
-	sprintf((char *)IObuff, _("<%s>%s%s  %d,  Hex %02x,  Octal %03o"),
-		transchar(c), buf1, buf2, c, c, c);
+	vim_snprintf((char *)IObuff, IOSIZE,
+		_("<%s>%s%s  %d,  Hex %02x,  Octal %03o"),
+					   transchar(c), buf1, buf2, c, c, c);
 #ifdef FEAT_MBYTE
 	c = c1;
 	c1 = c2;
@@ -113,8 +114,8 @@ do_ascii(eap)
 #endif
 		)
 	    IObuff[len++] = ' '; /* draw composing char on top of a space */
-	IObuff[len + (*mb_char2bytes)(c, IObuff + len)] = NUL;
-	sprintf((char *)IObuff + STRLEN(IObuff),
+	len += (*mb_char2bytes)(c, IObuff + len);
+	vim_snprintf((char *)IObuff + len, IOSIZE - len,
 			c < 0x10000 ? _("> %d, Hex %04x, Octal %o")
 				    : _("> %d, Hex %08x, Octal %o"), c, c, c);
 	c = c1;
@@ -974,8 +975,8 @@ do_filter(line1, line2, eap, cmd, do_in,
 	{
 	    if (do_in)
 	    {
-		sprintf((char *)msg_buf, _("%ld lines filtered"),
-							     (long)linecount);
+		vim_snprintf((char *)msg_buf, sizeof(msg_buf),
+				    _("%ld lines filtered"), (long)linecount);
 		if (msg(msg_buf) && !msg_scroll)
 		{
 		    /* save message to display it after redraw */
@@ -1337,7 +1338,8 @@ viminfo_error(errnum, message, line)
     char    *message;
     char_u  *line;
 {
-    sprintf((char *)IObuff, _("%sviminfo: %s in line: "), errnum, message);
+    vim_snprintf((char *)IObuff, IOSIZE, _("%sviminfo: %s in line: "),
+							     errnum, message);
     STRNCAT(IObuff, line, IOSIZE - STRLEN(IObuff));
     if (IObuff[STRLEN(IObuff) - 1] == '\n')
 	IObuff[STRLEN(IObuff) - 1] = NUL;
@@ -1373,17 +1375,11 @@ read_viminfo(file, want_info, want_marks
     fp = mch_fopen((char *)fname, READBIN);
 
     if (p_verbose > 0)
-    {
-	char_u	*s;
-
-	s = fname;
-	if (STRLEN(fname) > IOSIZE - 100)
-	    s = fname + STRLEN(fname) - (IOSIZE - 100);
-	smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"), s,
-		    want_info ? _(" info") : "",
-		    want_marks ? _(" marks") : "",
-		    fp == NULL ? _(" FAILED") : "");
-    }
+	smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
+		fname,
+		want_info ? _(" info") : "",
+		want_marks ? _(" marks") : "",
+		fp == NULL ? _(" FAILED") : "");
 
     vim_free(fname);
     if (fp == NULL)
@@ -1607,7 +1603,7 @@ write_viminfo(file, forceit)
     }
 
     if (p_verbose > 0)
-	msg_str((char_u *)_("Writing viminfo file \"%s\""), fname);
+	smsg((char_u *)_("Writing viminfo file \"%s\""), fname);
 
     viminfo_errcnt = 0;
     do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);
@@ -4529,6 +4525,8 @@ outofmem:
 do_sub_msg(count_only)
     int	    count_only;		/* used 'n' flag for ":s" */
 {
+    int	    len = 0;
+
     /*
      * Only report substitutions when:
      * - more than 'report' substitutions
@@ -4540,20 +4538,24 @@ do_sub_msg(count_only)
 	    && messaging())
     {
 	if (got_int)
+	{
 	    STRCPY(msg_buf, _("(Interrupted) "));
-	else
-	    msg_buf[0] = NUL;
+	    len = STRLEN(msg_buf);
+	}
 	if (sub_nsubs == 1)
-	    STRCAT(msg_buf, count_only ? _("1 match") : _("1 substitution"));
+	    vim_snprintf((char *)msg_buf + len, sizeof(msg_buf) - len,
+		    "%s", count_only ? _("1 match") : _("1 substitution"));
 	else
-	    sprintf((char *)msg_buf + STRLEN(msg_buf),
+	    vim_snprintf((char *)msg_buf + len, sizeof(msg_buf) - len,
 		    count_only ? _("%ld matches") : _("%ld substitutions"),
 								   sub_nsubs);
+	len = STRLEN(msg_buf);
 	if (sub_nlines == 1)
-	    STRCAT(msg_buf, _(" on 1 line"));
+	    vim_snprintf((char *)msg_buf + len, sizeof(msg_buf) - len,
+		    "%s", _(" on 1 line"));
 	else
-	    sprintf((char *)msg_buf + STRLEN(msg_buf), _(" on %ld lines"),
-							    (long)sub_nlines);
+	    vim_snprintf((char *)msg_buf + len, sizeof(msg_buf) - len,
+		    _(" on %ld lines"), (long)sub_nlines);
 	if (msg(msg_buf))
 	{
 	    /* save message to display it after redraw */
@@ -4686,9 +4688,9 @@ ex_global(eap)
     else if (ndone == 0)
     {
 	if (type == 'v')
-	    msg_str((char_u *)_("Pattern found in every line: %s"), pat);
+	    smsg((char_u *)_("Pattern found in every line: %s"), pat);
 	else
-	    msg_str((char_u *)_(e_patnotf2), pat);
+	    smsg((char_u *)_(e_patnotf2), pat);
     }
     else
 	global_exe(cmd);
@@ -4955,8 +4957,7 @@ ex_help(eap)
 	     */
 	    if ((helpfd = mch_fopen((char *)p_hf, READBIN)) == NULL)
 	    {
-		msg_str((char_u *)_("Sorry, help file \"%s\" not found"),
-									p_hf);
+		smsg((char_u *)_("Sorry, help file \"%s\" not found"), p_hf);
 		goto erret;
 	    }
 	    fclose(helpfd);
@@ -5660,7 +5661,7 @@ helptags_one(dir, ext, tagfname)
 	    got_int = TRUE;
 	else
 	{
-	    s = alloc(30);
+	    s = alloc(18 + STRLEN(tagfname));
 	    if (s == NULL)
 		got_int = TRUE;
 	    else
@@ -5793,7 +5794,7 @@ helptags_one(dir, ext, tagfname)
 		if (*p2 == '\t')
 		{
 		    *p2 = NUL;
-		    sprintf((char *)NameBuff,
+		    vim_snprintf((char *)NameBuff, MAXPATHL,
 			    _("E154: Duplicate tag \"%s\" in file %s/%s"),
 				     ((char_u **)ga.ga_data)[i], dir, p2 + 1);
 		    EMSG(NameBuff);
@@ -6307,7 +6308,7 @@ sign_list_defined(sp)
 {
     char_u	*p;
 
-    msg_str((char_u *)"sign %s", sp->sn_name);
+    smsg((char_u *)"sign %s", sp->sn_name);
     if (sp->sn_icon != NULL)
     {
 	MSG_PUTS(" icon=");
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -532,7 +532,7 @@ EX(CMD_mkview,		"mkview",	ex_mkrc,
 EX(CMD_mode,		"mode",		ex_mode,
 			WORD1|TRLBAR|CMDWIN),
 EX(CMD_mzscheme,	"mzscheme",	ex_mzscheme,
-			RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN),
+			RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN|SBOXOK),
 EX(CMD_mzfile,		"mzfile",	ex_mzfile,
 			RANGE|FILE1|NEEDARG|CMDWIN),
 EX(CMD_next,		"next",		ex_next,
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -141,16 +141,9 @@ do_debug(cmd)
     if (sourcing_name != NULL)
 	msg(sourcing_name);
     if (sourcing_lnum != 0)
-    {
-	char_u	    buf[IOSIZE];
-
-	/* Truncate the command, the whole must fit in IObuff. */
-	STRNCPY(buf, cmd, IOSIZE - 50);
-	buf[IOSIZE - 50] = NUL;
-	smsg((char_u *)_("line %ld: %s"), (long)sourcing_lnum, buf);
-    }
+	smsg((char_u *)_("line %ld: %s"), (long)sourcing_lnum, cmd);
     else
-	msg_str((char_u *)_("cmd: %s"), cmd);
+	smsg((char_u *)_("cmd: %s"), cmd);
 
     /*
      * Repeat getting a command and executing it.
@@ -342,7 +335,8 @@ dbg_check_breakpoint(eap)
 		p = (char_u *)"<SNR>";
 	    else
 		p = (char_u *)"";
-	    smsg((char_u *)_("Breakpoint in \"%s%s\" line %ld"), p,
+	    smsg((char_u *)_("Breakpoint in \"%s%s\" line %ld"),
+		    p,
 		    debug_breakpoint_name + (*p == NUL ? 0 : 3),
 		    (long)debug_breakpoint_lnum);
 	    debug_breakpoint_name = NULL;
@@ -2473,13 +2467,8 @@ do_in_runtimepath(name, all, callback, c
     if (buf != NULL && rtp_copy != NULL)
     {
 	if (p_verbose > 1)
-	{
-	    if (STRLEN(name) + STRLEN(p_rtp) > IOSIZE - 100)
-		MSG(_("Searching for a long name in 'runtimepath'"));
-	    else
-		smsg((char_u *)_("Searching for \"%s\" in \"%s\""),
+	    smsg((char_u *)_("Searching for \"%s\" in \"%s\""),
 						 (char *)name, (char *)p_rtp);
-	}
 
 	/* Loop over all entries in 'runtimepath'. */
 	rtp = rtp_copy;
@@ -2501,7 +2490,7 @@ do_in_runtimepath(name, all, callback, c
 								       "\t ");
 
 		    if (p_verbose > 2)
-			msg_str((char_u *)_("Searching for \"%s\""), buf);
+			smsg((char_u *)_("Searching for \"%s\""), buf);
 
 		    /* Expand wildcards, invoke the callback for each match. */
 		    if (gen_expand_wildcards(1, &buf, &num_files, &files,
@@ -2523,7 +2512,7 @@ do_in_runtimepath(name, all, callback, c
     vim_free(buf);
     vim_free(rtp_copy);
     if (p_verbose > 0 && !did_one)
-	msg_str((char_u *)_("not found in 'runtimepath': \"%s\""), name);
+	smsg((char_u *)_("not found in 'runtimepath': \"%s\""), name);
 
 #ifdef AMIGA
     proc->pr_WindowPtr = save_winptr;
@@ -2733,7 +2722,7 @@ do_source(fname, check_other, is_vimrc)
 #endif
     if (mch_isdir(fname_exp))
     {
-	msg_str((char_u *)_("Cannot source a directory: \"%s\""), fname);
+	smsg((char_u *)_("Cannot source a directory: \"%s\""), fname);
 	goto theend;
     }
 
@@ -2771,10 +2760,10 @@ do_source(fname, check_other, is_vimrc)
 	if (p_verbose > 0)
 	{
 	    if (sourcing_name == NULL)
-		msg_str((char_u *)_("could not source \"%s\""), fname);
+		smsg((char_u *)_("could not source \"%s\""), fname);
 	    else
 		smsg((char_u *)_("line %ld: could not source \"%s\""),
-			sourcing_lnum, fname);
+							sourcing_lnum, fname);
 	}
 	goto theend;
     }
@@ -2787,10 +2776,10 @@ do_source(fname, check_other, is_vimrc)
     if (p_verbose > 1)
     {
 	if (sourcing_name == NULL)
-	    msg_str((char_u *)_("sourcing \"%s\""), fname);
+	    smsg((char_u *)_("sourcing \"%s\""), fname);
 	else
 	    smsg((char_u *)_("line %ld: sourcing \"%s\""),
-		    sourcing_lnum, fname);
+							sourcing_lnum, fname);
     }
     if (is_vimrc)
 	vimrc_found();
@@ -2972,16 +2961,12 @@ do_source(fname, check_other, is_vimrc)
     sourcing_lnum = save_sourcing_lnum;
     if (p_verbose > 1)
     {
-	msg_str((char_u *)_("finished sourcing %s"), fname);
+	smsg((char_u *)_("finished sourcing %s"), fname);
 	if (sourcing_name != NULL)
-	    msg_str((char_u *)_("continuing in %s"), sourcing_name);
+	    smsg((char_u *)_("continuing in %s"), sourcing_name);
     }
 #ifdef STARTUPTIME
-# ifdef HAVE_SNPRINTF
-    snprintf(IObuff, IOSIZE, "sourcing %s", fname);
-# else
-    sprintf(IObuff, "sourcing %s", fname);
-# endif
+    vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname);
     time_msg(IObuff, &tv_start);
     time_pop(&tv_rel);
 #endif
@@ -4263,14 +4248,15 @@ ex_hardcopy(eap)
 	    page_prtpos = prtpos;
 	}
 
-	sprintf((char *)IObuff, _("Printed: %s"), settings.jobname);
+	vim_snprintf((char *)IObuff, IOSIZE, _("Printed: %s"),
+							    settings.jobname);
 	prt_message(IObuff);
     }
 
 print_fail:
     if (got_int || settings.user_abort)
     {
-	sprintf((char *)IObuff, _("Printing aborted"));
+	sprintf((char *)IObuff, "%s", _("Printing aborted"));
 	prt_message(IObuff);
     }
     mch_print_end(&settings);
@@ -4954,7 +4940,7 @@ prt_write_file_len(buffer, bytes)
 prt_write_string(s)
     char	*s;
 {
-    sprintf((char *)prt_line_buffer, "%s", s);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), "%s", s);
     prt_write_file(prt_line_buffer);
 }
 
@@ -4990,8 +4976,8 @@ prt_def_font(new_name, encoding, height,
     int		height;
     char	*font;
 {
-    sprintf((char *)prt_line_buffer, "/_%s /VIM-%s /%s ref\n",
-                                                     new_name, encoding, font);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+			  "/_%s /VIM-%s /%s ref\n", new_name, encoding, font);
     prt_write_file(prt_line_buffer);
 #ifdef FEAT_MBYTE
     if (prt_out_mbyte)
@@ -4999,8 +4985,8 @@ prt_def_font(new_name, encoding, height,
 		       new_name, height, 500./prt_ps_courier_font.wx, new_name);
     else
 #endif
-    sprintf((char *)prt_line_buffer, "/%s %d /_%s ffs\n",
-						    new_name, height, new_name);
+	vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+			     "/%s %d /_%s ffs\n", new_name, height, new_name);
     prt_write_file(prt_line_buffer);
 }
 
@@ -5014,11 +5000,11 @@ prt_def_cidfont(new_name, height, cidfon
     int		height;
     char	*cidfont;
 {
-    sprintf((char *)prt_line_buffer, "/_%s /%s[/%s] vim_composefont\n",
-                                                new_name, prt_cmap, cidfont);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+	      "/_%s /%s[/%s] vim_composefont\n", new_name, prt_cmap, cidfont);
     prt_write_file(prt_line_buffer);
-    sprintf((char *)prt_line_buffer, "/%s %d /_%s ffs\n", new_name, height,
-                                                                    new_name);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+			     "/%s %d /_%s ffs\n", new_name, height, new_name);
     prt_write_file(prt_line_buffer);
 }
 
@@ -5030,7 +5016,8 @@ prt_dup_cidfont(original_name, new_name)
     char	*original_name;
     char	*new_name;
 {
-    sprintf((char *)prt_line_buffer, "/%s %s d\n", new_name, original_name);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+				       "/%s %s d\n", new_name, original_name);
     prt_write_file(prt_line_buffer);
 }
 #endif
@@ -5105,7 +5092,8 @@ prt_def_var(name, value, prec)
     double	value;
     int		prec;
 {
-    sprintf((char *)prt_line_buffer, "/%s ", name);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+								"/%s ", name);
     prt_write_file(prt_line_buffer);
     prt_write_real(value, prec);
     sprintf((char *)prt_line_buffer, "d\n");
@@ -5532,7 +5520,8 @@ prt_dsc_start()
 prt_dsc_noarg(comment)
     char	*comment;
 {
-    sprintf((char *)prt_line_buffer, "%%%%%s\n", comment);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+							 "%%%%%s\n", comment);
     prt_write_file(prt_line_buffer);
 }
 
@@ -5541,7 +5530,8 @@ prt_dsc_textline(comment, text)
     char	*comment;
     char	*text;
 {
-    sprintf((char *)prt_line_buffer, "%%%%%s: %s\n", comment, text);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+					       "%%%%%s: %s\n", comment, text);
     prt_write_file(prt_line_buffer);
 }
 
@@ -5551,7 +5541,8 @@ prt_dsc_text(comment, text)
     char	*text;
 {
     /* TODO - should scan 'text' for any chars needing escaping! */
-    sprintf((char *)prt_line_buffer, "%%%%%s: (%s)\n", comment, text);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+					     "%%%%%s: (%s)\n", comment, text);
     prt_write_file(prt_line_buffer);
 }
 
@@ -5565,7 +5556,8 @@ prt_dsc_ints(comment, count, ints)
 {
     int		i;
 
-    sprintf((char *)prt_line_buffer, "%%%%%s:", comment);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+							  "%%%%%s:", comment);
     prt_write_file(prt_line_buffer);
 
     for (i = 0; i < count; i++)
@@ -5584,12 +5576,15 @@ prt_dsc_resources(comment, type, string)
     char	*string;
 {
     if (comment != NULL)
-	sprintf((char *)prt_line_buffer, "%%%%%s: %s", comment, type);
+	vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+						 "%%%%%s: %s", comment, type);
     else
-	sprintf((char *)prt_line_buffer, "%%%%+ %s", type);
+	vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+							    "%%%%+ %s", type);
     prt_write_file(prt_line_buffer);
 
-    sprintf((char *)prt_line_buffer, " %s\n", string);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+							     " %s\n", string);
     prt_write_file(prt_line_buffer);
 }
 
@@ -5654,7 +5649,8 @@ prt_dsc_docmedia(paper_name, width, heig
     char	*colour;
     char	*type;
 {
-    sprintf((char *)prt_line_buffer, "%%%%DocumentMedia: %s ", paper_name);
+    vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer),
+					"%%%%DocumentMedia: %s ", paper_name);
     prt_write_file(prt_line_buffer);
     prt_write_real(width, 2);
     prt_write_real(height, 2);
--- a/src/if_mzsch.c
+++ b/src/if_mzsch.c
@@ -93,6 +93,11 @@ typedef struct
  *  Utility functions for the vim/mzscheme interface
  *========================================================================
  */
+#ifdef HAVE_SANDBOX
+static Scheme_Object *sandbox_file_guard(int, Scheme_Object **);
+static Scheme_Object *sandbox_network_guard(int, Scheme_Object **);
+static void sandbox_check();
+#endif
 /*  Buffer-related commands */
 static Scheme_Object *buffer_new(buf_T *buf);
 static Scheme_Object *get_buffer_by_name(void *, int, Scheme_Object **);
@@ -205,11 +210,15 @@ static void (*dll_scheme_add_global_symb
 static Scheme_Object *(*dll_scheme_apply)(Scheme_Object *rator, int num_rands,
 	Scheme_Object **rands);
 static Scheme_Object *(*dll_scheme_builtin_value)(const char *name);
+# if MZSCHEME_VERSION_MAJOR >= 299
+static Scheme_Object *(*dll_scheme_byte_string_to_char_string)(Scheme_Object *s);
+# endif
 static void (*dll_scheme_close_input_port)(Scheme_Object *port);
 static void (*dll_scheme_count_lines)(Scheme_Object *port);
 static Scheme_Object *(*dll_scheme_current_continuation_marks)(void);
 static void (*dll_scheme_display)(Scheme_Object *obj, Scheme_Object *port);
 static char *(*dll_scheme_display_to_string)(Scheme_Object *obj, long *len);
+static int (*dll_scheme_eq)(Scheme_Object *obj1, Scheme_Object *obj2);
 static Scheme_Object *(*dll_scheme_do_eval)(Scheme_Object *obj,
 	int _num_rands, Scheme_Object **rands, int val);
 static void (*dll_scheme_dont_gc_ptr)(void *p);
@@ -225,6 +234,7 @@ static char *(*dll_scheme_format)(char *
 # else
 static char *(*dll_scheme_format_utf8)(char *format, int flen, int argc,
 	Scheme_Object **argv, long *rlen);
+static Scheme_Object *(*dll_scheme_get_param)(Scheme_Config *c, int pos);
 # endif
 static void (*dll_scheme_gc_ptr_ok)(void *p);
 # if MZSCHEME_VERSION_MAJOR < 299
@@ -245,6 +255,8 @@ static Scheme_Object *(*dll_scheme_make_
 	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,
+	const char *name, mzshort mina, mzshort maxa);
 # if MZSCHEME_VERSION_MAJOR < 299
 static Scheme_Object *(*dll_scheme_make_string)(const char *chars);
 static Scheme_Object *(*dll_scheme_make_string_output_port)();
@@ -311,6 +323,9 @@ static Scheme_Object *(*dll_scheme_char_
 # define scheme_apply dll_scheme_apply
 # define scheme_basic_env dll_scheme_basic_env
 # define scheme_builtin_value dll_scheme_builtin_value
+# if MZSCHEME_VERSION_MAJOR >= 299
+#  define scheme_byte_string_to_char_string dll_scheme_byte_string_to_char_string
+# endif
 # define scheme_check_threads dll_scheme_check_threads
 # define scheme_close_input_port dll_scheme_close_input_port
 # define scheme_count_lines dll_scheme_count_lines
@@ -320,6 +335,7 @@ static Scheme_Object *(*dll_scheme_char_
 # define scheme_display_to_string dll_scheme_display_to_string
 # define scheme_do_eval dll_scheme_do_eval
 # define scheme_dont_gc_ptr dll_scheme_dont_gc_ptr
+# define scheme_eq dll_scheme_eq
 # define scheme_eval dll_scheme_eval
 # define scheme_eval_string dll_scheme_eval_string
 # define scheme_eval_string_all dll_scheme_eval_string_all
@@ -335,6 +351,7 @@ static Scheme_Object *(*dll_scheme_char_
 # else
 #  define scheme_get_sized_byte_string_output \
     dll_scheme_get_sized_byte_string_output
+# define scheme_get_param dll_scheme_get_param
 # endif
 # define scheme_intern_symbol dll_scheme_intern_symbol
 # define scheme_lookup_global dll_scheme_lookup_global
@@ -342,6 +359,7 @@ static Scheme_Object *(*dll_scheme_char_
 # 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
 #  define scheme_make_string dll_scheme_make_string
 #  define scheme_make_string_output_port dll_scheme_make_string_output_port
@@ -399,6 +417,9 @@ static Thunk_Info mzsch_imports[] = {
     {"scheme_add_global_symbol", (void **)&dll_scheme_add_global_symbol},
     {"scheme_apply", (void **)&dll_scheme_apply},
     {"scheme_basic_env", (void **)&dll_scheme_basic_env},
+# if MZSCHEME_VERSION_MAJOR >= 299
+    {"scheme_byte_string_to_char_string", (void **)&dll_scheme_byte_string_to_char_string},
+# endif
     {"scheme_builtin_value", (void **)&dll_scheme_builtin_value},
     {"scheme_check_threads", (void **)&dll_scheme_check_threads},
     {"scheme_close_input_port", (void **)&dll_scheme_close_input_port},
@@ -409,6 +430,7 @@ static Thunk_Info mzsch_imports[] = {
     {"scheme_display_to_string", (void **)&dll_scheme_display_to_string},
     {"scheme_do_eval", (void **)&dll_scheme_do_eval},
     {"scheme_dont_gc_ptr", (void **)&dll_scheme_dont_gc_ptr},
+    {"scheme_eq", (void **)&dll_scheme_eq},
     {"scheme_eval", (void **)&dll_scheme_eval},
     {"scheme_eval_string", (void **)&dll_scheme_eval_string},
     {"scheme_eval_string_all", (void **)&dll_scheme_eval_string_all},
@@ -418,6 +440,7 @@ static Thunk_Info mzsch_imports[] = {
     {"scheme_format", (void **)&dll_scheme_format},
 # else
     {"scheme_format_utf8", (void **)&dll_scheme_format_utf8},
+    {"scheme_get_param", (void **)&dll_scheme_get_param},
 #endif
     {"scheme_gc_ptr_ok", (void **)&dll_scheme_gc_ptr_ok},
 # if MZSCHEME_VERSION_MAJOR < 299
@@ -434,6 +457,7 @@ static Thunk_Info mzsch_imports[] = {
     {"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
     {"scheme_make_string", (void **)&dll_scheme_make_string},
     {"scheme_make_string_output_port", 
@@ -727,6 +751,8 @@ mzscheme_end(void)
     static void
 startup_mzscheme(void)
 {
+    Scheme_Object *proc_make_security_guard;
+
     scheme_set_stack_base(NULL, 1);
 
     MZ_REGISTER_STATIC(environment);
@@ -751,7 +777,24 @@ startup_mzscheme(void)
 	    scheme_make_pair(scheme_make_string(MZSCHEME_COLLECTS),
 		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>");
@@ -1579,6 +1622,9 @@ set_cursor(void *data, int argc, Scheme_
     long	    lnum = 0;
     long	    col = 0;
 
+#ifdef HAVE_SANDBOX
+    sandbox_check();
+#endif
     win = get_window_arg(prim->name, 1, argc, argv);
     GUARANTEE_PAIR(prim->name, 0);
 
@@ -1615,6 +1661,9 @@ mzscheme_open_buffer(void *data, int arg
     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);
@@ -1869,6 +1918,9 @@ set_buffer_line(void *data, int argc, Sc
     buf_T	    *savebuf;
     int		    n;
 
+#ifdef HAVE_SANDBOX
+    sandbox_check();
+#endif
     n = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
     if (!SCHEME_STRINGP(argv[1]) && !SCHEME_FALSEP(argv[1]))
         scheme_wrong_type(prim->name, "string or #f", 1, argc, argv);
@@ -1958,6 +2010,9 @@ set_buffer_line_list(void *data, int arg
     int		    i, old_len, new_len, hi, lo;
     long	    extra;
 
+#ifdef HAVE_SANDBOX
+    sandbox_check();
+#endif
     lo = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
     hi = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 1));
     if (!SCHEME_PAIRP(argv[2])
@@ -2121,6 +2176,9 @@ insert_buffer_line_list(void *data, int 
     buf_T	    *savebuf;
     int		    i, n, size;
 
+#ifdef HAVE_SANDBOX
+    sandbox_check();
+#endif
     /*
      * First of all, we check the type of the supplied MzScheme object.
      * It must be a string or a list, or the call is in error.
@@ -2380,8 +2438,9 @@ raise_vim_exn(const char *add_info)
     if (add_info != NULL)
     {
 	Scheme_Object   *info = scheme_make_string(add_info);
-	argv[0] = scheme_make_string(
-		scheme_format(fmt, strlen(fmt), 1, &info, NULL));
+	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"));
@@ -2596,3 +2655,66 @@ make_modules(Scheme_Env *env)
     scheme_add_global("global-namespace", (Scheme_Object *)environment, mod);
     scheme_finish_primitive_module(mod);
 }
+    
+#ifdef HAVE_SANDBOX
+static Scheme_Object *M_write = NULL;
+static Scheme_Object *M_read = NULL;
+static Scheme_Object *M_execute = NULL;
+static Scheme_Object *M_delete = NULL;
+
+    static void
+sandbox_check()
+{
+    if (sandbox)
+	raise_vim_exn(_("not allowed in the Vim sandbox"));
+}
+
+/* security guards to force Vim's sandbox restrictions on MzScheme level */ 
+    static Scheme_Object *
+sandbox_file_guard(int argc, Scheme_Object **argv)
+{
+    if (sandbox)
+    {
+	Scheme_Object *requested_access = argv[2];
+
+	if (M_write == NULL)
+	{
+	    MZ_REGISTER_STATIC(M_write);
+	    M_write = scheme_intern_symbol("write");
+	}
+	if (M_read == NULL)
+	{
+	    MZ_REGISTER_STATIC(M_read);
+	    M_read = scheme_intern_symbol("read");
+	}
+	if (M_execute == NULL)
+	{
+	    MZ_REGISTER_STATIC(M_execute);
+	    M_execute = scheme_intern_symbol("execute");
+	}
+	if (M_delete == NULL)
+	{
+	    MZ_REGISTER_STATIC(M_delete);
+	    M_delete = scheme_intern_symbol("delete");
+	}
+
+	while (!SCHEME_NULLP(requested_access))
+	{
+	    Scheme_Object *item = SCHEME_CAR(requested_access);
+	    if (scheme_eq(item, M_write) || scheme_eq(item, M_read)
+		    || scheme_eq(item, M_execute) || scheme_eq(item, M_delete))
+	    {
+		raise_vim_exn(_("not allowed in the Vim sandbox"));
+	    }
+	    requested_access = SCHEME_CDR(requested_access);
+	}
+    }
+    return scheme_void;
+}
+
+    static Scheme_Object *
+sandbox_network_guard(int argc, Scheme_Object **argv)
+{
+    return scheme_void;
+}
+#endif
--- a/src/if_mzsch.h
+++ b/src/if_mzsch.h
@@ -34,12 +34,13 @@
 # endif
 # define scheme_format scheme_format_utf8
 
-# define GET_BYTE_STRING(obj) (SCHEME_BYTE_STRINGP(obj) ? obj :   \
+# define SCHEME_GET_BYTE_STRING(obj) (SCHEME_BYTE_STRINGP(obj) ? obj :   \
 	scheme_char_string_to_byte_string(obj))
 #else
-# define GET_BYTE_STRING(obj) (obj)
+# define SCHEME_GET_BYTE_STRING(obj) (obj)
 # define SCHEME_BYTE_STRLEN_VAL SCHEME_STRLEN_VAL
 # define SCHEME_BYTE_STR_VAL SCHEME_STR_VAL
+# define scheme_byte_string_to_char_string(obj) (obj)
 #endif
 
 #endif /* _IF_MZSCH_H_ */
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -1369,12 +1369,13 @@ BufferGetattr(PyObject *self, char *name
     static PyObject *
 BufferRepr(PyObject *self)
 {
-    static char repr[50];
+    static char repr[100];
     BufferObject *this = (BufferObject *)(self);
 
     if (this->buf == INVALID_BUFFER_VALUE)
     {
-	sprintf(repr, _("<buffer object (deleted) at %8lX>"), (long)(self));
+	vim_snprintf(repr, 100, _("<buffer object (deleted) at %8lX>"),
+								(long)(self));
 	return PyString_FromString(repr);
     }
     else
@@ -1389,7 +1390,7 @@ BufferRepr(PyObject *self)
 	if (len > 35)
 	    name = name + (35 - len);
 
-	sprintf(repr, "<buffer %s%s>", len > 35 ? "..." : "", name);
+	vim_snprintf(repr, 100, "<buffer %s%s>", len > 35 ? "..." : "", name);
 
 	return PyString_FromString(repr);
     }
@@ -1588,12 +1589,12 @@ RangeGetattr(PyObject *self, char *name)
     static PyObject *
 RangeRepr(PyObject *self)
 {
-    static char repr[75];
+    static char repr[100];
     RangeObject *this = (RangeObject *)(self);
 
     if (this->buf->buf == INVALID_BUFFER_VALUE)
     {
-	sprintf(repr, "<range object (for deleted buffer) at %8lX>",
+	vim_snprintf(repr, 100, "<range object (for deleted buffer) at %8lX>",
 								(long)(self));
 	return PyString_FromString(repr);
     }
@@ -1609,7 +1610,7 @@ RangeRepr(PyObject *self)
 	if (len > 45)
 	    name = name + (45 - len);
 
-	sprintf(repr, "<range %s%s (%d:%d)>",
+	vim_snprintf(repr, 100, "<range %s%s (%d:%d)>",
 		len > 45 ? "..." : "", name,
 		this->start, this->end);
 
@@ -1963,12 +1964,13 @@ WindowSetattr(PyObject *self, char *name
     static PyObject *
 WindowRepr(PyObject *self)
 {
-    static char repr[50];
+    static char repr[100];
     WindowObject *this = (WindowObject *)(self);
 
     if (this->win == INVALID_WINDOW_VALUE)
     {
-	sprintf(repr, _("<window object (deleted) at %.8lX>"), (long)(self));
+	vim_snprintf(repr, 100, _("<window object (deleted) at %.8lX>"),
+								(long)(self));
 	return PyString_FromString(repr);
     }
     else
@@ -1980,9 +1982,10 @@ WindowRepr(PyObject *self)
 	    ++i;
 
 	if (w == NULL)
-	    sprintf(repr, _("<window object (unknown) at %.8lX>"), (long)(self));
+	    vim_snprintf(repr, 100, _("<window object (unknown) at %.8lX>"),
+								(long)(self));
 	else
-	    sprintf(repr, _("<window %d>"), i);
+	    vim_snprintf(repr, 100, _("<window %d>"), i);
 
 	return PyString_FromString(repr);
     }
--- a/src/if_tcl.c
+++ b/src/if_tcl.c
@@ -852,7 +852,9 @@ bufselfcmd(ref, interp, objc, objv)
 	    else
 	    {
 		char rbuf[64];
-		sprintf(rbuf, _("row %d column %d"), (int)row2tcl(pos->lnum), (int)col2tcl(pos->col));
+
+		sprintf(rbuf, _("row %d column %d"),
+			     (int)row2tcl(pos->lnum), (int)col2tcl(pos->col));
 		Tcl_SetResult(interp, rbuf, TCL_VOLATILE);
 	    }
 	    break;
@@ -874,7 +876,8 @@ bufselfcmd(ref, interp, objc, objv)
 		--val1;
 	    if (u_save((linenr_T)val1, (linenr_T)(val1+1)) != OK)
 	    {
-		Tcl_SetResult(interp, _("cannot save undo information"), TCL_STATIC);
+		Tcl_SetResult(interp, _("cannot save undo information"),
+								  TCL_STATIC);
 		err = TCL_ERROR;
 		break;
 	    }
@@ -882,7 +885,8 @@ bufselfcmd(ref, interp, objc, objv)
 	    line = Tcl_GetStringFromObj(objv[3], NULL);
 	    if (ml_append((linenr_T)val1, (char_u *)line, 0, FALSE) != OK)
 	    {
-		Tcl_SetResult(interp, _("cannot insert/append line"), TCL_STATIC);
+		Tcl_SetResult(interp, _("cannot insert/append line"),
+								  TCL_STATIC);
 		err = TCL_ERROR;
 		break;
 	    }
@@ -1067,6 +1071,7 @@ winselfcmd(ref, interp, objc, objv)
 	    if (objc == 2)
 	    {
 		char buf[64];
+
 		sprintf(buf, _("row %d column %d"), (int)row2tcl(win->w_cursor.lnum), (int)col2tcl(win->w_cursor.col));
 		Tcl_SetResult(interp, buf, TCL_VOLATILE);
 		break;
@@ -1486,7 +1491,8 @@ tclgetref(interp, refstartP, prefix, vim
     }
 
     if (ref)
-	sprintf(name, "::vim::%s", Tcl_GetCommandName(interp, ref->cmd));
+	vim_snprintf(name, sizeof(name), "::vim::%s",
+					Tcl_GetCommandName(interp, ref->cmd));
     else
     {
 	if (unused)
@@ -1507,7 +1513,8 @@ tclgetref(interp, refstartP, prefix, vim
 	}
 
 	/* This might break on some exotic systems... */
-	sprintf(name, "::vim::%s_%lx", prefix, (unsigned long)vimobj);
+	vim_snprintf(name, sizeof(name), "::vim::%s_%lx",
+					       prefix, (unsigned long)vimobj);
 	cmd = Tcl_CreateObjCommand(interp, name, proc,
 	    (ClientData)ref, (Tcl_CmdDeleteProc *)delref);
 	if (!cmd)
@@ -1881,7 +1888,7 @@ tclexit(error)
     if (error == TCL_EXIT )
     {
 	int retval;
-	char buf[32];
+	char buf[50];
 	Tcl_Obj *robj;
 
 	robj = Tcl_GetObjResult(tclinfo.interp);
@@ -1892,7 +1899,7 @@ tclexit(error)
 	}
 	else
 	{
-	    sprintf(buf, "E572: exit code %d", retval);
+	    sprintf(buf, _("E572: exit code %d"), retval);
 	    tclerrmsg(buf);
 	    if (retval == 0 )
 	    {
--- a/src/memline.c
+++ b/src/memline.c
@@ -1015,13 +1015,13 @@ ml_recover()
     }
 
     home_replace(NULL, mfp->mf_fname, NameBuff, MAXPATHL, TRUE);
-    msg_str((char_u *)_("Using swap file \"%s\""), NameBuff);
+    smsg((char_u *)_("Using swap file \"%s\""), NameBuff);
 
     if (buf_spname(curbuf) != NULL)
 	STRCPY(NameBuff, buf_spname(curbuf));
     else
 	home_replace(NULL, curbuf->b_ffname, NameBuff, MAXPATHL, TRUE);
-    msg_str((char_u *)_("Original file \"%s\""), NameBuff);
+    smsg((char_u *)_("Original file \"%s\""), NameBuff);
     msg_putchar('\n');
 
 /*
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -3295,7 +3295,7 @@ init_homedir()
 	    if (exp != NULL && *exp != NUL
 					&& STRLEN(exp) + STRLEN(p) < MAXPATHL)
 	    {
-		sprintf((char *)NameBuff, "%s%s", exp, p + 1);
+		vim_snprintf((char *)NameBuff, MAXPATHL, "%s%s", exp, p + 1);
 		var = NameBuff;
 		/* Also set $HOME, it's needed for _viminfo. */
 		vim_setenv((char_u *)"HOME", NameBuff);
--- a/src/ops.c
+++ b/src/ops.c
@@ -5226,7 +5226,7 @@ write_viminfo_registers(fp)
 #endif
 	    default:
 		sprintf((char *)IObuff, _("E574: Unknown register type %d"),
-		    y_regs[i].y_type);
+							    y_regs[i].y_type);
 		emsg(IObuff);
 		type = (char_u *)"LINE";
 		break;
@@ -5943,8 +5943,8 @@ line_count_info(line, wc, cc, limit, eol
 cursor_pos_info()
 {
     char_u	*p;
-    char_u	buf1[20];
-    char_u	buf2[20];
+    char_u	buf1[50];
+    char_u	buf2[40];
     linenr_T	lnum;
     long	byte_count = 0;
     long	byte_count_cursor = 0;
@@ -6106,7 +6106,7 @@ cursor_pos_info()
 		buf1[0] = NUL;
 
 	    if (char_count_cursor == byte_count_cursor
-		    && char_count == byte_count)
+						  && char_count == byte_count)
 		sprintf((char *)IObuff, _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"),
 			buf1, line_count_selected,
 			(long)curbuf->b_ml.ml_line_count,
--- a/src/option.c
+++ b/src/option.c
@@ -2571,7 +2571,7 @@ static char_u *set_chars_option __ARGS((
 static char_u *check_clipboard_option __ARGS((void));
 #endif
 static char_u *set_bool_option __ARGS((int opt_idx, char_u *varp, int value, int opt_flags));
-static char_u *set_num_option __ARGS((int opt_idx, char_u *varp, long value, char_u *errbuf, int opt_flags));
+static char_u *set_num_option __ARGS((int opt_idx, char_u *varp, long value, char_u *errbuf, size_t errbuflen, int opt_flags));
 static void check_redraw __ARGS((long_u flags));
 static int findoption __ARGS((char_u *));
 static int find_key_option __ARGS((char_u *));
@@ -3881,7 +3881,7 @@ do_set(arg, opt_flags)
 			if (removing)
 			    value = *(long *)varp - value;
 			errmsg = set_num_option(opt_idx, varp, value,
-							   errbuf, opt_flags);
+					   errbuf, sizeof(errbuf), opt_flags);
 		    }
 		    else if (opt_idx >= 0)		    /* string */
 		    {
@@ -4287,7 +4287,7 @@ illegal_char(errbuf, c)
     if (errbuf == NULL)
 	return (char_u *)"";
     sprintf((char *)errbuf, _("E539: Illegal character <%s>"),
-	    (char *)transchar(c));
+							(char *)transchar(c));
     return errbuf;
 }
 
@@ -6822,11 +6822,12 @@ set_bool_option(opt_idx, varp, value, op
  * Returns NULL for success, or an error message for an error.
  */
     static char_u *
-set_num_option(opt_idx, varp, value, errbuf, opt_flags)
+set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags)
     int		opt_idx;		/* index in options[] table */
     char_u	*varp;			/* pointer to the option variable */
     long	value;			/* new value */
     char_u	*errbuf;		/* buffer for error messages */
+    size_t	errbuflen;		/* length of "errbuf" */
     int		opt_flags;		/* OPT_LOCAL, OPT_GLOBAL and
 					   OPT_MODELINE */
 {
@@ -7116,8 +7117,8 @@ set_num_option(opt_idx, varp, value, err
     {
 	if (errbuf != NULL)
 	{
-	    sprintf((char *)errbuf, _("E593: Need at least %d lines"),
-								  min_rows());
+	    vim_snprintf((char *)errbuf, errbuflen,
+			       _("E593: Need at least %d lines"), min_rows());
 	    errmsg = errbuf;
 	}
 	Rows = min_rows();
@@ -7126,8 +7127,8 @@ set_num_option(opt_idx, varp, value, err
     {
 	if (errbuf != NULL)
 	{
-	    sprintf((char *)errbuf, _("E594: Need at least %d columns"),
-								 MIN_COLUMNS);
+	    vim_snprintf((char *)errbuf, errbuflen,
+			    _("E594: Need at least %d columns"), MIN_COLUMNS);
 	    errmsg = errbuf;
 	}
 	Columns = MIN_COLUMNS;
@@ -7453,7 +7454,8 @@ set_option_value(name, number, string, o
 	    if (varp != NULL)	/* hidden option is not changed */
 	    {
 		if (flags & P_NUM)
-		    (void)set_num_option(opt_idx, varp, number, NULL, opt_flags);
+		    (void)set_num_option(opt_idx, varp, number,
+							  NULL, 0, opt_flags);
 		else
 		    (void)set_bool_option(opt_idx, varp, (int)number, opt_flags);
 	    }
--- a/src/po/it.po
+++ b/src/po/it.po
@@ -1309,7 +1309,7 @@ msgid "1 substitution"
 msgstr "1 sostituzione"
 
 #: ex_cmds.c:4550
-#, fuzzy, c-format
+#, c-format
 msgid "%ld matches"
 msgstr "%ld corrisp."
 
@@ -1608,7 +1608,6 @@ msgid "Append File"
 msgstr "In aggiunta al File"
 
 #: ex_docmd.c:7225
-#, fuzzy
 msgid "E747: Cannot change directory, buffer is modifed (add ! to override)"
 msgstr ""
 "E747: Non posso cambiare directory, buffer modificato (aggiungi ! per "
@@ -2271,7 +2270,6 @@ msgid "W16: Warning: Mode of file \"%s\"
 msgstr "W16: Attenzione: Modo File \"%s\" modificato dopo l'apertura"
 
 #: fileio.c:6066
-#, fuzzy
 msgid "See \":help W16\" for more info."
 msgstr "Vedere \":help W16\" per ulteriori informazioni."
 
@@ -5600,7 +5598,6 @@ msgid "E382: Cannot write, 'buftype' opt
 msgstr "E382: Non posso scrivere, l'opzione 'buftype' è impostata"
 
 #: quickfix.c:2379
-#, fuzzy
 msgid "E682: Invalid search pattern or delimiter"
 msgstr "E682: Espressione o delimitatore di ricerca non validi"
 
@@ -6688,7 +6685,6 @@ msgid "with (classic) GUI."
 msgstr "con GUI (classica)."
 
 #: version.c:876
-#, fuzzy
 msgid "with KDE GUI."
 msgstr "con GUI KDE."
 
@@ -7002,7 +6998,6 @@ msgid "E588: :endwhile without :while"
 msgstr "E588: :endwhile senza :while"
 
 #: globals.h:1276
-#, fuzzy
 msgid "E588: :endfor without :for"
 msgstr "E588: :endfor senza :for"
 
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -92,5 +92,4 @@ int get_user_name __ARGS((char_u *buf, i
 void sort_strings __ARGS((char_u **files, int count));
 int pathcmp __ARGS((const char *p, const char *q, int maxlen));
 char_u *parse_list_options __ARGS((char_u *option_str, option_table_T *table, int table_size));
-void msg_str __ARGS((char_u *s, char_u *arg));
 /* vim: set ft=c : */
--- a/src/search.c
+++ b/src/search.c
@@ -4278,8 +4278,9 @@ find_pattern_in_path(ptr, dir, len, whol
 #ifdef FEAT_INS_EXPAND
 		    if (action == ACTION_EXPAND)
 		    {
-			sprintf((char*)IObuff, _("Scanning included file: %s"),
-			    (char *)new_fname);
+			vim_snprintf((char*)IObuff, IOSIZE,
+				_("Scanning included file: %s"),
+				(char *)new_fname);
 			msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
 		    }
 #endif
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -3433,7 +3433,7 @@ syn_cmd_onoff(eap, name)
     if (!eap->skip)
     {
 	STRCPY(buf, "so ");
-	sprintf((char *)buf + 3, SYNTAX_FNAME, name);
+	vim_snprintf((char *)buf + 3, sizeof(buf) - 3, SYNTAX_FNAME, name);
 	do_cmdline_cmd(buf);
     }
 }
--- a/src/ui.c
+++ b/src/ui.c
@@ -2140,7 +2140,7 @@ clip_x11_request_selection(myShell, dpy,
 	clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
 	XFree((void *)buffer);
 	if (p_verbose > 0)
-	    smsg((char_u *)_("Used CUT_BUFFER0 instead of empty selection") );
+	    MSG(_("Used CUT_BUFFER0 instead of empty selection"));
     }
 }