--template-based encoder frunction for PBs (Parameter Blocks, i.e. TPB, DPB, etc.) --pb.encode(options_t, codes, encoders) -> encoded_options_string --pb.encode_*(v) -> encoded option string local asserts = require'glue'.assert local struct = require'struct' local pb = {} -- encode_*() functions used for encoding individual PB options in encoders table passed to encode(). local INT_SIZE = 4 local SHORT_SIZE = 2 local LONG_SIZE = 4 local POINTER_SIZE= 4 local MIN_INT = -2^(8*INT_SIZE-1) local MAX_INT = 2^(8*INT_SIZE-1)-1 local MAX_UINT = 2^(8*INT_SIZE)-1 local MIN_SHORT = -2^(8*SHORT_SIZE-1) local MAX_SHORT = 2^(8*SHORT_SIZE-1)-1 local MAX_USHORT = 2^(8*SHORT_SIZE)-1 local MAX_BYTE = 2^8-1 local MIN_SCHAR = -2^7 local MAX_SCHAR = 2^7-1 local function isint(v) return v%1 == 0 and v >= MIN_INT and v <= MAX_INT end local function isuint(v) return v%1 == 0 and v >= 0 and v <= MAX_UINT end local function isshort(v) return v%1 == 0 and v >= MIN_SHORT and v <= MAX_SHORT end local function isushort(v) return v%1 == 0 and v >= 0 and v <= MAX_USHORT end local function isbyte(v) return v%1 == 0 and v >= 0 and v <= MAX_BYTE end local function isschar(v) return v%1 == 0 and v >= MIN_SCHAR and v <= MAX_SCHAR end function pb.encode_enum(t) return function(v) local tv = asserts(t[v],'invalid enum constant %s',v) assert(isbyte(tv)) return struct.pack('BB',1,tv) end end function pb.encode_int(v) assert(isint(v),'32bit signed integer expected') return struct.pack('