UNPKG

2.06 kBtext/coffeescriptView Raw
1
2
3'use strict'
4
5
6#===========================================================================================================
7#
8#-----------------------------------------------------------------------------------------------------------
9class @Hollerith_codec
10
11 #---------------------------------------------------------------------------------------------------------
12 constructor: ->
13 @sign_delta = 0x80000000 ### used to lift negative numbers to non-negative ###
14 @u32_width = 4 ### bytes per element ###
15 @vnr_width = 5 ### maximum elements in VNR vector ###
16 @nr_min = -0x80000000 ### smallest possible VNR element ###
17 @nr_max = +0x7fffffff ### largest possible VNR element ###
18 return undefined
19
20 #---------------------------------------------------------------------------------------------------------
21 encode: ( vnr ) ->
22 unless 0 < vnr.length <= @vnr_width
23 throw new Error "^44798^ expected VNR to be between 1 and #{@vnr_width} elements long, got length #{vnr.length}"
24 R = Buffer.alloc @vnr_width * @u32_width, 0x00 ### TAINT pre-compute constant ###
25 offset = -@u32_width
26 for idx in [ 0 ... @vnr_width ]
27 R.writeUInt32BE ( vnr[ idx ] ? 0 ) + @sign_delta, ( offset += @u32_width )
28 return R
29
30 #---------------------------------------------------------------------------------------------------------
31 _encode_bcd: ( vnr ) ->
32 vnr_width = 5 ### maximum elements in VNR vector ###
33 dpe = 4 ### digits per element ###
34 base = 36
35 plus = '+'
36 minus = '!'
37 padder = '.'
38 R = []
39 for idx in [ 0 ... vnr_width ]
40 nr = vnr[ idx ] ? 0
41 sign = if nr >= 0 then plus else minus
42 R.push sign + ( ( Math.abs nr ).toString base ).padStart dpe, padder
43 R = R.join ','
44 return R
45
46#===========================================================================================================
47@HOLLERITH_CODEC = new @Hollerith_codec()
48
49
50