Files
prosperon/scripts/jswota.cm

134 lines
2.1 KiB
Plaintext

var blob = use('blob')
var utf8 = use('utf8')
var INT = new blob(8, false)
stone(INT)
var FP = new blob(8)
FP.write_fit(1,8)
stone(FP)
var ARRAY = new blob(8)
ARRAY.write_fit(2,8)
stone(ARRAY)
var RECORD = new blob(8)
RECORD.write_fit(3,8)
stone(RECORD)
var BLOB = new blob(8)
BLOB.write_fit(4,8)
stone(BLOB)
var TEXT = new blob(8)
TEXT.write_fit(5,8)
stone(TEXT)
var SYMBOL = new blob(8)
SYMBOL.write_fit(7,8)
stone(SYMBOL)
var NULL = new blob(56)
NULL.write_fit(0,56)
stone(NULL)
var FALSE = new blob(56)
FALSE.write_fit(2,56)
stone(FALSE)
var TRUE = new blob(56)
TRUE.write_fit(3, 56)
stone(TRUE)
var PRIVATE = new blob(56)
PRIVATE.write_fit(8, 56)
stone(PRIVATE)
var SYSTEM = new blob(56)
SYSTEM.write_fit(9, 56)
stone(SYSTEM)
var encoders = {}
encoders.number = function(b, val)
{
// encoding all as floats
b.write_fit(0,56)
b.write_blob(FP)
b.write_number(val)
}
function encode_array(b, val)
{
b.write_fit(val.length, 56)
b.write_blob(ARRAY)
for (var v of val)
encode_val(b, v)
}
function encode_object(b, val)
{
var keys = Object.keys(val)
b.write_fit(b, keys.length)
b.write_blob(RECORD)
for (var key of keys) {
if (typeof val[key] === 'function') continue
encoders.string(b, key)
encode_val(b, val[key])
}
}
function encode_blob(b, val)
{
b.write_fit(val.length, 56)
b.write_blob(BLOB)
b.write_blob(val)
}
encoders.object = function(b, val)
{
if (Array.isArray(val))
encode_array(b,val)
else if (val instanceof blob)
encode_blob(b,val)
else
encode_object(b,val)
}
encoders.string = function(b, val)
{
// encoding as utf8
b.write_fit(utf8.byte_length(val), 56)
b.write_blob(TEXT)
b.write_blob(utf8.encode(val))
}
encoders.boolean = function(b, val)
{
if (val)
b.write_blob(TRUE)
else
b.write_blob(FALSE)
b.write_blob(SYMBOL)
}
encoders.undefined = function(b, val)
{
b.write_blob(NULL)
b.write_blob(SYMBOL)
}
function encode_val(b, val)
{
encoders[typeof val](b, val)
}
function encode(val)
{
var b = new blob(8*256)// guess a good length
encode_val(b,val)
return stone(b)
}
return { INT,FP,ARRAY,RECORD,BLOB,TEXT,SYMBOL, encode }