diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d4ea656
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+# kdevelop
+.kde*
+*.kdev4
+# other
+*.zip
+*.wasm
+*.lst
+*.map
+*.o
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b1be6d9
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,33 @@
+CC = clang
+CX = clang++
+CODE ?= wasm
+
+MOBJS = calc.yy.o calc.tab.o calculator.o
+
+ifeq ($(CODE),wasm)
+include wasm.mk
+else
+include unix.mk
+endif
+
+OBJS = $(MOBJS) $(MAIN)
+CFLAGS += -Wno-unused-function
+
+all: $(PR)
+%.o: %.cpp
+ $(CX) -std=c++14 -c $(CFLAGS) -fno-exceptions -fno-rtti $< -o $@
+%.o: %.c
+ $(CC) -c $(CFLAGS) $< -o $@
+calc.tab.o: calc.tab.c
+ $(CX) -std=c++14 -c $(CFLAGS) -Wno-deprecated -Wno-writable-strings -fno-exceptions -fno-rtti $< -o $@
+$(PR): $(OBJS) $(WALIB)
+ $(LD) $(LFLAGS) $(OBJS) -o $(PR) $(LDLIBS)
+calc.yy.cpp: calc.l calc.tab.h
+ flex calc.l
+calc.tab.c calc.tab.h: calc.y
+ bison -d calc.y
+clean:
+ rm -f *.o *.yy.* *.tab.*
+distclean: clean
+ rm -f $(PR)
+.PHONY: all clean distclean
diff --git a/bin/index.html b/bin/index.html
new file mode 100644
index 0000000..237e5bd
--- /dev/null
+++ b/bin/index.html
@@ -0,0 +1,46 @@
+
+
+
+
+
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/bin/index.js b/bin/index.js
new file mode 100644
index 0000000..ead361f
--- /dev/null
+++ b/bin/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