I'm not sure if this is a Mac-only problem or what, but we were getting incompatible-function-pointer errors when trying to build the RocketAMF C extensions. This fixes that! (Maybe it's like, Mac-only but as of Ruby 3.4 in specific? We're running RocketAMF in production on Ruby 3.4 right now without this. Shrug.)
94 lines
No EOL
2.2 KiB
Ruby
94 lines
No EOL
2.2 KiB
Ruby
module RocketAMF
|
|
module Pure
|
|
module ReadIOHelpers #:nodoc:
|
|
def read_int8 source
|
|
source.read(1).unpack('c').first
|
|
end
|
|
|
|
def read_word8 source
|
|
source.read(1).unpack('C').first
|
|
end
|
|
|
|
def read_double source
|
|
source.read(8).unpack('G').first
|
|
end
|
|
|
|
def read_word16_network source
|
|
source.read(2).unpack('n').first
|
|
end
|
|
|
|
def read_int16_network source
|
|
str = source.read(2)
|
|
str.reverse! if byte_order_little? # swap bytes as native=little (and we want network)
|
|
str.unpack('s').first
|
|
end
|
|
|
|
def read_word32_network source
|
|
source.read(4).unpack('N').first
|
|
end
|
|
|
|
def byte_order
|
|
if [0x12345678].pack("L") == "\x12\x34\x56\x78"
|
|
:BigEndian
|
|
else
|
|
:LittleEndian
|
|
end
|
|
end
|
|
|
|
def byte_order_little?
|
|
(byte_order == :LittleEndian) ? true : false;
|
|
end
|
|
end
|
|
|
|
module WriteIOHelpers #:nodoc:
|
|
def pack_integer(integer)
|
|
integer = integer & 0x1fffffff
|
|
if(integer < 0x80)
|
|
[integer].pack('c')
|
|
elsif(integer < 0x4000)
|
|
[integer >> 7 & 0x7f | 0x80].pack('c')+
|
|
[integer & 0x7f].pack('c')
|
|
elsif(integer < 0x200000)
|
|
[integer >> 14 & 0x7f | 0x80].pack('c') +
|
|
[integer >> 7 & 0x7f | 0x80].pack('c') +
|
|
[integer & 0x7f].pack('c')
|
|
else
|
|
[integer >> 22 & 0x7f | 0x80].pack('c')+
|
|
[integer >> 15 & 0x7f | 0x80].pack('c')+
|
|
[integer >> 8 & 0x7f | 0x80].pack('c')+
|
|
[integer & 0xff].pack('c')
|
|
end
|
|
end
|
|
|
|
def pack_double(double)
|
|
[double].pack('G')
|
|
end
|
|
|
|
def pack_int8(val)
|
|
[val].pack('c')
|
|
end
|
|
|
|
def pack_int16_network(val)
|
|
[val].pack('n')
|
|
end
|
|
|
|
def pack_word32_network(val)
|
|
str = [val].pack('L')
|
|
str.reverse! if byte_order_little? # swap bytes as native=little (and we want network)
|
|
str
|
|
end
|
|
|
|
def byte_order
|
|
if [0x12345678].pack("L") == "\x12\x34\x56\x78"
|
|
:BigEndian
|
|
else
|
|
:LittleEndian
|
|
end
|
|
end
|
|
|
|
def byte_order_little?
|
|
(byte_order == :LittleEndian) ? true : false;
|
|
end
|
|
end
|
|
end
|
|
end |