2017-09-30 06:18:11 +00:00
function read _double _le ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ {
2017-02-10 19:23:01 +00:00
var s = 1 - 2 * ( b [ idx + 7 ] >>> 7 ) ;
var e = ( ( b [ idx + 7 ] & 0x7f ) << 4 ) + ( ( b [ idx + 6 ] >>> 4 ) & 0x0f ) ;
var m = ( b [ idx + 6 ] & 0x0f ) ;
for ( var i = 5 ; i >= 0 ; -- i ) m = m * 256 + b [ idx + i ] ;
2018-02-08 18:21:39 +00:00
if ( e == 0x7ff ) return m == 0 ? ( s * Infinity ) : NaN ;
2017-02-10 19:23:01 +00:00
if ( e == 0 ) e = - 1022 ;
else { e -= 1023 ; m += Math . pow ( 2 , 52 ) ; }
return s * Math . pow ( 2 , e - 52 ) * m ;
}
2017-09-30 06:18:11 +00:00
function write _double _le ( b /*:RawBytes|CFBlob*/ , v /*:number*/ , idx /*:number*/ ) {
2018-02-08 18:21:39 +00:00
var bs = ( ( ( ( v < 0 ) || ( 1 / v == - Infinity ) ) ? 1 : 0 ) << 7 ) , e = 0 , m = 0 ;
var av = bs ? ( - v ) : v ;
2017-02-10 19:23:01 +00:00
if ( ! isFinite ( av ) ) { e = 0x7ff ; m = isNaN ( v ) ? 0x6969 : 0 ; }
2017-09-22 22:18:51 +00:00
else if ( av == 0 ) e = m = 0 ;
2017-02-10 19:23:01 +00:00
else {
2017-09-05 05:26:50 +00:00
e = Math . floor ( Math . log ( av ) / Math . LN2 ) ;
m = av * Math . pow ( 2 , 52 - e ) ;
2018-02-08 18:21:39 +00:00
if ( ( e <= - 1023 ) && ( ! isFinite ( m ) || ( m < Math . pow ( 2 , 52 ) ) ) ) { e = - 1022 ; }
2017-02-10 19:23:01 +00:00
else { m -= Math . pow ( 2 , 52 ) ; e += 1023 ; }
}
for ( var i = 0 ; i <= 5 ; ++ i , m /= 256 ) b [ idx + i ] = m & 0xff ;
2018-02-08 18:21:39 +00:00
b [ idx + 6 ] = ( ( e & 0x0f ) << 4 ) | ( m & 0xf ) ;
2017-02-10 19:23:01 +00:00
b [ idx + 7 ] = ( e >> 4 ) | bs ;
2014-01-28 16:38:02 +00:00
}
2018-02-21 07:01:34 +00:00
var _ _toBuffer = function ( bufs /*:Array<Array<RawBytes> >*/ ) /*:RawBytes*/ { var x = [ ] , w = 10240 ; for ( var i = 0 ; i < bufs [ 0 ] . length ; ++ i ) if ( bufs [ 0 ] [ i ] ) for ( var j = 0 , L = bufs [ 0 ] [ i ] . length ; j < L ; j += w ) x . push . apply ( x , bufs [ 0 ] [ i ] . slice ( j , j + w ) ) ; return x ; } ;
2017-09-30 06:18:11 +00:00
var _ _ _toBuffer = _ _toBuffer ;
2017-10-02 08:15:36 +00:00
var _ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < e ; i += 2 ) ss . push ( String . fromCharCode ( _ _readUInt16LE ( b , i ) ) ) ; return ss . join ( "" ) . replace ( chr0 , '' ) ; } ;
2017-09-30 06:18:11 +00:00
var _ _ _utf16le = _ _utf16le ;
2017-08-19 23:06:34 +00:00
var _ _hexlify = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < s + l ; ++ i ) ss . push ( ( "0" + b [ i ] . toString ( 16 ) ) . slice ( - 2 ) ) ; return ss . join ( "" ) ; } ;
var _ _ _hexlify = _ _hexlify ;
2017-09-30 06:18:11 +00:00
var _ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { var ss = [ ] ; for ( var i = s ; i < e ; i ++ ) ss . push ( String . fromCharCode ( _ _readUInt8 ( b , i ) ) ) ; return ss . join ( "" ) ; } ;
2018-02-18 03:56:52 +00:00
var _ _ _utf8 = _ _utf8 ;
2017-09-30 06:18:11 +00:00
var _ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _lpstr = _ _lpstr ;
2017-12-30 05:40:35 +00:00
var _ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _cpstr = _ _cpstr ;
2017-09-30 06:18:11 +00:00
var _ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _lpwstr = _ _lpwstr ;
2017-04-13 01:29:38 +00:00
var _ _lpp4 , _ _ _lpp4 ;
2017-09-30 06:18:11 +00:00
_ _lpp4 = _ _ _lpp4 = function lpp4 _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf16le ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _ _8lpp4 = _ _8lpp4 ;
2014-07-28 13:22:32 +00:00
var _ _double , _ _ _double ;
2017-09-30 06:18:11 +00:00
_ _double = _ _ _double = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) { return read _double _le ( b , idx ) ; } ;
2014-07-28 13:22:32 +00:00
var is _buf = function is _buf _a ( a ) { return Array . isArray ( a ) ; } ;
2017-09-30 06:18:11 +00:00
if ( has _buf /*:: && typeof Buffer !== 'undefined'*/ ) {
2017-10-02 08:15:36 +00:00
_ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _utf16le ( b , s , e ) ; return b . toString ( 'utf16le' , s , e ) . replace ( chr0 , '' ) /*.replace(chr1,'!')*/ ; } ;
2017-09-30 06:18:11 +00:00
_ _hexlify = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { return Buffer . isBuffer ( b ) /*:: && b instanceof Buffer*/ ? b . toString ( 'hex' , s , s + l ) : _ _ _hexlify ( b , s , l ) ; } ;
_ _lpstr = function lpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
2017-12-30 05:40:35 +00:00
_ _cpstr = function cpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _cpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
2017-09-30 06:18:11 +00:00
_ _lpwstr = function lpwstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpwstr ( b , i ) ; var len = 2 * b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len - 1 ) ; } ;
_ _lpp4 = function lpp4 _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len ) ; } ;
_ _8lpp4 = function lpp4 _8b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _8lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf8' , i + 4 , i + 4 + len ) ; } ;
2018-02-18 03:56:52 +00:00
_ _utf8 = function utf8 _b ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return ( Buffer . isBuffer ( b ) /*:: && (b instanceof Buffer)*/ ) ? b . toString ( 'utf8' , s , e ) : _ _ _utf8 ( b , s , e ) ; } ;
2014-06-29 18:29:45 +00:00
_ _toBuffer = function ( bufs ) { return ( bufs [ 0 ] . length > 0 && Buffer . isBuffer ( bufs [ 0 ] [ 0 ] ) ) ? Buffer . concat ( bufs [ 0 ] ) : _ _ _toBuffer ( bufs ) ; } ;
2015-04-02 20:32:22 +00:00
bconcat = function ( bufs ) { return Buffer . isBuffer ( bufs [ 0 ] ) ? Buffer . concat ( bufs ) : [ ] . concat . apply ( [ ] , bufs ) ; } ;
2017-09-30 06:18:11 +00:00
_ _double = function double _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( Buffer . isBuffer ( b ) /*::&& b instanceof Buffer*/ ) return b . readDoubleLE ( i ) ; return _ _ _double ( b , i ) ; } ;
2014-07-28 13:22:32 +00:00
is _buf = function is _buf _b ( a ) { return Buffer . isBuffer ( a ) || Array . isArray ( a ) ; } ;
2014-01-28 16:38:02 +00:00
}
2015-04-02 20:32:22 +00:00
/* from js-xls */
if ( typeof cptable !== 'undefined' ) {
2017-10-02 08:15:36 +00:00
_ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return cptable . utils . decode ( 1200 , b . slice ( s , e ) ) . replace ( chr0 , '' ) ; } ;
2017-09-30 06:18:11 +00:00
_ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return cptable . utils . decode ( 65001 , b . slice ( s , e ) ) ; } ;
2017-12-30 05:40:35 +00:00
_ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( current _ansi , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( current _codepage , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
2017-09-30 06:18:11 +00:00
_ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
_ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 65001 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
2015-04-02 20:32:22 +00:00
}
2014-06-29 18:29:45 +00:00
2017-09-30 06:18:11 +00:00
var _ _readUInt8 = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx ] ; } ;
2018-02-08 18:21:39 +00:00
var _ _readUInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; } ;
var _ _readInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { var u = ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; return ( u < 0x8000 ) ? u : ( ( 0xffff - u + 1 ) * - 1 ) ; } ;
2017-09-30 06:18:11 +00:00
var _ _readUInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx + 3 ] * ( 1 << 24 ) + ( b [ idx + 2 ] << 16 ) + ( b [ idx + 1 ] << 8 ) + b [ idx ] ; } ;
var _ _readInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 3 ] << 24 ) | ( b [ idx + 2 ] << 16 ) | ( b [ idx + 1 ] << 8 ) | b [ idx ] ; } ;
2017-10-17 00:14:32 +00:00
var _ _readInt32BE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx ] << 24 ) | ( b [ idx + 1 ] << 16 ) | ( b [ idx + 2 ] << 8 ) | b [ idx + 3 ] ; } ;
2014-01-28 16:38:02 +00:00
2017-09-30 06:18:11 +00:00
function ReadShift ( size /*:number*/ , t /*:?string*/ ) /*:number|string*/ {
var o = "" , oI /*:: :number = 0*/ , oR , oo = [ ] , w , vv , i , loc ;
2015-04-02 20:32:22 +00:00
switch ( t ) {
case 'dbcs' :
loc = this . l ;
if ( has _buf && Buffer . isBuffer ( this ) ) o = this . slice ( this . l , this . l + 2 * size ) . toString ( "utf16le" ) ;
2018-02-08 18:21:39 +00:00
else for ( i = 0 ; i < size ; ++ i ) { o += String . fromCharCode ( _ _readUInt16LE ( this , loc ) ) ; loc += 2 ; }
2015-04-02 20:32:22 +00:00
size *= 2 ;
break ;
case 'utf8' : o = _ _utf8 ( this , this . l , this . l + size ) ; break ;
case 'utf16le' : size *= 2 ; o = _ _utf16le ( this , this . l , this . l + size ) ; break ;
2017-02-22 06:57:59 +00:00
case 'wstr' :
if ( typeof cptable !== 'undefined' ) o = cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + 2 * size ) ) ;
else return ReadShift . call ( this , size , 'dbcs' ) ;
2017-03-10 08:39:51 +00:00
size = 2 * size ; break ;
2017-02-19 20:36:32 +00:00
2015-04-02 20:32:22 +00:00
/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
2017-12-30 05:40:35 +00:00
case 'lpstr-ansi' : o = _ _lpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
case 'lpstr-cp' : o = _ _cpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
2015-04-02 20:32:22 +00:00
/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
2017-12-30 05:40:35 +00:00
case 'lpwstr' : o = _ _lpwstr ( this , this . l ) ; size = 4 + 2 * _ _readUInt32LE ( this , this . l ) ; break ;
2017-04-13 01:29:38 +00:00
/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */
case 'lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _lpp4 ( this , this . l ) ; if ( size & 0x02 ) size += 2 ; break ;
/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */
case '8lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _8lpp4 ( this , this . l ) ; if ( size & 0x03 ) size += 4 - ( size & 0x03 ) ; break ;
2015-04-02 20:32:22 +00:00
case 'cstr' : size = 0 ; o = "" ;
while ( ( w = _ _readUInt8 ( this , this . l + size ++ ) ) !== 0 ) oo . push ( _getchar ( w ) ) ;
o = oo . join ( "" ) ; break ;
2017-03-28 22:03:03 +00:00
case '_wstr' : size = 0 ; o = "" ;
2015-04-02 20:32:22 +00:00
while ( ( w = _ _readUInt16LE ( this , this . l + size ) ) !== 0 ) { oo . push ( _getchar ( w ) ) ; size += 2 ; }
size += 2 ; o = oo . join ( "" ) ; break ;
/* sbcs and dbcs support continue records in the SST way TODO codepages */
case 'dbcs-cont' : o = "" ; loc = this . l ;
2018-02-08 18:21:39 +00:00
for ( i = 0 ; i < size ; ++ i ) {
2015-04-02 20:32:22 +00:00
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt16LE ( this , loc ) ) ) ;
loc += 2 ;
} o = oo . join ( "" ) ; size *= 2 ; break ;
2017-12-04 04:41:41 +00:00
case 'cpstr' :
if ( typeof cptable !== 'undefined' ) {
o = cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + size ) ) ;
break ;
}
/* falls through */
2015-04-02 20:32:22 +00:00
case 'sbcs-cont' : o = "" ; loc = this . l ;
for ( i = 0 ; i != size ; ++ i ) {
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt8 ( this , loc ) ) ) ;
loc += 1 ;
} o = oo . join ( "" ) ; break ;
default :
switch ( size ) {
case 1 : oI = _ _readUInt8 ( this , this . l ) ; this . l ++ ; return oI ;
case 2 : oI = ( t === 'i' ? _ _readInt16LE : _ _readUInt16LE ) ( this , this . l ) ; this . l += 2 ; return oI ;
2017-10-17 00:14:32 +00:00
case 4 : case - 4 :
2018-02-08 18:21:39 +00:00
if ( t === 'i' || ( ( this [ this . l + 3 ] & 0x80 ) === 0 ) ) { oI = ( ( size > 0 ) ? _ _readInt32LE : _ _readInt32BE ) ( this , this . l ) ; this . l += 4 ; return oI ; }
2017-03-12 18:02:43 +00:00
else { oR = _ _readUInt32LE ( this , this . l ) ; this . l += 4 ; } return oR ;
2017-10-17 00:14:32 +00:00
case 8 : case - 8 :
if ( t === 'f' ) {
if ( size == 8 ) oR = _ _double ( this , this . l ) ;
else oR = _ _double ( [ this [ this . l + 7 ] , this [ this . l + 6 ] , this [ this . l + 5 ] , this [ this . l + 4 ] , this [ this . l + 3 ] , this [ this . l + 2 ] , this [ this . l + 1 ] , this [ this . l + 0 ] ] , 0 ) ;
this . l += 8 ; return oR ;
} else size = 8 ;
2015-04-02 20:32:22 +00:00
/* falls through */
case 16 : o = _ _hexlify ( this , this . l , size ) ; break ;
} }
2014-01-28 16:38:02 +00:00
this . l += size ; return o ;
}
2017-09-30 06:18:11 +00:00
var _ _writeUInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >>> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >>> 24 ) & 0xFF ) ; } ;
var _ _writeInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >> 24 ) & 0xFF ) ; } ;
var _ _writeUInt16LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; } ;
2017-02-10 19:23:01 +00:00
2017-09-30 06:18:11 +00:00
function WriteShift ( t /*:number*/ , val /*:string|number*/ , f /*:?string*/ ) /*:any*/ {
2017-03-12 18:02:43 +00:00
var size = 0 , i = 0 ;
2014-06-29 18:29:45 +00:00
if ( f === 'dbcs' ) {
2017-03-12 18:02:43 +00:00
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
2017-02-10 19:23:01 +00:00
for ( i = 0 ; i != val . length ; ++ i ) _ _writeUInt16LE ( this , val . charCodeAt ( i ) , this . l + 2 * i ) ;
2014-06-29 18:29:45 +00:00
size = 2 * val . length ;
2017-02-10 19:23:01 +00:00
} else if ( f === 'sbcs' ) {
2017-10-17 00:14:32 +00:00
/* TODO: codepage */
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
val = val . replace ( /[^\x00-\x7F]/g , "_" ) ;
2017-03-12 18:02:43 +00:00
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
2018-02-08 18:21:39 +00:00
for ( i = 0 ; i != val . length ; ++ i ) this [ this . l + i ] = ( val . charCodeAt ( i ) & 0xFF ) ;
2017-02-10 19:23:01 +00:00
size = val . length ;
2017-09-22 22:18:51 +00:00
} else if ( f === 'hex' ) {
for ( ; i < t ; ++ i ) {
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
2018-02-08 18:21:39 +00:00
this [ this . l ++ ] = ( parseInt ( val . slice ( 2 * i , 2 * i + 2 ) , 16 ) || 0 ) ;
2017-09-22 22:18:51 +00:00
} return this ;
} else if ( f === 'utf16le' ) {
2017-09-30 06:18:11 +00:00
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
2018-02-14 20:06:35 +00:00
var end /*:number*/ = Math . min ( this . l + t , this . length ) ;
2017-09-22 22:18:51 +00:00
for ( i = 0 ; i < Math . min ( val . length , t ) ; ++ i ) {
var cc = val . charCodeAt ( i ) ;
2018-02-08 18:21:39 +00:00
this [ this . l ++ ] = ( cc & 0xff ) ;
this [ this . l ++ ] = ( cc >> 8 ) ;
2017-09-22 22:18:51 +00:00
}
while ( this . l < end ) this [ this . l ++ ] = 0 ;
return this ;
2017-03-12 18:02:43 +00:00
} else /*:: if(typeof val === 'number') */ switch ( t ) {
2017-02-10 19:23:01 +00:00
case 1 : size = 1 ; this [ this . l ] = val & 0xFF ; break ;
case 2 : size = 2 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; break ;
case 3 : size = 3 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 2 ] = val & 0xFF ; break ;
case 4 : size = 4 ; _ _writeUInt32LE ( this , val , this . l ) ; break ;
case 8 : size = 8 ; if ( f === 'f' ) { write _double _le ( this , val , this . l ) ; break ; }
2014-05-29 22:30:03 +00:00
/* falls through */
case 16 : break ;
2017-02-10 19:23:01 +00:00
case - 4 : size = 4 ; _ _writeInt32LE ( this , val , this . l ) ; break ;
2014-05-29 22:30:03 +00:00
}
this . l += size ; return this ;
}
2017-09-30 06:18:11 +00:00
function CheckField ( hexstr /*:string*/ , fld /*:string*/ ) /*:void*/ {
2015-04-02 20:32:22 +00:00
var m = _ _hexlify ( this , this . l , hexstr . length >> 1 ) ;
2017-09-30 06:18:11 +00:00
if ( m !== hexstr ) throw new Error ( fld + 'Expected ' + hexstr + ' saw ' + m ) ;
2015-04-02 20:32:22 +00:00
this . l += hexstr . length >> 1 ;
}
2017-09-30 06:18:11 +00:00
function prep _blob ( blob , pos /*:number*/ ) /*:void*/ {
2014-07-28 13:22:32 +00:00
blob . l = pos ;
2017-09-30 06:18:11 +00:00
blob . read _shift = /*::(*/ ReadShift /*:: :any)*/ ;
2015-04-02 20:32:22 +00:00
blob . chk = CheckField ;
2014-06-29 18:29:45 +00:00
blob . write _shift = WriteShift ;
2014-01-28 16:38:02 +00:00
}
2017-09-30 06:18:11 +00:00
function parsenoop ( blob , length /*:: :number, opts?:any */ ) { blob . l += length ; }
2014-05-29 22:30:03 +00:00
2017-03-12 18:02:43 +00:00
function new _buf ( sz /*:number*/ ) /*:Block*/ {
2015-04-02 20:32:22 +00:00
var o = new _raw _buf ( sz ) ;
2014-06-29 18:29:45 +00:00
prep _blob ( o , 0 ) ;
2014-05-29 22:30:03 +00:00
return o ;
2014-06-29 18:29:45 +00:00
}
2014-05-29 22:30:03 +00:00