commit 378cb9885961f412e71fce37e94dda86a45ebe6e Author: Kizarm Date: Sun Nov 26 16:41:25 2023 +0100 test html diff --git a/index.html b/index.html new file mode 100644 index 0000000..237e5bd --- /dev/null +++ b/index.html @@ -0,0 +1,46 @@ + + + + + CALC + + + + +
+
+
+ + + +
+
+
+

Kalkulátor s grafickým výstupem.

+

Když jsem přepisoval z nudy syntax highlighter pro C++ z pythonu do C++, zjistil jsem, že regulární výrazy + jsou kupodivu v tom pythonu efektivnější. V tomto ohledu je STL knihovna asi dost naprd. Ale vzpomněl jsem si + na prastarý pár flex a bison, který umí nejen regulární výrazy, ale jde s tím parsovat dost jednoduše gramatika. + Mělo by to jít i v C++, ale příklady na webu byly dost zamotané a bylo nutné použít STL, kterou jsem pro tento + účel neměl k dispozici. Vyřešilo se to jednoduše - vygenerovaný C-čkový kód se přeloží jako C++, přičemž je + nutné povypínat něktetré warningy. +

+

Je to tedy jednoduchý kalkulátor, jde napsat výraz s normální notací (+-*/^), obsahující čísla (i desetinná), + který to normálně vyhodnotí. Postupně přibyly proměnné (jen písmenkové řetězce), které mohou mít i rozsah ve + kterém se pak výraz zobrazí jako funkce. Komentáře jsou ve složených závorkách. Vložené matematické funkce + jsou sin(), cos(), exp(), log() (přirozené).Na konci výrazu musí být ENTER. +

+

Jsou v tom chyby, celé je to vlasně hloupost, celé by to šlo napsat v javascriptu mnohem jednodušeji, + ale v podstatě to funguje a jde si podle toho udělat představu, jak daná funkce vypadá. Zdrojáky v licenci + MIT přikládám. Pro kompilaci je použit jen clang a jím kompilovaná C-čková knihovna + newlib. +

+
+ + diff --git a/index.js b/index.js new file mode 100644 index 0000000..ead361f --- /dev/null +++ b/index.js @@ -0,0 +1,126 @@ +var gWASM; // globální proměnná + elementy stránky +const Outs = document.getElementById('stdout'); +const Btnt = document.getElementById('buttonTest'); +const Canvas = document.getElementById('canvas'); +// async/await z příkladu na webu +window.onload = async function() { + Btnt.disabled = true; + Outs.value = 'Compiling ...¨\n'; // presets + // Build WebAssembly instance - WebAssembly.instantiateStreaming problem + const memory = new WebAssembly.Memory({ initial: 4 }); + const importObject = { + env: { memory }, // nutné pro práci a pamětí + imports: { // importované funkce do wasm + printout : (ptr, len) => { + // pohled do paměti - ptr je vlastně číslo + const view = new Uint8Array (memory.buffer, ptr, len); + const utf8decoder = new TextDecoder(); + Outs.value += utf8decoder.decode(view); // to String + }, + memoryGrow : (len) => { + console.log ('Growing the memory by ' + len.toString() + '. 64K blocks'); + memory.grow (len); // patrně to jde volat přímo z C/C++ kódu, ale tohle funguje + }, + drawPoints : (px, py, len, pj, jl) => { + const xview = new Float32Array (memory.buffer, px, len); + const yview = new Float32Array (memory.buffer, py, len); + const view = new Uint8Array (memory.buffer, pj, jl); + const utf8decoder = new TextDecoder(); + const obj = JSON.parse (utf8decoder.decode(view)); + // console.log (obj); + if (!obj) obj = '{"name":"nothing"}'; + polyLine (xview, yview, len, obj); + }, + }, + }; + const response = await fetch('./module.wasm'); + const bytes = await response.arrayBuffer(); + const module = await WebAssembly.instantiate(bytes, importObject); + gWASM = { + asm : module.instance.exports, + mem : memory, + }; + gWASM.asm.init(memory.buffer.byteLength); + Btnt.onclick = () => { + Outs.value = ''; + const expression = document.getElementById('input').value; + // console.log(expression); + stringToModule (expression, gWASM.asm.compute); + }; + Outs.value = 'Module compiled - [insert formula and] press button Submit\n'; + Btnt.disabled = false; + // console.log (gWASM); + window.addEventListener('resize', resizeCanvas, false); + resizeCanvas(); + getFile ('test.txt'); + Splash (); +}; +function stringToModule (str, mfunc) { + const utf8EncodeText = new TextEncoder(); + const bytes = utf8EncodeText.encode(str); + // alokovat pamet v modulu je nutne, aby bylo kam kopirovat + const cArrayPointer = gWASM.asm.cAlloc(bytes.length); + if (!cArrayPointer) return; + const cArray = new Uint8Array(gWASM.mem.buffer, cArrayPointer, bytes.length); + cArray.set(bytes); // naplnit dekodovanym stringem + mfunc (cArrayPointer, cArray.length); +} +function resizeCanvas () { + const width = canvas.clientWidth; + const height = canvas.clientHeight; + canvas.width = width; + canvas.height = height; + // console.log (width, height); + gWASM.asm.resizeCanvas (width, height); +} +function drawLine (ctx, line, x, y) { + ctx.beginPath(); + ctx.moveTo(line.b[0], line.b[1]); + ctx.lineTo(line.e[0], line.e[1]); + ctx.lineWidth = line.w; + ctx.strokeStyle = line.color; + if (line.lbl) { + //console.log (line.lbl); + ctx.fillStyle = line.color; + ctx.fillText (line.lbl, line.b[0] + x, line.b[1] - y); + } + ctx.stroke(); +} +function polyLine (ax, ay, len, obj) { + // console.log (ax, ay); + const ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.font = '16px serif'; + ctx.textAlign = 'left'; + if (obj.name === "axes") { + drawLine (ctx, obj.x, 0, 0); + drawLine (ctx, obj.y, 0, 0); + const ndotsx = obj.xdots.length; + for (let n=0; n