A WebAssembly forked version of bmfdec that works on the browser and/or Node. Built using Emscripten.
- Download and install Emscripten.
- Build
bmf2mof.js
using
emcc bmfdec/bmf2mof.c -s "EXPORTED_FUNCTIONS=['_parse_data']" -s "MODULARIZE=1" -s "EXPORT_NAME='bmf2mof'" -s "WASM=1" -O2 -o bmf2mof.js`.
Here we replaced the main()
function in bmfdec/bmfdec.c
with parse_data(uint32_t *pin, ssize_t lin)
and then exported that function so we can use it within JavaScript/WebAssembly.
Using Node:
const bmf2mof = require('./bmf2mof.js')
const wqba = [
// Name (WQBA, Buffer (0x03EE)
// {
/* 0000 */ 0x46, 0x4F, 0x4D, 0x42, 0x01, 0x00, 0x00, 0x00, // FOMB....
/* 0008 */ 0xDE, 0x03, 0x00, 0x00, 0x38, 0x0C, 0x00, 0x00, // ....8...
/* 0010 */ 0x44, 0x53, 0x00, 0x01, 0x1A, 0x7D, 0xDA, 0x54, // DS...}.T
/* 0018 */ 0x18, 0xD3, 0x85, 0x00, 0x01, 0x06, 0x18, 0x42, // .......B
/* 0020 */ 0x10, 0x05, 0x10, 0x92, 0xE5, 0x81, 0x42, 0x04, // ......B.
/* 0028 */ 0x8A, 0x40, 0x24, 0x69, 0x0E, 0x60, 0x30, 0x1A, // .@$i.\`0.
/* 0030 */ 0x40, 0x24, 0x09, 0x42, 0xBC, 0x22, 0x20, 0x42, // @$.B." B
/* 0038 */ 0x20, 0x24, 0x51, 0x80, 0x79, 0x01, 0xBA, 0x05, // $Q.y...
/* 0040 */ 0x18, 0x16, 0x60, 0x5B, 0x80, 0x69, 0x01, 0x8E, // ..\`[.i..
/* 0048 */ 0x81, 0xD4, 0xBF, 0x3F, 0xB4, 0x40, 0x24, 0x02, // ...?.@$.
/* 0050 */ 0x92, 0x4A, 0x81, 0x90, 0x50, 0x01, 0xCA, 0x05, // .J..P...
/* 0058 */ 0xF8, 0x16, 0xA0, 0x1D, 0x51, 0x92, 0x05, 0x58, // ....Q..X
/* 0060 */ 0x86, 0x11, 0x81, 0xBD, 0x0A, 0xB0, 0x29, 0xC0, // ......).
/* 0068 */ 0x24, 0x1A, 0x82, 0xA0, 0x9C, 0x61, 0xA0, 0xE0, // $....a..
/* 0070 */ 0x0D, 0xC8, 0x06, 0xC1, 0x44, 0x0F, 0x02, 0x25, // ....D..%
/* 0078 */ 0x66, 0x34, 0x64, 0x06, 0x9D, 0xCF, 0x45, 0xF0, // f4d...E.
/* 0080 */ 0x27, 0x51, 0xB8, 0x00, 0xE9, 0x18, 0x1A, 0xC1, // 'Q......
/* 0088 */ 0x11, 0x25, 0xE8, 0x70, 0x48, 0x92, 0x8D, 0x20, // .%.pH..
/* 0090 */ 0x41, 0x02, 0x14, 0xC2, 0xCB, 0xA7, 0x00, 0xA7, // A.......
/* 0098 */ 0x28, 0xD2, 0x28, 0xC0, 0x3A, 0x9C, 0x60, 0x63, // (.(.:.\`c
/* 00A0 */ 0x72, 0xA4, 0x28, 0x07, 0x71, 0x36, 0x06, 0xEB, // r.(.q6..
/* 00A8 */ 0x19, 0x45, 0x40, 0xA7, 0xC2, 0x09, 0xA2, 0x1F, // .E@.....
/* 00B0 */ 0x0A, 0x46, 0x06, 0x84, 0x3C, 0x0A, 0xB0, 0x8A, // .F..<...
/* 00B8 */ 0xA6, 0xB9, 0x24, 0xB0, 0x7B, 0x01, 0x06, 0x67, // ..$.{..g
/* 00C0 */ 0x21, 0x84, 0x23, 0x29, 0x4C, 0x80, 0x66, 0x01, // !.#)L.f.
/* 00C8 */ 0xD6, 0x04, 0x28, 0x16, 0x60, 0x4B, 0x80, 0xB8, // ..(.\`K..
/* 00D0 */ 0x21, 0x69, 0x32, 0x8D, 0xA1, 0x08, 0x22, 0xC2, // !i2...".
/* 00D8 */ 0x71, 0x46, 0x31, 0x66, 0xC0, 0x08, 0x46, 0x39, // qF1f..F9
/* 00E0 */ 0x9A, 0xE6, 0x40, 0xA4, 0x4D, 0x80, 0x32, 0x10, // ..@.M.2.
/* 00E8 */ 0xA1, 0xC5, 0x62, 0x08, 0xB6, 0x3F, 0x08, 0x32, // ..b..?.2
/* 00F0 */ 0x72, 0xDC, 0x11, 0xC0, 0xE3, 0x39, 0xA9, 0xC8, // r....9..
/* 00F8 */ 0x07, 0xE8, 0x51, 0x24, 0xF0, 0xA8, 0xCE, 0xAF, // ..Q$....
/* 0100 */ 0x5C, 0x5C, 0x89, 0x47, 0x15, 0xC6, 0x09, 0x24, // \\.G...$
/* 0108 */ 0x70, 0xB0, 0x13, 0x81, 0x24, 0x80, 0x28, 0x12, // p...$.(.
/* 0110 */ 0x3C, 0x6A, 0xE0, 0x09, 0x8E, 0xDF, 0x43, 0x3B, // <j....C;
/* 0118 */ 0xCE, 0xA3, 0x3E, 0xCE, 0x13, 0x38, 0x57, 0x8F, // ..>..8W.
/* 0120 */ 0xA0, 0xCE, 0x53, 0x01, 0x19, 0x03, 0xC3, 0x4A, // ..S....J
/* 0128 */ 0xF0, 0x87, 0xE0, 0x93, 0x00, 0xDE, 0x35, 0xA0, // ......5.
/* 0130 */ 0xFE, 0xFF, 0xF7, 0x83, 0x27, 0x01, 0x36, 0xE4, // ....'.6.
/* 0138 */ 0x70, 0x98, 0xF1, 0x7A, 0xE2, 0xC7, 0xE9, 0x51, // p..z...Q
/* 0140 */ 0x1E, 0x09, 0x83, 0x38, 0xA2, 0x83, 0xC3, 0x0E, // ...8....
/* 0148 */ 0xF9, 0x64, 0x8E, 0xAC, 0x54, 0x01, 0x66, 0x4F, // .d..T.fO
/* 0150 */ 0x08, 0xB2, 0x08, 0xA4, 0xF1, 0xF8, 0x50, 0xE0, // ......P.
/* 0158 */ 0xF9, 0xBC, 0x05, 0x24, 0xB0, 0xFC, 0x41, 0xA0, // ...$..A.
/* 0160 */ 0x46, 0x66, 0x68, 0x8F, 0xFB, 0x91, 0x80, 0x1D, // Ffh.....
/* 0168 */ 0x16, 0x0E, 0x8B, 0x89, 0x3D, 0x4C, 0xD0, 0xF1, // ....=L..
/* 0170 */ 0x80, 0xFF, 0x56, 0x70, 0xFC, 0x11, 0x4E, 0xDF, // ..Vp..N.
/* 0178 */ 0xF3, 0x35, 0x41, 0x81, 0xC0, 0xE8, 0x01, 0xD9, // .5A.....
/* 0180 */ 0xAF, 0x00, 0x84, 0xE0, 0x65, 0x8E, 0x48, 0xC7, // ....e.H.
/* 0188 */ 0x80, 0x08, 0x09, 0xDE, 0x1B, 0xE2, 0x1E, 0xF8, // ........
/* 0190 */ 0xF3, 0x02, 0x83, 0x08, 0xF3, 0xD6, 0xE0, 0x11, // ........
/* 0198 */ 0x1C, 0x0D, 0x13, 0x79, 0x98, 0x40, 0x0F, 0x80, // ...y.@..
/* 01A0 */ 0x9F, 0x02, 0xE2, 0x87, 0x3D, 0x99, 0x03, 0x38, // ....=..8
/* 01A8 */ 0x9C, 0x28, 0xE7, 0x70, 0x3C, 0xBE, 0x42, 0x18, // .(.p<.B.
/* 01B0 */ 0x21, 0xFE, 0xB3, 0xC1, 0x73, 0x86, 0xAF, 0x0D, // !...s...
/* 01B8 */ 0x27, 0xF4, 0x18, 0x71, 0x4A, 0x2F, 0x03, 0x26, // '..qJ/.&
/* 01C0 */ 0x18, 0xF9, 0x35, 0xA0, 0x53, 0x88, 0xE3, 0x82, // ..5.S...
/* 01C8 */ 0xC8, 0xC6, 0x4A, 0x7D, 0xE8, 0xA0, 0x71, 0x57, // ..J}..qW
/* 01D0 */ 0xAB, 0x01, 0xE1, 0xB0, 0x9F, 0x2C, 0x4C, 0x30, // .....,L0
/* 01D8 */ 0x24, 0x98, 0x4E, 0x24, 0x3C, 0x1E, 0x85, 0x44, // $.N$<..D
/* 01E0 */ 0xD0, 0x68, 0x3C, 0x06, 0x77, 0xEC, 0x83, 0x09, // .h<.w...
/* 01E8 */ 0x05, 0x31, 0xA0, 0x33, 0x41, 0xC8, 0xC8, 0x28, // .1.3A..(
/* 01F0 */ 0xE8, 0x41, 0x80, 0xCF, 0xE0, 0xA5, 0xE2, 0x91, // .A......
/* 01F8 */ 0xC1, 0xA7, 0x8E, 0x28, 0x27, 0xE4, 0x04, 0x10, // ...('...
/* 0200 */ 0x3A, 0x3C, 0x78, 0x84, 0x3E, 0x08, 0xF0, 0x13, // :<x.>...
/* 0208 */ 0x8A, 0x6F, 0x06, 0xC6, 0xF6, 0xA1, 0xC1, 0xFF, // .o......
/* 0210 */ 0xFF, 0x7F, 0x0A, 0x1D, 0x2C, 0x19, 0xD3, 0x59, // ....,..Y
/* 0218 */ 0x3E, 0x15, 0xF8, 0x00, 0x60, 0x35, 0x70, 0x28, // >...\`5p(
/* 0220 */ 0x68, 0x1F, 0x39, 0xF8, 0xBD, 0x45, 0x77, 0x02, // h.9..Ew.
/* 0228 */ 0xE8, 0xE3, 0x39, 0x10, 0x0F, 0xE8, 0x98, 0x12, // ..9.....
/* 0230 */ 0xD4, 0x77, 0x25, 0x00, 0x05, 0x90, 0x0F, 0x01, // .w%.....
/* 0238 */ 0x56, 0x7A, 0x0F, 0xA0, 0x53, 0x08, 0x11, 0x26, // Vz..S..&
/* 0240 */ 0x9A, 0xD1, 0xF9, 0x71, 0xC3, 0x43, 0xE6, 0x51, // ...q.C.Q
/* 0248 */ 0x60, 0x34, 0x64, 0x83, 0x78, 0x60, 0x8E, 0x03, // `4d.x`..
/* 0250 */ 0x21, 0x27, 0x47, 0x09, 0xD4, 0x58, 0x3D, 0xA1, // !'G..X=.
/* 0258 */ 0xCE, 0x6E, 0x23, 0x1A, 0xC1, 0x9B, 0x8B, 0x0F, // .n#.....
/* 0260 */ 0x06, 0xEF, 0x12, 0x3E, 0x26, 0xB0, 0x61, 0x3F, // ...>&.a?
/* 0268 */ 0x72, 0xC0, 0x3A, 0xB3, 0x78, 0xF0, 0x9E, 0x88, // r.:.x...
/* 0270 */ 0x47, 0x8D, 0x1F, 0x2E, 0x1F, 0x8D, 0x8F, 0x14, // G.......
/* 0278 */ 0xF0, 0xA7, 0xCB, 0xE7, 0xE3, 0xE1, 0x91, 0x93, // ........
/* 0280 */ 0x01, 0xFA, 0xBC, 0xE0, 0x93, 0x81, 0xCF, 0x0B, // ........
/* 0288 */ 0x07, 0xE3, 0x9B, 0x01, 0x27, 0x18, 0xE2, 0x68, // ....'..h
/* 0290 */ 0x40, 0x87, 0x05, 0xAE, 0xB3, 0x01, 0x5F, 0x96, // @....._.
/* 0298 */ 0x47, 0x07, 0xEF, 0x8C, 0x44, 0x46, 0x07, 0xFD, // G...DF..
/* 02A0 */ 0xFF, 0x7F, 0x37, 0xC0, 0x1D, 0x3F, 0xC0, 0x71, // ..7..?.q
/* 02A8 */ 0x37, 0x80, 0x09, 0x8F, 0x39, 0x59, 0xD8, 0xC2, // 7...9Y..
/* 02B0 */ 0x78, 0xE8, 0xB0, 0xF8, 0xB1, 0xC0, 0x77, 0x8D, // x.....w.
/* 02B8 */ 0x37, 0x27, 0xDF, 0x45, 0x70, 0x63, 0x7A, 0x2D, // 7'.Epcz-
/* 02C0 */ 0xF0, 0x39, 0xC0, 0xB0, 0x1E, 0x2F, 0x87, 0x35, // .9.../.5
/* 02C8 */ 0x5A, 0xD8, 0x13, 0x7F, 0x4A, 0xF1, 0x0D, 0xC7, // Z...J...
/* 02D0 */ 0x13, 0xF3, 0x0D, 0x81, 0x9D, 0x6D, 0xC0, 0x01, // .....m..
/* 02D8 */ 0x88, 0xF7, 0x7E, 0xAD, 0x21, 0x13, 0x30, 0x20, // ..~.!.0
/* 02E0 */ 0x9B, 0xE3, 0x43, 0x14, 0x58, 0x8E, 0x06, 0xC7, // ..C.X...
/* 02E8 */ 0x79, 0x6E, 0x2F, 0x4E, 0xFC, 0x0C, 0x05, 0x83, // yn/N....
/* 02F0 */ 0xC0, 0x31, 0x9E, 0x07, 0x06, 0xF1, 0x0A, 0x25, // .1.....%
/* 02F8 */ 0x1C, 0x06, 0x75, 0xF6, 0x02, 0xDE, 0x27, 0x0D, // ..u...'.
/* 0300 */ 0x8F, 0x13, 0x1C, 0xD3, 0x7C, 0xEC, 0x30, 0xCA, // ....|.0.
/* 0308 */ 0xFF, 0x3F, 0xD2, 0x61, 0xBE, 0x1C, 0x45, 0xF1, // .?.a..E.
/* 0310 */ 0x5C, 0x3C, 0xAE, 0x47, 0x01, 0x06, 0x75, 0xF4, // \<.G..u.
/* 0318 */ 0x2F, 0x06, 0xB1, 0x8C, 0x72, 0x6E, 0xB1, 0x0E, // /...rn..
/* 0320 */ 0x20, 0xCE, 0xA3, 0x83, 0x91, 0x02, 0x05, 0x39, // ......9
/* 0328 */ 0x88, 0x18, 0x81, 0x7C, 0xAE, 0xF0, 0xE9, 0x0B, // ...|....
/* 0330 */ 0x5C, 0x33, 0x78, 0xFA, 0x02, 0xC6, 0x91, 0x5F, // \3x...._
/* 0338 */ 0x1C, 0x3A, 0x13, 0xF8, 0xF4, 0x05, 0xF0, 0xE2, // .:......
/* 0340 */ 0xFF, 0x7F, 0xFA, 0xE2, 0xD1, 0x8F, 0x40, 0xE8, // ......@.
/* 0348 */ 0x51, 0xF8, 0xB0, 0x11, 0xF1, 0x30, 0x4E, 0xDB, // Q....0N.
/* 0350 */ 0x04, 0xA3, 0x0E, 0x9A, 0x8A, 0x3A, 0xA5, 0xA0, // .....:..
/* 0358 */ 0x0E, 0x17, 0x3E, 0xA5, 0xB0, 0xC3, 0xC2, 0xEB, // ..>.....
/* 0360 */ 0x83, 0x21, 0x1E, 0x52, 0x30, 0x07, 0x00, 0x1F, // .!.R0...
/* 0368 */ 0x29, 0xC0, 0x31, 0x12, 0xCC, 0x69, 0xC2, 0xA7, // ).1..i..
/* 0370 */ 0x08, 0x9F, 0x0A, 0x7D, 0x9F, 0xF0, 0xC9, 0xC3, // ...}....
/* 0378 */ 0x30, 0x46, 0x32, 0x9E, 0x8F, 0x14, 0x78, 0xC8, // 0F2...x.
/* 0380 */ 0x40, 0xAF, 0x14, 0xB8, 0x83, 0x11, 0x18, 0xE5, // @.......
/* 0388 */ 0x1D, 0xDD, 0x40, 0x77, 0xFA, 0xC0, 0x9C, 0xDC, // ..@w....
/* 0390 */ 0x80, 0xC9, 0xD5, 0xC3, 0x43, 0xE0, 0x67, 0x09, // ....C.g.
/* 0398 */ 0x0F, 0x81, 0x0F, 0xE0, 0x11, 0xE4, 0xEC, 0x7C, // .......|
/* 03A0 */ 0x0E, 0x3A, 0x27, 0xDC, 0x59, 0x85, 0x4F, 0x09, // .:'.Y.O.
/* 03A8 */ 0x37, 0x00, 0x8C, 0x42, 0x9B, 0x3E, 0x35, 0x1A, // 7..B.>5.
/* 03B0 */ 0xB5, 0x6A, 0x50, 0xA6, 0x46, 0x99, 0x06, 0xB5, // .jP.F...
/* 03B8 */ 0xFA, 0x54, 0x6A, 0xCC, 0xD8, 0xC1, 0xC1, 0xA2, // .Tj.....
/* 03C0 */ 0xDE, 0x0E, 0x3A, 0x1C, 0x38, 0x12, 0x08, 0x15, // ..:.8...
/* 03C8 */ 0x73, 0xB2, 0x91, 0x11, 0x10, 0x29, 0x03, 0x11, // s....)..
/* 03D0 */ 0x90, 0xFF, 0xFF, 0x42, 0x9E, 0x46, 0x02, 0xB2, // ...B.F..
/* 03D8 */ 0x2C, 0x10, 0x01, 0x39, 0x22, 0x10, 0x0D, 0x0C, // ,..9"...
/* 03E0 */ 0x44, 0xE5, 0x9A, 0x00, 0x61, 0x61, 0x41, 0x68, // D...aaAh
/* 03E8 */ 0x4C, 0x15, 0x20, 0xEC, 0xFF, 0x0F // L. ...
// })
]
const buf = new Uint8Array(wqba)
bmf2mof().then(bmf => {
function arrayToPtr(array) {
var ptr = bmf._malloc(array.length)
bmf.HEAPU8.set(array, ptr)
return ptr
}
bmf._parse_data(arrayToPtr(buf), buf.length)
})