From fe6548d791e6b9bb13b1b0c6925f639be48be05c Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Thu, 10 Jan 2019 11:43:47 -0800 Subject: [PATCH] HL fixes --- src/haxe/io/Bytes.hx | 71 ++++++++++++++++--- .../_internal/backend/native/NativeCFFI.hx | 59 +++++++-------- 2 files changed, 93 insertions(+), 37 deletions(-) diff --git a/src/haxe/io/Bytes.hx b/src/haxe/io/Bytes.hx index fee0a38b4..750526dd4 100644 --- a/src/haxe/io/Bytes.hx +++ b/src/haxe/io/Bytes.hx @@ -356,7 +356,7 @@ class Bytes { setInt32(pos + 4, v.high); } - public function getString( pos : Int, len : Int, ?encoding : Dynamic ) : String { + public function getString( pos : Int, len : Int, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : String { #if !neko if( pos < 0 || len < 0 || pos + len > length ) throw Error.OutsideBounds; #end @@ -486,7 +486,7 @@ class Bytes { Returns bytes representation of the given String, using specific encoding (UTF-8 by default) **/ @:pure - public static function ofString( s : String, ?encoding : Dynamic ) : Bytes { + public static function ofString( s : String, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : Bytes { #if neko return new Bytes(s.length,untyped __dollar__ssub(s.__s,0,s.length)); #elseif flash @@ -556,6 +556,26 @@ class Bytes { #end } + /** + Convert hexadecimal string to Bytes. + Support only straight hex string ( Example: "0FDA14058916052309" ) + **/ + public static function ofHex( s : String ) : Bytes { + var len:Int = s.length; + if ( (len & 1) != 0 ) throw "Not a hex string (odd number of digits)"; + var ret : Bytes = Bytes.alloc(len >> 1); + for (i in 0...ret.length) + { + var high = StringTools.fastCodeAt(s, i*2); + var low = StringTools.fastCodeAt(s, i*2 + 1); + high = (high & 0xF) + ( (high & 0x40) >> 6 ) * 9; + low = (low & 0xF) + ( (low & 0x40) >> 6 ) * 9; + ret.set( i ,( (high << 4) | low) & 0xFF ); + } + + return ret; + } + /** Read the most efficiently possible the n-th byte of the data. Behavior when reading outside of the available data is unspecified. @@ -701,7 +721,7 @@ class Bytes { setInt32(pos + 4, v.high); } - public function getString( pos : Int, len : Int, ?encoding : Dynamic ) : String { + public function getString( pos : Int, len : Int, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : String { if( pos < 0 || len < 0 || pos + len > length ) throw Error.OutsideBounds; var s = ""; var b = b; @@ -763,7 +783,7 @@ class Bytes { return new Bytes(new BytesData(length)); } - public static function ofString( s : String, ?encoding : Dynamic ) : Bytes { + public static function ofString( s : String, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : Bytes { var a = new Array(); // utf16-decode and utf8-encode var i = 0; @@ -797,6 +817,23 @@ class Bytes { return new Bytes(b); } + public static function ofHex( s : String ) : Bytes { + if ( (s.length & 1) != 0 ) throw "Not a hex string (odd number of digits)"; + var a = new Array(); + var i = 0; + var len = s.length >> 1; + while( i < len ) { + var high = StringTools.fastCodeAt(s, i*2); + var low = StringTools.fastCodeAt(s, i*2 + 1); + high = (high & 0xF) + ( (high & 0x40) >> 6 ) * 9; + low = (low & 0xF) + ( (low & 0x40) >> 6 ) * 9; + a.push( ( (high << 4) | low) & 0xFF ); + i++; + } + + return new Bytes(new js.html.Uint8Array(a).buffer); + } + public inline static function fastGet( b : BytesData, pos : Int ) : Int { // this requires that we have wrapped it with haxe.io.Bytes beforehand return untyped b.bytes[pos]; @@ -920,7 +957,7 @@ class Bytes { setInt32(pos, v.low); } - public function getString( pos : Int, len : Int, ?encoding : Dynamic ) : String { + public function getString( pos : Int, len : Int, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : String { if( outRange(pos,len) ) throw Error.OutsideBounds; var b = new hl.Bytes(len + 1); @@ -963,7 +1000,7 @@ class Bytes { return new Bytes(b,length); } - public static function ofString( s : String, ?encoding : Dynamic ) : Bytes @:privateAccess { + public static function ofString( s : String, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : Bytes @:privateAccess { var size = 0; var b = s.bytes.utf16ToUtf8(0, size); return new Bytes(b,size); @@ -973,6 +1010,23 @@ class Bytes { return new Bytes(b.bytes,b.length); } + public static function ofHex( s : String ) : Bytes { + var len = s.length; + if ( (len & 1) != 0 ) throw "Not a hex string (odd number of digits)"; + var l = len >> 1; + var b = new hl.Bytes(l); + for (i in 0...l) + { + var high = s.charCodeAt(i*2); + var low = s.charCodeAt(i*2 + 1); + high = (high & 0xf) + ( (high & 0x40) >> 6 ) * 9; + low = (low & 0xf) + ( (low & 0x40) >> 6 ) * 9; + b.setUI8(i, ( (high << 4) | low) & 0xff ); + } + + return new Bytes(b,l); + } + public inline static function fastGet( b : BytesData, pos : Int ) : Int { return b[pos]; } @@ -1002,14 +1056,15 @@ extern class Bytes { public function getInt64( pos : Int ) : haxe.Int64; public function setInt32( pos : Int, v : Int ) : Void; public function setInt64( pos : Int, v : haxe.Int64 ) : Void; - public function getString( pos : Int, len : Int, ?encoding : Dynamic ) : String; + public function getString( pos : Int, len : Int, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : String; public function toString() : String; public function toHex() : String; public function getData() : BytesData; public static function alloc( length : Int ) : Bytes; @:pure - public static function ofString( s : String, ?encoding : Dynamic ) : Bytes; + public static function ofString( s : String, ?encoding : #if (haxe_ver >= 4) haxe.io.Encoding #else Dynamic #end ) : Bytes; public static function ofData( b : BytesData ) : Bytes; + public static function ofHex ( s : String ) : Bytes; public static function fastGet( b : BytesData, pos : Int ) : Int; static function __init__():Void { haxe.io.Error; diff --git a/src/lime/_internal/backend/native/NativeCFFI.hx b/src/lime/_internal/backend/native/NativeCFFI.hx index cfe2dc120..f46001049 100644 --- a/src/lime/_internal/backend/native/NativeCFFI.hx +++ b/src/lime/_internal/backend/native/NativeCFFI.hx @@ -3432,35 +3432,36 @@ class NativeCFFI { #end #if hl - @:cffi private static function lime_vorbis_file_bitrate (vorbisFile:Dynamic, bitstream:Int):Int; - @:cffi private static function lime_vorbis_file_bitrate_instant (vorbisFile:Dynamic):Int; - @:cffi private static function lime_vorbis_file_clear (vorbisFile:Dynamic):Void; - @:cffi private static function lime_vorbis_file_comment (vorbisFile:Dynamic, bitstream:Int):Dynamic; - @:cffi private static function lime_vorbis_file_crosslap (vorbisFile:Dynamic, otherVorbisFile:Dynamic):Dynamic; - @:cffi private static function lime_vorbis_file_from_bytes (bytes:Dynamic):Dynamic; - @:cffi private static function lime_vorbis_file_from_file (path:String):Dynamic; - @:cffi private static function lime_vorbis_file_info (vorbisFile:Dynamic, bitstream:Int):Dynamic; - @:cffi private static function lime_vorbis_file_pcm_seek (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int; - @:cffi private static function lime_vorbis_file_pcm_seek_lap (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int; - @:cffi private static function lime_vorbis_file_pcm_seek_page (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int; - @:cffi private static function lime_vorbis_file_pcm_seek_page_lap (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int; - @:cffi private static function lime_vorbis_file_raw_seek (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int; - @:cffi private static function lime_vorbis_file_raw_seek_lap (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int; - @:cffi private static function lime_vorbis_file_pcm_tell (vorbisFile:Dynamic):Dynamic; - @:cffi private static function lime_vorbis_file_pcm_total (vorbisFile:Dynamic, bitstream:Int):Dynamic; - @:cffi private static function lime_vorbis_file_raw_tell (vorbisFile:Dynamic):Dynamic; - @:cffi private static function lime_vorbis_file_raw_total (vorbisFile:Dynamic, bitstream:Int):Dynamic; - @:cffi private static function lime_vorbis_file_read (vorbisFile:Dynamic, buffer:Dynamic, position:Int, length:Int, bigendianp:Bool, word:Int, signed:Bool):Dynamic; - @:cffi private static function lime_vorbis_file_read_float (vorbisFile:Dynamic, pcmChannels:Dynamic, samples:Int):Dynamic; - @:cffi private static function lime_vorbis_file_seekable (vorbisFile:Dynamic):Bool; - @:cffi private static function lime_vorbis_file_serial_number (vorbisFile:Dynamic, bitstream:Int):Int; - @:cffi private static function lime_vorbis_file_streams (vorbisFile:Dynamic):Int; - @:cffi private static function lime_vorbis_file_time_seek (vorbisFile:Dynamic, s:Float):Int; - @:cffi private static function lime_vorbis_file_time_seek_lap (vorbisFile:Dynamic, s:Float):Int; - @:cffi private static function lime_vorbis_file_time_seek_page (vorbisFile:Dynamic, s:Float):Int; - @:cffi private static function lime_vorbis_file_time_seek_page_lap (vorbisFile:Dynamic, s:Float):Int; - @:cffi private static function lime_vorbis_file_time_tell (vorbisFile:Dynamic):Float; - @:cffi private static function lime_vorbis_file_time_total (vorbisFile:Dynamic, bitstream:Int):Float; + // TODO + private static function lime_vorbis_file_bitrate (vorbisFile:Dynamic, bitstream:Int):Int { return 0; } + private static function lime_vorbis_file_bitrate_instant (vorbisFile:Dynamic):Int { return 0; } + private static function lime_vorbis_file_clear (vorbisFile:Dynamic):Void {} + private static function lime_vorbis_file_comment (vorbisFile:Dynamic, bitstream:Int):Dynamic { return null; } + private static function lime_vorbis_file_crosslap (vorbisFile:Dynamic, otherVorbisFile:Dynamic):Dynamic { return null; } + private static function lime_vorbis_file_from_bytes (bytes:Dynamic):Dynamic { return null; } + private static function lime_vorbis_file_from_file (path:String):Dynamic { return null; } + private static function lime_vorbis_file_info (vorbisFile:Dynamic, bitstream:Int):Dynamic { return null; } + private static function lime_vorbis_file_pcm_seek (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int { return 0; } + private static function lime_vorbis_file_pcm_seek_lap (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int { return 0; } + private static function lime_vorbis_file_pcm_seek_page (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int { return 0; } + private static function lime_vorbis_file_pcm_seek_page_lap (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int { return 0; } + private static function lime_vorbis_file_raw_seek (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int { return 0; } + private static function lime_vorbis_file_raw_seek_lap (vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int { return 0; } + private static function lime_vorbis_file_pcm_tell (vorbisFile:Dynamic):Dynamic { return null; } + private static function lime_vorbis_file_pcm_total (vorbisFile:Dynamic, bitstream:Int):Dynamic { return null; } + private static function lime_vorbis_file_raw_tell (vorbisFile:Dynamic):Dynamic { return null; } + private static function lime_vorbis_file_raw_total (vorbisFile:Dynamic, bitstream:Int):Dynamic { return null; } + private static function lime_vorbis_file_read (vorbisFile:Dynamic, buffer:Dynamic, position:Int, length:Int, bigendianp:Bool, word:Int, signed:Bool):Dynamic { return null; } + private static function lime_vorbis_file_read_float (vorbisFile:Dynamic, pcmChannels:Dynamic, samples:Int):Dynamic { return null; } + private static function lime_vorbis_file_seekable (vorbisFile:Dynamic):Bool { return false; } + private static function lime_vorbis_file_serial_number (vorbisFile:Dynamic, bitstream:Int):Int { return 0; } + private static function lime_vorbis_file_streams (vorbisFile:Dynamic):Int { return 0; } + private static function lime_vorbis_file_time_seek (vorbisFile:Dynamic, s:Float):Int { return 0; } + private static function lime_vorbis_file_time_seek_lap (vorbisFile:Dynamic, s:Float):Int { return 0; } + private static function lime_vorbis_file_time_seek_page (vorbisFile:Dynamic, s:Float):Int { return 0; } + private static function lime_vorbis_file_time_seek_page_lap (vorbisFile:Dynamic, s:Float):Int { return 0; } + private static function lime_vorbis_file_time_tell (vorbisFile:Dynamic):Float { return 0; } + private static function lime_vorbis_file_time_total (vorbisFile:Dynamic, bitstream:Int):Float { return 0; } #end #end