1 |
|
2 |
|
3 | 'use strict'
|
4 |
|
5 |
|
6 | #===========================================================================================================
|
7 | #
|
8 | #-----------------------------------------------------------------------------------------------------------
|
9 | class @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 |
|