From 3d1c4216ede8c628558c9fe700fb2be1aa08b473 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 2 Nov 2020 21:24:53 -0800 Subject: 7162 --- html/apps/tile/grapheme-stack.mu.html | 354 +++++++++++++++++----------------- 1 file changed, 172 insertions(+), 182 deletions(-) (limited to 'html/apps/tile/grapheme-stack.mu.html') diff --git a/html/apps/tile/grapheme-stack.mu.html b/html/apps/tile/grapheme-stack.mu.html index 38285b25..6beded15 100644 --- a/html/apps/tile/grapheme-stack.mu.html +++ b/html/apps/tile/grapheme-stack.mu.html @@ -75,188 +75,178 @@ if ('onhashchange' in window) { 17 copy-to *top, 0 18 } 19 - 20 fn grapheme-stack-empty? _self: (addr grapheme-stack) -> result/eax: boolean { - 21 $grapheme-stack-empty?:body: { - 22 var self/esi: (addr grapheme-stack) <- copy _self - 23 var top/eax: (addr int) <- get self, top - 24 compare *top, 0 - 25 { - 26 break-if-!= - 27 result <- copy 1 # true - 28 break $grapheme-stack-empty?:body - 29 } - 30 result <- copy 0 # false - 31 } - 32 } - 33 - 34 fn push-grapheme-stack _self: (addr grapheme-stack), _val: grapheme { - 35 var self/esi: (addr grapheme-stack) <- copy _self - 36 var top-addr/ecx: (addr int) <- get self, top - 37 var data-ah/edx: (addr handle array grapheme) <- get self, data - 38 var data/eax: (addr array grapheme) <- lookup *data-ah - 39 var top/edx: int <- copy *top-addr - 40 var dest-addr/edx: (addr grapheme) <- index data, top - 41 var val/eax: grapheme <- copy _val - 42 copy-to *dest-addr, val - 43 add-to *top-addr, 1 - 44 } - 45 - 46 fn pop-grapheme-stack _self: (addr grapheme-stack) -> val/eax: grapheme { - 47 $pop-grapheme-stack:body: { - 48 var self/esi: (addr grapheme-stack) <- copy _self - 49 var top-addr/ecx: (addr int) <- get self, top - 50 { - 51 compare *top-addr, 0 - 52 break-if-> - 53 val <- copy -1 - 54 break $pop-grapheme-stack:body - 55 } - 56 subtract-from *top-addr, 1 - 57 var data-ah/edx: (addr handle array grapheme) <- get self, data - 58 var data/eax: (addr array grapheme) <- lookup *data-ah - 59 var top/edx: int <- copy *top-addr - 60 var result-addr/eax: (addr grapheme) <- index data, top - 61 val <- copy *result-addr - 62 } - 63 } - 64 - 65 fn copy-grapheme-stack _src: (addr grapheme-stack), dest: (addr grapheme-stack) { - 66 var src/esi: (addr grapheme-stack) <- copy _src - 67 var data-ah/edi: (addr handle array grapheme) <- get src, data - 68 var _data/eax: (addr array grapheme) <- lookup *data-ah - 69 var data/edi: (addr array grapheme) <- copy _data - 70 var top-addr/ecx: (addr int) <- get src, top - 71 var i/eax: int <- copy 0 - 72 { - 73 compare i, *top-addr - 74 break-if->= - 75 var g/edx: (addr grapheme) <- index data, i - 76 push-grapheme-stack dest, *g - 77 i <- increment - 78 loop - 79 } - 80 } - 81 - 82 # dump stack to screen from bottom to top - 83 # don't move the cursor or anything - 84 fn render-stack-from-bottom _self: (addr grapheme-stack), screen: (addr screen) { - 85 var self/esi: (addr grapheme-stack) <- copy _self - 86 var data-ah/edi: (addr handle array grapheme) <- get self, data - 87 var _data/eax: (addr array grapheme) <- lookup *data-ah - 88 var data/edi: (addr array grapheme) <- copy _data - 89 var top-addr/ecx: (addr int) <- get self, top - 90 var i/eax: int <- copy 0 - 91 { - 92 compare i, *top-addr - 93 break-if->= - 94 var g/edx: (addr grapheme) <- index data, i - 95 print-grapheme screen, *g - 96 i <- increment - 97 loop - 98 } - 99 } -100 -101 # dump stack to screen from top to bottom -102 # don't move the cursor or anything -103 fn render-stack-from-top _self: (addr grapheme-stack), screen: (addr screen) { -104 var self/esi: (addr grapheme-stack) <- copy _self -105 var data-ah/edi: (addr handle array grapheme) <- get self, data -106 var _data/eax: (addr array grapheme) <- lookup *data-ah -107 var data/edi: (addr array grapheme) <- copy _data -108 var top-addr/ecx: (addr int) <- get self, top -109 var i/eax: int <- copy *top-addr -110 i <- decrement -111 { -112 compare i, 0 -113 break-if-< -114 var g/edx: (addr grapheme) <- index data, i -115 print-grapheme screen, *g -116 i <- decrement -117 loop -118 } -119 } -120 -121 # compare from bottom -122 # beware: modifies 'stream', which must be disposed of after a false result -123 fn prefix-match? _self: (addr grapheme-stack), s: (addr stream byte) -> result/eax: boolean { -124 $prefix-match?:body: { -125 var self/esi: (addr grapheme-stack) <- copy _self -126 var data-ah/edi: (addr handle array grapheme) <- get self, data -127 var _data/eax: (addr array grapheme) <- lookup *data-ah -128 var data/edi: (addr array grapheme) <- copy _data -129 var top-addr/ecx: (addr int) <- get self, top -130 var i/ebx: int <- copy 0 -131 { -132 compare i, *top-addr -133 break-if->= -134 # if curr != expected, return false -135 { -136 var curr-a/edx: (addr grapheme) <- index data, i -137 var expected/eax: grapheme <- read-grapheme s -138 { -139 compare expected, *curr-a -140 break-if-= -141 result <- copy 0 # false -142 break $prefix-match?:body -143 } -144 } -145 i <- increment -146 loop -147 } -148 result <- copy 1 # true -149 } -150 } -151 -152 # compare from bottom -153 # beware: modifies 'stream', which must be disposed of after a false result -154 fn suffix-match? _self: (addr grapheme-stack), s: (addr stream byte) -> result/eax: boolean { -155 $suffix-match?:body: { -156 var self/esi: (addr grapheme-stack) <- copy _self -157 var data-ah/edi: (addr handle array grapheme) <- get self, data -158 var _data/eax: (addr array grapheme) <- lookup *data-ah -159 var data/edi: (addr array grapheme) <- copy _data -160 var top-addr/eax: (addr int) <- get self, top -161 var i/ebx: int <- copy *top-addr -162 i <- decrement -163 { -164 compare i, 0 -165 break-if-< -166 { -167 var curr-a/edx: (addr grapheme) <- index data, i -168 var expected/eax: grapheme <- read-grapheme s -169 # if curr != expected, return false -170 { -171 compare expected, *curr-a -172 break-if-= -173 result <- copy 0 # false -174 break $suffix-match?:body -175 } -176 } -177 i <- decrement -178 loop -179 } -180 result <- copy 1 # true -181 } -182 } -183 -184 fn grapheme-stack-is-decimal-integer? _self: (addr grapheme-stack) -> result/eax: boolean { -185 var self/esi: (addr grapheme-stack) <- copy _self -186 var data-ah/eax: (addr handle array grapheme) <- get self, data -187 var _data/eax: (addr array grapheme) <- lookup *data-ah -188 var data/edx: (addr array grapheme) <- copy _data -189 var top-addr/ecx: (addr int) <- get self, top -190 var i/ebx: int <- copy 0 -191 $grapheme-stack-is-integer?:loop: { -192 compare i, *top-addr -193 break-if->= -194 var g/edx: (addr grapheme) <- index data, i -195 result <- is-decimal-digit? *g -196 compare result, 0 # false -197 break-if-= -198 i <- increment -199 loop -200 } -201 } + 20 fn grapheme-stack-empty? _self: (addr grapheme-stack) -> _/eax: boolean { + 21 var self/esi: (addr grapheme-stack) <- copy _self + 22 var top/eax: (addr int) <- get self, top + 23 compare *top, 0 + 24 { + 25 break-if-!= + 26 return 1 # true + 27 } + 28 return 0 # false + 29 } + 30 + 31 fn push-grapheme-stack _self: (addr grapheme-stack), _val: grapheme { + 32 var self/esi: (addr grapheme-stack) <- copy _self + 33 var top-addr/ecx: (addr int) <- get self, top + 34 var data-ah/edx: (addr handle array grapheme) <- get self, data + 35 var data/eax: (addr array grapheme) <- lookup *data-ah + 36 var top/edx: int <- copy *top-addr + 37 var dest-addr/edx: (addr grapheme) <- index data, top + 38 var val/eax: grapheme <- copy _val + 39 copy-to *dest-addr, val + 40 add-to *top-addr, 1 + 41 } + 42 + 43 fn pop-grapheme-stack _self: (addr grapheme-stack) -> _/eax: grapheme { + 44 var self/esi: (addr grapheme-stack) <- copy _self + 45 var top-addr/ecx: (addr int) <- get self, top + 46 { + 47 compare *top-addr, 0 + 48 break-if-> + 49 return -1 + 50 } + 51 subtract-from *top-addr, 1 + 52 var data-ah/edx: (addr handle array grapheme) <- get self, data + 53 var data/eax: (addr array grapheme) <- lookup *data-ah + 54 var top/edx: int <- copy *top-addr + 55 var result-addr/eax: (addr grapheme) <- index data, top + 56 return *result-addr + 57 } + 58 + 59 fn copy-grapheme-stack _src: (addr grapheme-stack), dest: (addr grapheme-stack) { + 60 var src/esi: (addr grapheme-stack) <- copy _src + 61 var data-ah/edi: (addr handle array grapheme) <- get src, data + 62 var _data/eax: (addr array grapheme) <- lookup *data-ah + 63 var data/edi: (addr array grapheme) <- copy _data + 64 var top-addr/ecx: (addr int) <- get src, top + 65 var i/eax: int <- copy 0 + 66 { + 67 compare i, *top-addr + 68 break-if->= + 69 var g/edx: (addr grapheme) <- index data, i + 70 push-grapheme-stack dest, *g + 71 i <- increment + 72 loop + 73 } + 74 } + 75 + 76 # dump stack to screen from bottom to top + 77 # don't move the cursor or anything + 78 fn render-stack-from-bottom _self: (addr grapheme-stack), screen: (addr screen) { + 79 var self/esi: (addr grapheme-stack) <- copy _self + 80 var data-ah/edi: (addr handle array grapheme) <- get self, data + 81 var _data/eax: (addr array grapheme) <- lookup *data-ah + 82 var data/edi: (addr array grapheme) <- copy _data + 83 var top-addr/ecx: (addr int) <- get self, top + 84 var i/eax: int <- copy 0 + 85 { + 86 compare i, *top-addr + 87 break-if->= + 88 var g/edx: (addr grapheme) <- index data, i + 89 print-grapheme screen, *g + 90 i <- increment + 91 loop + 92 } + 93 } + 94 + 95 # dump stack to screen from top to bottom + 96 # don't move the cursor or anything + 97 fn render-stack-from-top _self: (addr grapheme-stack), screen: (addr screen) { + 98 var self/esi: (addr grapheme-stack) <- copy _self + 99 var data-ah/edi: (addr handle array grapheme) <- get self, data +100 var _data/eax: (addr array grapheme) <- lookup *data-ah +101 var data/edi: (addr array grapheme) <- copy _data +102 var top-addr/ecx: (addr int) <- get self, top +103 var i/eax: int <- copy *top-addr +104 i <- decrement +105 { +106 compare i, 0 +107 break-if-< +108 var g/edx: (addr grapheme) <- index data, i +109 print-grapheme screen, *g +110 i <- decrement +111 loop +112 } +113 } +114 +115 # compare from bottom +116 # beware: modifies 'stream', which must be disposed of after a false result +117 fn prefix-match? _self: (addr grapheme-stack), s: (addr stream byte) -> _/eax: boolean { +118 var self/esi: (addr grapheme-stack) <- copy _self +119 var data-ah/edi: (addr handle array grapheme) <- get self, data +120 var _data/eax: (addr array grapheme) <- lookup *data-ah +121 var data/edi: (addr array grapheme) <- copy _data +122 var top-addr/ecx: (addr int) <- get self, top +123 var i/ebx: int <- copy 0 +124 { +125 compare i, *top-addr +126 break-if->= +127 # if curr != expected, return false +128 { +129 var curr-a/edx: (addr grapheme) <- index data, i +130 var expected/eax: grapheme <- read-grapheme s +131 { +132 compare expected, *curr-a +133 break-if-= +134 return 0 # false +135 } +136 } +137 i <- increment +138 loop +139 } +140 return 1 # true +141 } +142 +143 # compare from bottom +144 # beware: modifies 'stream', which must be disposed of after a false result +145 fn suffix-match? _self: (addr grapheme-stack), s: (addr stream byte) -> _/eax: boolean { +146 var self/esi: (addr grapheme-stack) <- copy _self +147 var data-ah/edi: (addr handle array grapheme) <- get self, data +148 var _data/eax: (addr array grapheme) <- lookup *data-ah +149 var data/edi: (addr array grapheme) <- copy _data +150 var top-addr/eax: (addr int) <- get self, top +151 var i/ebx: int <- copy *top-addr +152 i <- decrement +153 { +154 compare i, 0 +155 break-if-< +156 { +157 var curr-a/edx: (addr grapheme) <- index data, i +158 var expected/eax: grapheme <- read-grapheme s +159 # if curr != expected, return false +160 { +161 compare expected, *curr-a +162 break-if-= +163 return 0 # false +164 } +165 } +166 i <- decrement +167 loop +168 } +169 return 1 # true +170 } +171 +172 fn grapheme-stack-is-decimal-integer? _self: (addr grapheme-stack) -> _/eax: boolean { +173 var self/esi: (addr grapheme-stack) <- copy _self +174 var data-ah/eax: (addr handle array grapheme) <- get self, data +175 var _data/eax: (addr array grapheme) <- lookup *data-ah +176 var data/edx: (addr array grapheme) <- copy _data +177 var top-addr/ecx: (addr int) <- get self, top +178 var i/ebx: int <- copy 0 +179 var result/eax: boolean <- copy 1 # true +180 $grapheme-stack-is-integer?:loop: { +181 compare i, *top-addr +182 break-if->= +183 var g/edx: (addr grapheme) <- index data, i +184 result <- is-decimal-digit? *g +185 compare result, 0 # false +186 break-if-= +187 i <- increment +188 loop +189 } +190 return result +191 } -- cgit 1.4.1-2-gfad0