diff --git a/src/core/org/luaj/vm2/lib/BaseLib.java b/src/core/org/luaj/vm2/lib/BaseLib.java index 5f2e123e..d77ea2d0 100644 --- a/src/core/org/luaj/vm2/lib/BaseLib.java +++ b/src/core/org/luaj/vm2/lib/BaseLib.java @@ -230,8 +230,7 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { for ( int i=1, n=args.narg(); i<=n; i++ ) { if ( i>1 ) globals.STDOUT.write( '\t' ); LuaString s = tostring.call( args.arg(i) ).strvalue(); - int z = s.indexOf((byte)0, 0); - globals.STDOUT.write( s.m_bytes, s.m_offset, z>=0? z: s.m_length ); + globals.STDOUT.write( s.m_bytes, s.m_offset, s.m_length ); } globals.STDOUT.println(); return NONE; diff --git a/src/core/org/luaj/vm2/lib/StringLib.java b/src/core/org/luaj/vm2/lib/StringLib.java index 5eb9fb7d..a5a7b324 100644 --- a/src/core/org/luaj/vm2/lib/StringLib.java +++ b/src/core/org/luaj/vm2/lib/StringLib.java @@ -303,15 +303,20 @@ public class StringLib extends OneArgFunction { buf.append( (byte)'\\' ); buf.append( (byte)c ); break; - case '\r': - buf.append( "\\r" ); - break; - case '\0': - buf.append( "\\000" ); - break; default: - buf.append( (byte) c ); - break; + if (c <= 0x1F || c == 0x7F) { + buf.append( (byte) '\\' ); + if (i+1 == n || s.luaByte(i+1) < '0' || s.luaByte(i+1) > '9') { + buf.append(Integer.toString(c)); + } else { + buf.append( (byte) '0' ); + buf.append( (byte) (char) ('0' + c / 10) ); + buf.append( (byte) (char) ('0' + c % 10) ); + } + } else { + buf.append((byte) c); + } + break; } } buf.append( (byte) '"' ); diff --git a/test/lua/luaj3.0-tests.zip b/test/lua/luaj3.0-tests.zip index 62b42bc9..740fcbb7 100644 Binary files a/test/lua/luaj3.0-tests.zip and b/test/lua/luaj3.0-tests.zip differ diff --git a/test/lua/stringlib.lua b/test/lua/stringlib.lua index ba7834b2..5bf09550 100644 --- a/test/lua/stringlib.lua +++ b/test/lua/stringlib.lua @@ -111,18 +111,23 @@ print(string.format("simple%ssimple", " simple ")) local testformat = function(message,fmt,...) local s,e = pcall( string.format, fmt, ... ) if s then + if string.find(fmt, 'q') then + print(message, e) + end print( message, string.byte(e,1,#e) ) else print( message, 'error', e ) end end -specials = "\"specials\": %% \000 \r \n" testformat('plain %', "%%") -testformat("specials (%s)", "---%s---", specials) -testformat("specials (%q)", "---%q---", specials) +testformat("specials (%s)", "---%s---", " %% \000 \r \n ") +testformat("specials (%q)", "---%q---", " %% \000 \r \n ") +testformat("specials (%q)", "---%q---", "0%%0\0000\r0\n0") testformat("controls (%q)", "---%q---", ' \a \b \f \t \v \\ ') +testformat("controls (%q)", "---%q---", '0\a0\b0\f0\t0\v0\\0') testformat("extended (%q)", "---%q---", ' \222 \223 \224 ') +testformat("extended (%q)", "---%q---", '0\2220\2230\2240') testformat("embedded newlines", "%s\r%s\n%s", '===', '===', '===') -- format long string @@ -144,7 +149,7 @@ strtests('lower', string.lower, s ) strtests('upper', string.upper, s ) strtests('reverse', string.reverse, s ) strtests('char', string.char, 92, 60, 61, 93 ) -strtests('dump', string.dump, load('print("hello, world")', 'sample') ) +print( 'string.dump test:', load(string.dump(function(x) return 'foo->'..x end),'bar')('bat') ) -- floating point formats (not supported yet)