Mercurial > lua-cbor
view cbor.bignum.lua @ 100:02f2c75c459b default tip master
README: Supports up to Lua 5.4
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 27 Aug 2022 13:28:15 +0200 |
| parents | 4cf4ea489251 |
| children |
line wrap: on
line source
-- Bignum support using luaossl local cbor = require "cbor"; local bignum = require "openssl.bignum"; local big_zero = bignum.new(0); local big_negatives_one = bignum.new(-1); local function bignum_to_cbor(n) local tag = 2; if n < big_zero then tag = 3; n = big_negatives_one - n; end local as_binary = n:tobin(); return cbor.type_encoders.table(cbor.tagged(tag, as_binary)); end bignum.interpose("__tocbor", bignum_to_cbor); local function tagged2_to_bignum(value) local n = bignum.new(0); for i = 1, #value do n = n:shl(8); n = n + value:byte(i); end return n; end if bignum.fromBinary then tagged2_to_bignum = bignum.fromBinary; end local function tagged3_to_bignum(value) return big_negatives_one - tagged2_to_bignum(value); end local function tagged_to_bignum(tagged) if tagged.tag == 2 then return tagged2_to_bignum(tagged.value); elseif tagged.tag == 3 then return tagged3_to_bignum(tagged.value); else return nil, "not-a-bignum"; end end if cbor.tagged_decoders then cbor.tagged_decoders[2] = tagged2_to_bignum; cbor.tagged_decoders[3] = tagged3_to_bignum; end return { decode = tagged_to_bignum; }
