5 <title>Mu -
513grapheme-stack.mu
</title>
6 <meta name=
"Generator" content=
"Vim/8.2">
7 <meta name=
"plugin-version" content=
"vim8.1_v2">
8 <meta name=
"syntax" content=
"none">
9 <meta name=
"settings" content=
"number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback">
10 <meta name=
"colorscheme" content=
"minimal-light">
13 pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffd7; }
14 body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; }
16 * { font-size:12pt; font-size: 1em; }
17 .PreProc { color: #c000c0; }
18 .muRegEdx { color: #af5f00; }
19 .Special { color: #ff6060; }
21 .Constant { color: #008787; }
22 .muRegEbx { color: #5f00ff; }
23 .muRegEsi { color: #005faf; }
24 .muRegEdi { color: #00af00; }
25 .muRegEcx { color: #870000; }
26 .Delimiter { color: #c000c0; }
27 .muFunction { color: #af5f00; text-decoration: underline; }
28 .muTest { color: #5f8700; }
29 .muComment { color: #005faf; }
36 /* function to open any folds containing a jumped-to line before jumping to it */
40 lineNum
= window
.location
.hash
;
41 lineNum
= lineNum
.substr(1); /* strip off '#' */
43 if (lineNum
.indexOf('L') == -1) {
44 lineNum
= 'L'+lineNum
;
46 var lineElem
= document
.getElementById(lineNum
);
47 /* Always jump to new location even if the line was hidden inside a fold, or
48 * we corrected the raw number to a line ID.
51 lineElem
.scrollIntoView(true);
55 if ('onhashchange' in window
) {
56 window
.onhashchange
= JumpToLine
;
62 <body onload='JumpToLine();'
>
63 <a href='https://github.com/akkartik/mu/blob/main/
513grapheme-stack.mu'
>https://github.com/akkartik/mu/blob/main/
513grapheme-stack.mu
</a>
64 <pre id='vimCodeElement'
>
65 <span id=
"L1" class=
"LineNr"> 1 </span><span class=
"muComment"># Grapheme stacks are the smallest unit of editable text.
</span>
66 <span id=
"L2" class=
"LineNr"> 2 </span><span class=
"muComment">#
</span>
67 <span id=
"L3" class=
"LineNr"> 3 </span><span class=
"muComment"># (Currently they just support single-code-point graphemes.)
</span>
68 <span id=
"L4" class=
"LineNr"> 4 </span>
69 <span id=
"L5" class=
"LineNr"> 5 </span><span class=
"PreProc">type
</span> <a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a> <span class=
"Delimiter">{
</span>
70 <span id=
"L6" class=
"LineNr"> 6 </span> data: (handle array code-point-utf8)
71 <span id=
"L7" class=
"LineNr"> 7 </span> top: int
72 <span id=
"L8" class=
"LineNr"> 8 </span><span class=
"Delimiter">}
</span>
73 <span id=
"L9" class=
"LineNr"> 9 </span>
74 <span id=
"L10" class=
"LineNr"> 10 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), n: int
<span class=
"Delimiter">{
</span>
75 <span id=
"L11" class=
"LineNr"> 11 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
76 <span id=
"L12" class=
"LineNr"> 12 </span> <span class=
"PreProc">var
</span> d/
<span class=
"muRegEdi">edi
</span>: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
77 <span id=
"L13" class=
"LineNr"> 13 </span> populate d, n
78 <span id=
"L14" class=
"LineNr"> 14 </span> <span class=
"PreProc">var
</span> top/eax: (addr int)
<span class=
"Special"><-
</span> get self, top
79 <span id=
"L15" class=
"LineNr"> 15 </span> copy-to *top,
<span class=
"Constant">0</span>
80 <span id=
"L16" class=
"LineNr"> 16 </span><span class=
"Delimiter">}
</span>
81 <span id=
"L17" class=
"LineNr"> 17 </span>
82 <span id=
"L18" class=
"LineNr"> 18 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L18'
>clear-grapheme-stack
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Delimiter">{
</span>
83 <span id=
"L19" class=
"LineNr"> 19 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
84 <span id=
"L20" class=
"LineNr"> 20 </span> <span class=
"PreProc">var
</span> top/eax: (addr int)
<span class=
"Special"><-
</span> get self, top
85 <span id=
"L21" class=
"LineNr"> 21 </span> copy-to *top,
<span class=
"Constant">0</span>
86 <span id=
"L22" class=
"LineNr"> 22 </span><span class=
"Delimiter">}
</span>
87 <span id=
"L23" class=
"LineNr"> 23 </span>
88 <span id=
"L24" class=
"LineNr"> 24 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L24'
>grapheme-stack-empty?
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"PreProc"> -
> </span>_/eax: boolean
<span class=
"Delimiter">{
</span>
89 <span id=
"L25" class=
"LineNr"> 25 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
90 <span id=
"L26" class=
"LineNr"> 26 </span> <span class=
"PreProc">var
</span> top/eax: (addr int)
<span class=
"Special"><-
</span> get self, top
91 <span id=
"L27" class=
"LineNr"> 27 </span> compare *top,
<span class=
"Constant">0</span>
92 <span id=
"L28" class=
"LineNr"> 28 </span> <span class=
"Delimiter">{
</span>
93 <span id=
"L29" class=
"LineNr"> 29 </span> <span class=
"PreProc">break-if-!=
</span>
94 <span id=
"L30" class=
"LineNr"> 30 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">1</span>/true
95 <span id=
"L31" class=
"LineNr"> 31 </span> <span class=
"Delimiter">}
</span>
96 <span id=
"L32" class=
"LineNr"> 32 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">0</span>/false
97 <span id=
"L33" class=
"LineNr"> 33 </span><span class=
"Delimiter">}
</span>
98 <span id=
"L34" class=
"LineNr"> 34 </span>
99 <span id=
"L35" class=
"LineNr"> 35 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L35'
>grapheme-stack-length
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"PreProc"> -
> </span>_/eax: int
<span class=
"Delimiter">{
</span>
100 <span id=
"L36" class=
"LineNr"> 36 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
101 <span id=
"L37" class=
"LineNr"> 37 </span> <span class=
"PreProc">var
</span> top/eax: (addr int)
<span class=
"Special"><-
</span> get self, top
102 <span id=
"L38" class=
"LineNr"> 38 </span> <span class=
"PreProc">return
</span> *top
103 <span id=
"L39" class=
"LineNr"> 39 </span><span class=
"Delimiter">}
</span>
104 <span id=
"L40" class=
"LineNr"> 40 </span>
105 <span id=
"L41" class=
"LineNr"> 41 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), _val: code-point-utf8
<span class=
"Delimiter">{
</span>
106 <span id=
"L42" class=
"LineNr"> 42 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
107 <span id=
"L43" class=
"LineNr"> 43 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEcx">ecx
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
108 <span id=
"L44" class=
"LineNr"> 44 </span> <span class=
"PreProc">var
</span> data-ah/
<span class=
"muRegEdx">edx
</span>: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
109 <span id=
"L45" class=
"LineNr"> 45 </span> <span class=
"PreProc">var
</span> data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
110 <span id=
"L46" class=
"LineNr"> 46 </span> <span class=
"PreProc">var
</span> top/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy *top-addr
111 <span id=
"L47" class=
"LineNr"> 47 </span> <span class=
"PreProc">var
</span> dest-addr/
<span class=
"muRegEdx">edx
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, top
112 <span id=
"L48" class=
"LineNr"> 48 </span> <span class=
"PreProc">var
</span> val/eax: code-point-utf8
<span class=
"Special"><-
</span> copy _val
113 <span id=
"L49" class=
"LineNr"> 49 </span> copy-to *dest-addr, val
114 <span id=
"L50" class=
"LineNr"> 50 </span> add-to *top-addr,
<span class=
"Constant">1</span>
115 <span id=
"L51" class=
"LineNr"> 51 </span><span class=
"Delimiter">}
</span>
116 <span id=
"L52" class=
"LineNr"> 52 </span>
117 <span id=
"L53" class=
"LineNr"> 53 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L53'
>pop-grapheme-stack
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"PreProc"> -
> </span>_/eax: code-point-utf8
<span class=
"Delimiter">{
</span>
118 <span id=
"L54" class=
"LineNr"> 54 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
119 <span id=
"L55" class=
"LineNr"> 55 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEcx">ecx
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
120 <span id=
"L56" class=
"LineNr"> 56 </span> <span class=
"Delimiter">{
</span>
121 <span id=
"L57" class=
"LineNr"> 57 </span> compare *top-addr,
<span class=
"Constant">0</span>
122 <span id=
"L58" class=
"LineNr"> 58 </span> <span class=
"PreProc">break-if-
></span>
123 <span id=
"L59" class=
"LineNr"> 59 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">-
1</span>
124 <span id=
"L60" class=
"LineNr"> 60 </span> <span class=
"Delimiter">}
</span>
125 <span id=
"L61" class=
"LineNr"> 61 </span> subtract-from *top-addr,
<span class=
"Constant">1</span>
126 <span id=
"L62" class=
"LineNr"> 62 </span> <span class=
"PreProc">var
</span> data-ah/
<span class=
"muRegEdx">edx
</span>: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
127 <span id=
"L63" class=
"LineNr"> 63 </span> <span class=
"PreProc">var
</span> data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
128 <span id=
"L64" class=
"LineNr"> 64 </span> <span class=
"PreProc">var
</span> top/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy *top-addr
129 <span id=
"L65" class=
"LineNr"> 65 </span> <span class=
"PreProc">var
</span> result-addr/eax: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, top
130 <span id=
"L66" class=
"LineNr"> 66 </span> <span class=
"PreProc">return
</span> *result-addr
131 <span id=
"L67" class=
"LineNr"> 67 </span><span class=
"Delimiter">}
</span>
132 <span id=
"L68" class=
"LineNr"> 68 </span>
133 <span id=
"L69" class=
"LineNr"> 69 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L69'
>copy-grapheme-stack
</a></span> _src: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), dest: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Delimiter">{
</span>
134 <span id=
"L70" class=
"LineNr"> 70 </span> <span class=
"PreProc">var
</span> src/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _src
135 <span id=
"L71" class=
"LineNr"> 71 </span> <span class=
"PreProc">var
</span> data-ah/
<span class=
"muRegEdi">edi
</span>: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get src, data
136 <span id=
"L72" class=
"LineNr"> 72 </span> <span class=
"PreProc">var
</span> _data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
137 <span id=
"L73" class=
"LineNr"> 73 </span> <span class=
"PreProc">var
</span> data/
<span class=
"muRegEdi">edi
</span>: (addr array code-point-utf8)
<span class=
"Special"><-
</span> copy _data
138 <span id=
"L74" class=
"LineNr"> 74 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEcx">ecx
</span>: (addr int)
<span class=
"Special"><-
</span> get src, top
139 <span id=
"L75" class=
"LineNr"> 75 </span> <span class=
"PreProc">var
</span> i/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
140 <span id=
"L76" class=
"LineNr"> 76 </span> <span class=
"Delimiter">{
</span>
141 <span id=
"L77" class=
"LineNr"> 77 </span> compare i, *top-addr
142 <span id=
"L78" class=
"LineNr"> 78 </span> <span class=
"PreProc">break-if-
>=
</span>
143 <span id=
"L79" class=
"LineNr"> 79 </span> <span class=
"PreProc">var
</span> g/
<span class=
"muRegEdx">edx
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
144 <span id=
"L80" class=
"LineNr"> 80 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> dest, *g
145 <span id=
"L81" class=
"LineNr"> 81 </span> i
<span class=
"Special"><-
</span> increment
146 <span id=
"L82" class=
"LineNr"> 82 </span> <span class=
"PreProc">loop
</span>
147 <span id=
"L83" class=
"LineNr"> 83 </span> <span class=
"Delimiter">}
</span>
148 <span id=
"L84" class=
"LineNr"> 84 </span><span class=
"Delimiter">}
</span>
149 <span id=
"L85" class=
"LineNr"> 85 </span>
150 <span id=
"L86" class=
"LineNr"> 86 </span><span class=
"muComment"># dump stack to screen from bottom to top
</span>
151 <span id=
"L87" class=
"LineNr"> 87 </span><span class=
"muComment"># hardcoded colors:
</span>
152 <span id=
"L88" class=
"LineNr"> 88 </span><span class=
"muComment"># matching paren
</span>
153 <span id=
"L89" class=
"LineNr"> 89 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L89'
>render-stack-from-bottom-wrapping-right-then-down
</a></span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>), _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), xmin: int, ymin: int, xmax: int, ymax: int, _x: int, _y: int,
<a href='
514gap-buffer.mu.html#L942'
>highlight-matching-open-paren?
</a>: boolean, open-paren-depth: int, color: int, background-color: int
<span class=
"PreProc"> -
> </span>_/eax: int, _/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Delimiter">{
</span>
154 <span id=
"L90" class=
"LineNr"> 90 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
155 <span id=
"L91" class=
"LineNr"> 91 </span> <span class=
"PreProc">var
</span> matching-open-paren-index/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L451'
>get-matching-open-paren-index
</a> self,
<a href='
514gap-buffer.mu.html#L942'
>highlight-matching-open-paren?
</a>, open-paren-depth
156 <span id=
"L92" class=
"LineNr"> 92 </span> <span class=
"PreProc">var
</span> data-ah/
<span class=
"muRegEdi">edi
</span>: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
157 <span id=
"L93" class=
"LineNr"> 93 </span> <span class=
"PreProc">var
</span> _data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
158 <span id=
"L94" class=
"LineNr"> 94 </span> <span class=
"PreProc">var
</span> data/
<span class=
"muRegEdi">edi
</span>: (addr array code-point-utf8)
<span class=
"Special"><-
</span> copy _data
159 <span id=
"L95" class=
"LineNr"> 95 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> copy _x
160 <span id=
"L96" class=
"LineNr"> 96 </span> <span class=
"PreProc">var
</span> y/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy _y
161 <span id=
"L97" class=
"LineNr"> 97 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEsi">esi
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
162 <span id=
"L98" class=
"LineNr"> 98 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
163 <span id=
"L99" class=
"LineNr"> 99 </span> <span class=
"Delimiter">{
</span>
164 <span id=
"L100" class=
"LineNr">100 </span> compare i, *top-addr
165 <span id=
"L101" class=
"LineNr">101 </span> <span class=
"PreProc">break-if-
>=
</span>
166 <span id=
"L102" class=
"LineNr">102 </span> <span class=
"Delimiter">{
</span>
167 <span id=
"L103" class=
"LineNr">103 </span> <span class=
"PreProc">var
</span> c: code-point
168 <span id=
"L104" class=
"LineNr">104 </span> <span class=
"Delimiter">{
</span>
169 <span id=
"L105" class=
"LineNr">105 </span> <span class=
"PreProc">var
</span> g/eax: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
170 <span id=
"L106" class=
"LineNr">106 </span> <span class=
"PreProc">var
</span> tmp/eax: code-point
<span class=
"Special"><-
</span> <a href='
403unicode.mu.html#L49'
>to-code-point
</a> *g
171 <span id=
"L107" class=
"LineNr">107 </span> copy-to c, tmp
172 <span id=
"L108" class=
"LineNr">108 </span> <span class=
"Delimiter">}
</span>
173 <span id=
"L109" class=
"LineNr">109 </span> <span class=
"PreProc">var
</span> fg: int
174 <span id=
"L110" class=
"LineNr">110 </span> <span class=
"Delimiter">{
</span>
175 <span id=
"L111" class=
"LineNr">111 </span> <span class=
"PreProc">var
</span> tmp/eax: int
<span class=
"Special"><-
</span> copy color
176 <span id=
"L112" class=
"LineNr">112 </span> copy-to fg, tmp
177 <span id=
"L113" class=
"LineNr">113 </span> <span class=
"Delimiter">}
</span>
178 <span id=
"L114" class=
"LineNr">114 </span> <span class=
"Delimiter">{
</span>
179 <span id=
"L115" class=
"LineNr">115 </span> compare i, matching-open-paren-index
180 <span id=
"L116" class=
"LineNr">116 </span> <span class=
"PreProc">break-if-!=
</span>
181 <span id=
"L117" class=
"LineNr">117 </span> copy-to fg,
<span class=
"Constant">0xf</span>/highlight
182 <span id=
"L118" class=
"LineNr">118 </span> <span class=
"Delimiter">}
</span>
183 <span id=
"L119" class=
"LineNr">119 </span> x, y
<span class=
"Special"><-
</span> <a href='
501draw-text.mu.html#L155'
>render-code-point
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, c, xmin, ymin, xmax, ymax, x, y, fg, background-color
<span class=
"muComment"># TODO: handle combining characters
</span>
184 <span id=
"L120" class=
"LineNr">120 </span> <span class=
"Delimiter">}
</span>
185 <span id=
"L121" class=
"LineNr">121 </span> i
<span class=
"Special"><-
</span> increment
186 <span id=
"L122" class=
"LineNr">122 </span> <span class=
"PreProc">loop
</span>
187 <span id=
"L123" class=
"LineNr">123 </span> <span class=
"Delimiter">}
</span>
188 <span id=
"L124" class=
"LineNr">124 </span> <span class=
"PreProc">return
</span> x, y
189 <span id=
"L125" class=
"LineNr">125 </span><span class=
"Delimiter">}
</span>
190 <span id=
"L126" class=
"LineNr">126 </span>
191 <span id=
"L127" class=
"LineNr">127 </span><span class=
"muComment"># helper for small words
</span>
192 <span id=
"L128" class=
"LineNr">128 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L128'
>render-stack-from-bottom
</a></span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>), self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), x: int, y: int,
<a href='
514gap-buffer.mu.html#L942'
>highlight-matching-open-paren?
</a>: boolean, open-paren-depth: int
<span class=
"PreProc"> -
> </span>_/eax: int
<span class=
"Delimiter">{
</span>
193 <span id=
"L129" class=
"LineNr">129 </span> <span class=
"PreProc">var
</span> _width/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
194 <span id=
"L130" class=
"LineNr">130 </span> <span class=
"PreProc">var
</span> _height/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
195 <span id=
"L131" class=
"LineNr">131 </span> _width, _height
<span class=
"Special"><-
</span> <a href='
500fake-screen.mu.html#L75'
>screen-size
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>
196 <span id=
"L132" class=
"LineNr">132 </span> <span class=
"PreProc">var
</span> width/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy _width
197 <span id=
"L133" class=
"LineNr">133 </span> <span class=
"PreProc">var
</span> height/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy _height
198 <span id=
"L134" class=
"LineNr">134 </span> <span class=
"PreProc">var
</span> x2/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
199 <span id=
"L135" class=
"LineNr">135 </span> <span class=
"PreProc">var
</span> y2/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
200 <span id=
"L136" class=
"LineNr">136 </span> x2, y2
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L89'
>render-stack-from-bottom-wrapping-right-then-down
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, self, x, y, width, height, x, y,
<a href='
514gap-buffer.mu.html#L942'
>highlight-matching-open-paren?
</a>, open-paren-depth,
<span class=
"Constant">3</span>/fg=cyan,
<span class=
"Constant">0xc5</span>/bg=blue-bg
201 <span id=
"L137" class=
"LineNr">137 </span> <span class=
"PreProc">return
</span> x2
<span class=
"muComment"># y2? yolo
</span>
202 <span id=
"L138" class=
"LineNr">138 </span><span class=
"Delimiter">}
</span>
203 <span id=
"L139" class=
"LineNr">139 </span>
204 <span id=
"L140" class=
"LineNr">140 </span><span class=
"muComment"># dump stack to screen from top to bottom
</span>
205 <span id=
"L141" class=
"LineNr">141 </span><span class=
"muComment"># optionally render a 'cursor' with the top code-point-utf8
</span>
206 <span id=
"L142" class=
"LineNr">142 </span><span class=
"muComment"># hard-coded colors:
</span>
207 <span id=
"L143" class=
"LineNr">143 </span><span class=
"muComment"># matching paren
</span>
208 <span id=
"L144" class=
"LineNr">144 </span><span class=
"muComment"># cursor
</span>
209 <span id=
"L145" class=
"LineNr">145 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L145'
>render-stack-from-top-wrapping-right-then-down
</a></span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>), _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), xmin: int, ymin: int, xmax: int, ymax: int, _x: int, _y: int, render-cursor?: boolean, color: int, background-color: int
<span class=
"PreProc"> -
> </span>_/eax: int, _/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Delimiter">{
</span>
210 <span id=
"L146" class=
"LineNr">146 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
211 <span id=
"L147" class=
"LineNr">147 </span> <span class=
"PreProc">var
</span> matching-close-paren-index/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L395'
>get-matching-close-paren-index
</a> self, render-cursor?
212 <span id=
"L148" class=
"LineNr">148 </span> <span class=
"PreProc">var
</span> data-ah/eax: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
213 <span id=
"L149" class=
"LineNr">149 </span> <span class=
"PreProc">var
</span> _data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
214 <span id=
"L150" class=
"LineNr">150 </span> <span class=
"PreProc">var
</span> data/
<span class=
"muRegEdi">edi
</span>: (addr array code-point-utf8)
<span class=
"Special"><-
</span> copy _data
215 <span id=
"L151" class=
"LineNr">151 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> copy _x
216 <span id=
"L152" class=
"LineNr">152 </span> <span class=
"PreProc">var
</span> y/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy _y
217 <span id=
"L153" class=
"LineNr">153 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEbx">ebx
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
218 <span id=
"L154" class=
"LineNr">154 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy *top-addr
219 <span id=
"L155" class=
"LineNr">155 </span> i
<span class=
"Special"><-
</span> decrement
220 <span id=
"L156" class=
"LineNr">156 </span> <span class=
"muComment"># if render-cursor?, peel off first iteration
</span>
221 <span id=
"L157" class=
"LineNr">157 </span> <span class=
"Delimiter">{
</span>
222 <span id=
"L158" class=
"LineNr">158 </span> compare render-cursor?,
<span class=
"Constant">0</span>/false
223 <span id=
"L159" class=
"LineNr">159 </span> <span class=
"PreProc">break-if-=
</span>
224 <span id=
"L160" class=
"LineNr">160 </span> compare i,
<span class=
"Constant">0</span>
225 <span id=
"L161" class=
"LineNr">161 </span> <span class=
"PreProc">break-if-
<</span>
226 <span id=
"L162" class=
"LineNr">162 </span> <span class=
"PreProc">var
</span> c: code-point
227 <span id=
"L163" class=
"LineNr">163 </span> <span class=
"Delimiter">{
</span>
228 <span id=
"L164" class=
"LineNr">164 </span> <span class=
"PreProc">var
</span> g/eax: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
229 <span id=
"L165" class=
"LineNr">165 </span> <span class=
"PreProc">var
</span> tmp/eax: code-point
<span class=
"Special"><-
</span> <a href='
403unicode.mu.html#L49'
>to-code-point
</a> *g
230 <span id=
"L166" class=
"LineNr">166 </span> copy-to c, tmp
231 <span id=
"L167" class=
"LineNr">167 </span> <span class=
"Delimiter">}
</span>
232 <span id=
"L168" class=
"LineNr">168 </span> x, y
<span class=
"Special"><-
</span> <a href='
501draw-text.mu.html#L155'
>render-code-point
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, c, xmin, ymin, xmax, ymax, x, y, background-color, color
233 <span id=
"L169" class=
"LineNr">169 </span> i
<span class=
"Special"><-
</span> decrement
234 <span id=
"L170" class=
"LineNr">170 </span> <span class=
"Delimiter">}
</span>
235 <span id=
"L171" class=
"LineNr">171 </span> <span class=
"muComment"># remaining iterations
</span>
236 <span id=
"L172" class=
"LineNr">172 </span> <span class=
"Delimiter">{
</span>
237 <span id=
"L173" class=
"LineNr">173 </span> compare i,
<span class=
"Constant">0</span>
238 <span id=
"L174" class=
"LineNr">174 </span> <span class=
"PreProc">break-if-
<</span>
239 <span id=
"L175" class=
"LineNr">175 </span> <span class=
"muComment"># highlight matching paren if needed
</span>
240 <span id=
"L176" class=
"LineNr">176 </span> <span class=
"PreProc">var
</span> fg: int
241 <span id=
"L177" class=
"LineNr">177 </span> <span class=
"Delimiter">{
</span>
242 <span id=
"L178" class=
"LineNr">178 </span> <span class=
"PreProc">var
</span> tmp/eax: int
<span class=
"Special"><-
</span> copy color
243 <span id=
"L179" class=
"LineNr">179 </span> copy-to fg, tmp
244 <span id=
"L180" class=
"LineNr">180 </span> <span class=
"Delimiter">}
</span>
245 <span id=
"L181" class=
"LineNr">181 </span> compare i, matching-close-paren-index
246 <span id=
"L182" class=
"LineNr">182 </span> <span class=
"Delimiter">{
</span>
247 <span id=
"L183" class=
"LineNr">183 </span> <span class=
"PreProc">break-if-!=
</span>
248 <span id=
"L184" class=
"LineNr">184 </span> copy-to fg,
<span class=
"Constant">0xf</span>/highlight
249 <span id=
"L185" class=
"LineNr">185 </span> <span class=
"Delimiter">}
</span>
250 <span id=
"L186" class=
"LineNr">186 </span> <span class=
"muComment">#
</span>
251 <span id=
"L187" class=
"LineNr">187 </span> <span class=
"PreProc">var
</span> c: code-point
252 <span id=
"L188" class=
"LineNr">188 </span> <span class=
"Delimiter">{
</span>
253 <span id=
"L189" class=
"LineNr">189 </span> <span class=
"PreProc">var
</span> g/eax: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
254 <span id=
"L190" class=
"LineNr">190 </span> <span class=
"PreProc">var
</span> tmp/eax: code-point
<span class=
"Special"><-
</span> <a href='
403unicode.mu.html#L49'
>to-code-point
</a> *g
255 <span id=
"L191" class=
"LineNr">191 </span> copy-to c, tmp
256 <span id=
"L192" class=
"LineNr">192 </span> <span class=
"Delimiter">}
</span>
257 <span id=
"L193" class=
"LineNr">193 </span> x, y
<span class=
"Special"><-
</span> <a href='
501draw-text.mu.html#L155'
>render-code-point
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, c, xmin, ymin, xmax, ymax, x, y, fg, background-color
258 <span id=
"L194" class=
"LineNr">194 </span> i
<span class=
"Special"><-
</span> decrement
259 <span id=
"L195" class=
"LineNr">195 </span> <span class=
"PreProc">loop
</span>
260 <span id=
"L196" class=
"LineNr">196 </span> <span class=
"Delimiter">}
</span>
261 <span id=
"L197" class=
"LineNr">197 </span> <span class=
"PreProc">return
</span> x, y
262 <span id=
"L198" class=
"LineNr">198 </span><span class=
"Delimiter">}
</span>
263 <span id=
"L199" class=
"LineNr">199 </span>
264 <span id=
"L200" class=
"LineNr">200 </span><span class=
"muComment"># helper for small words
</span>
265 <span id=
"L201" class=
"LineNr">201 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L201'
>render-stack-from-top
</a></span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>), self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), x: int, y: int, render-cursor?: boolean
<span class=
"PreProc"> -
> </span>_/eax: int
<span class=
"Delimiter">{
</span>
266 <span id=
"L202" class=
"LineNr">202 </span> <span class=
"PreProc">var
</span> _width/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
267 <span id=
"L203" class=
"LineNr">203 </span> <span class=
"PreProc">var
</span> _height/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
268 <span id=
"L204" class=
"LineNr">204 </span> _width, _height
<span class=
"Special"><-
</span> <a href='
500fake-screen.mu.html#L75'
>screen-size
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>
269 <span id=
"L205" class=
"LineNr">205 </span> <span class=
"PreProc">var
</span> width/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Special"><-
</span> copy _width
270 <span id=
"L206" class=
"LineNr">206 </span> <span class=
"PreProc">var
</span> height/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy _height
271 <span id=
"L207" class=
"LineNr">207 </span> <span class=
"PreProc">var
</span> x2/eax: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
272 <span id=
"L208" class=
"LineNr">208 </span> <span class=
"PreProc">var
</span> y2/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
273 <span id=
"L209" class=
"LineNr">209 </span> x2, y2
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L145'
>render-stack-from-top-wrapping-right-then-down
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, self, x, y, width, height, x, y, render-cursor?,
<span class=
"Constant">3</span>/fg=cyan,
<span class=
"Constant">0xc5</span>/bg=blue-bg
274 <span id=
"L210" class=
"LineNr">210 </span> <span class=
"PreProc">return
</span> x2
<span class=
"muComment"># y2? yolo
</span>
275 <span id=
"L211" class=
"LineNr">211 </span><span class=
"Delimiter">}
</span>
276 <span id=
"L212" class=
"LineNr">212 </span>
277 <span id=
"L213" class=
"LineNr">213 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a></span> <span class=
"Delimiter">{
</span>
278 <span id=
"L214" class=
"LineNr">214 </span> <span class=
"muComment"># setup: gs =
"abc
"</span>
279 <span id=
"L215" class=
"LineNr">215 </span> <span class=
"PreProc">var
</span> gs-storage:
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>
280 <span id=
"L216" class=
"LineNr">216 </span> <span class=
"PreProc">var
</span> gs/
<span class=
"muRegEdi">edi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> address gs-storage
281 <span id=
"L217" class=
"LineNr">217 </span> <a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a> gs,
<span class=
"Constant">5</span>
282 <span id=
"L218" class=
"LineNr">218 </span> <span class=
"PreProc">var
</span> g/eax: code-point-utf8
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x61</span>/a
283 <span id=
"L219" class=
"LineNr">219 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
284 <span id=
"L220" class=
"LineNr">220 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x62</span>/b
285 <span id=
"L221" class=
"LineNr">221 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
286 <span id=
"L222" class=
"LineNr">222 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x63</span>/c
287 <span id=
"L223" class=
"LineNr">223 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
288 <span id=
"L224" class=
"LineNr">224 </span> <span class=
"muComment"># setup: screen
</span>
289 <span id=
"L225" class=
"LineNr">225 </span> <span class=
"PreProc">var
</span> screen-storage:
<a href='
500fake-screen.mu.html#L16'
>screen
</a>
290 <span id=
"L226" class=
"LineNr">226 </span> <span class=
"PreProc">var
</span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>)
<span class=
"Special"><-
</span> address screen-storage
291 <span id=
"L227" class=
"LineNr">227 </span> <a href='
500fake-screen.mu.html#L34'
>initialize-screen
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">5</span>,
<span class=
"Constant">4</span>,
<span class=
"Constant">0</span>/no-pixel-graphics
292 <span id=
"L228" class=
"LineNr">228 </span> <span class=
"muComment">#
</span>
293 <span id=
"L229" class=
"LineNr">229 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L128'
>render-stack-from-bottom
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">0</span>/y,
<span class=
"Constant">0</span>/no-highlight-matching-open-paren,
<span class=
"Constant">0</span>/open-paren-depth
294 <span id=
"L230" class=
"LineNr">230 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">0</span>/y,
<span class=
"Constant">"abc
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from bottom
"</span>
295 <span id=
"L231" class=
"LineNr">231 </span> <a href='
502test.mu.html#L2'
>check-ints-equal
</a> x,
<span class=
"Constant">3</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from bottom: result
"</span>
296 <span id=
"L232" class=
"LineNr">232 </span> <a href='
504test-screen.mu.html#L267'
>check-background-color-in-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">3</span>/bg=reverse,
<span class=
"Constant">0</span>/y,
<span class=
"Constant">" "</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from bottom: bg
"</span>
297 <span id=
"L233" class=
"LineNr">233 </span> <span class=
"muComment">#
</span>
298 <span id=
"L234" class=
"LineNr">234 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L201'
>render-stack-from-top
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">1</span>/y,
<span class=
"Constant">0</span>/cursor=false
299 <span id=
"L235" class=
"LineNr">235 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">1</span>/y,
<span class=
"Constant">"cba
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from top without cursor
"</span>
300 <span id=
"L236" class=
"LineNr">236 </span> <a href='
502test.mu.html#L2'
>check-ints-equal
</a> x,
<span class=
"Constant">3</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from top without cursor: result
"</span>
301 <span id=
"L237" class=
"LineNr">237 </span> <a href='
504test-screen.mu.html#L267'
>check-background-color-in-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">3</span>/bg=reverse,
<span class=
"Constant">1</span>/y,
<span class=
"Constant">" "</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from top without cursor: bg
"</span>
302 <span id=
"L238" class=
"LineNr">238 </span> <span class=
"muComment">#
</span>
303 <span id=
"L239" class=
"LineNr">239 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L201'
>render-stack-from-top
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">1</span>/cursor=true
304 <span id=
"L240" class=
"LineNr">240 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"cba
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from top with cursor
"</span>
305 <span id=
"L241" class=
"LineNr">241 </span> <a href='
502test.mu.html#L2'
>check-ints-equal
</a> x,
<span class=
"Constant">3</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from top with cursor: result
"</span>
306 <span id=
"L242" class=
"LineNr">242 </span> <a href='
504test-screen.mu.html#L267'
>check-background-color-in-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">3</span>/bg=reverse,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"|
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L213'
>test-render-grapheme-stack
</a> from top with cursor: bg
"</span>
307 <span id=
"L243" class=
"LineNr">243 </span><span class=
"Delimiter">}
</span>
308 <span id=
"L244" class=
"LineNr">244 </span>
309 <span id=
"L245" class=
"LineNr">245 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
513grapheme-stack.mu.html#L245'
>test-render-grapheme-stack-while-highlighting-matching-close-paren
</a></span> <span class=
"Delimiter">{
</span>
310 <span id=
"L246" class=
"LineNr">246 </span> <span class=
"muComment"># setup: gs =
"(b)
"</span>
311 <span id=
"L247" class=
"LineNr">247 </span> <span class=
"PreProc">var
</span> gs-storage:
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>
312 <span id=
"L248" class=
"LineNr">248 </span> <span class=
"PreProc">var
</span> gs/
<span class=
"muRegEdi">edi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> address gs-storage
313 <span id=
"L249" class=
"LineNr">249 </span> <a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a> gs,
<span class=
"Constant">5</span>
314 <span id=
"L250" class=
"LineNr">250 </span> <span class=
"PreProc">var
</span> g/eax: code-point-utf8
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x29</span>/close-paren
315 <span id=
"L251" class=
"LineNr">251 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
316 <span id=
"L252" class=
"LineNr">252 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x62</span>/b
317 <span id=
"L253" class=
"LineNr">253 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
318 <span id=
"L254" class=
"LineNr">254 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
319 <span id=
"L255" class=
"LineNr">255 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
320 <span id=
"L256" class=
"LineNr">256 </span> <span class=
"muComment"># setup: screen
</span>
321 <span id=
"L257" class=
"LineNr">257 </span> <span class=
"PreProc">var
</span> screen-storage:
<a href='
500fake-screen.mu.html#L16'
>screen
</a>
322 <span id=
"L258" class=
"LineNr">258 </span> <span class=
"PreProc">var
</span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>)
<span class=
"Special"><-
</span> address screen-storage
323 <span id=
"L259" class=
"LineNr">259 </span> <a href='
500fake-screen.mu.html#L34'
>initialize-screen
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">5</span>,
<span class=
"Constant">4</span>,
<span class=
"Constant">0</span>/no-pixel-graphics
324 <span id=
"L260" class=
"LineNr">260 </span> <span class=
"muComment">#
</span>
325 <span id=
"L261" class=
"LineNr">261 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L201'
>render-stack-from-top
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">1</span>/cursor=true
326 <span id=
"L262" class=
"LineNr">262 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"(b)
"</span>,
<span class=
"Constant">"F - test-render-grapheme-stack-while-highlighting-matching-close-paren
"</span>
327 <span id=
"L263" class=
"LineNr">263 </span> <a href='
504test-screen.mu.html#L267'
>check-background-color-in-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">3</span>/bg=reverse,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"|
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L245'
>test-render-grapheme-stack-while-highlighting-matching-close-paren
</a>: cursor
"</span>
328 <span id=
"L264" class=
"LineNr">264 </span> <a href='
504test-screen.mu.html#L75'
>check-screen-row-in-color
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">0xf</span>/fg=white,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">" )
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L245'
>test-render-grapheme-stack-while-highlighting-matching-close-paren
</a>: matching paren
"</span>
329 <span id=
"L265" class=
"LineNr">265 </span><span class=
"Delimiter">}
</span>
330 <span id=
"L266" class=
"LineNr">266 </span>
331 <span id=
"L267" class=
"LineNr">267 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
513grapheme-stack.mu.html#L267'
>test-render-grapheme-stack-while-highlighting-matching-close-paren-
2</a></span> <span class=
"Delimiter">{
</span>
332 <span id=
"L268" class=
"LineNr">268 </span> <span class=
"muComment"># setup: gs =
"(a (b)) c
"</span>
333 <span id=
"L269" class=
"LineNr">269 </span> <span class=
"PreProc">var
</span> gs-storage:
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>
334 <span id=
"L270" class=
"LineNr">270 </span> <span class=
"PreProc">var
</span> gs/
<span class=
"muRegEdi">edi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> address gs-storage
335 <span id=
"L271" class=
"LineNr">271 </span> <a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a> gs,
<span class=
"Constant">0x10</span>
336 <span id=
"L272" class=
"LineNr">272 </span> <span class=
"PreProc">var
</span> g/eax: code-point-utf8
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x63</span>/c
337 <span id=
"L273" class=
"LineNr">273 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
338 <span id=
"L274" class=
"LineNr">274 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x20</span>/space
339 <span id=
"L275" class=
"LineNr">275 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
340 <span id=
"L276" class=
"LineNr">276 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x29</span>/close-paren
341 <span id=
"L277" class=
"LineNr">277 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
342 <span id=
"L278" class=
"LineNr">278 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x29</span>/close-paren
343 <span id=
"L279" class=
"LineNr">279 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
344 <span id=
"L280" class=
"LineNr">280 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x62</span>/b
345 <span id=
"L281" class=
"LineNr">281 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
346 <span id=
"L282" class=
"LineNr">282 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
347 <span id=
"L283" class=
"LineNr">283 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
348 <span id=
"L284" class=
"LineNr">284 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x20</span>/space
349 <span id=
"L285" class=
"LineNr">285 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
350 <span id=
"L286" class=
"LineNr">286 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x61</span>/a
351 <span id=
"L287" class=
"LineNr">287 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
352 <span id=
"L288" class=
"LineNr">288 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
353 <span id=
"L289" class=
"LineNr">289 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
354 <span id=
"L290" class=
"LineNr">290 </span> <span class=
"muComment"># setup: screen
</span>
355 <span id=
"L291" class=
"LineNr">291 </span> <span class=
"PreProc">var
</span> screen-storage:
<a href='
500fake-screen.mu.html#L16'
>screen
</a>
356 <span id=
"L292" class=
"LineNr">292 </span> <span class=
"PreProc">var
</span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>)
<span class=
"Special"><-
</span> address screen-storage
357 <span id=
"L293" class=
"LineNr">293 </span> <a href='
500fake-screen.mu.html#L34'
>initialize-screen
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">5</span>,
<span class=
"Constant">4</span>,
<span class=
"Constant">0</span>/no-pixel-graphics
358 <span id=
"L294" class=
"LineNr">294 </span> <span class=
"muComment">#
</span>
359 <span id=
"L295" class=
"LineNr">295 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L201'
>render-stack-from-top
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">1</span>/cursor=true
360 <span id=
"L296" class=
"LineNr">296 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"(a (b)) c
"</span>,
<span class=
"Constant">"F - test-render-grapheme-stack-while-highlighting-matching-close-paren-
2"</span>
361 <span id=
"L297" class=
"LineNr">297 </span> <a href='
504test-screen.mu.html#L267'
>check-background-color-in-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">3</span>/bg=reverse,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"|
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L267'
>test-render-grapheme-stack-while-highlighting-matching-close-paren-
2</a>: cursor
"</span>
362 <span id=
"L298" class=
"LineNr">298 </span> <a href='
504test-screen.mu.html#L75'
>check-screen-row-in-color
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">0xf</span>/fg=white,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">" )
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L267'
>test-render-grapheme-stack-while-highlighting-matching-close-paren-
2</a>: matching paren
"</span>
363 <span id=
"L299" class=
"LineNr">299 </span><span class=
"Delimiter">}
</span>
364 <span id=
"L300" class=
"LineNr">300 </span>
365 <span id=
"L301" class=
"LineNr">301 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
513grapheme-stack.mu.html#L301'
>test-render-grapheme-stack-while-highlighting-matching-open-paren-with-close-paren-at-end
</a></span> <span class=
"Delimiter">{
</span>
366 <span id=
"L302" class=
"LineNr">302 </span> <span class=
"muComment"># setup: gs =
"(b)
"</span>
367 <span id=
"L303" class=
"LineNr">303 </span> <span class=
"PreProc">var
</span> gs-storage:
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>
368 <span id=
"L304" class=
"LineNr">304 </span> <span class=
"PreProc">var
</span> gs/
<span class=
"muRegEdi">edi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> address gs-storage
369 <span id=
"L305" class=
"LineNr">305 </span> <a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a> gs,
<span class=
"Constant">5</span>
370 <span id=
"L306" class=
"LineNr">306 </span> <span class=
"PreProc">var
</span> g/eax: code-point-utf8
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
371 <span id=
"L307" class=
"LineNr">307 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
372 <span id=
"L308" class=
"LineNr">308 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x62</span>/b
373 <span id=
"L309" class=
"LineNr">309 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
374 <span id=
"L310" class=
"LineNr">310 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x29</span>/close-paren
375 <span id=
"L311" class=
"LineNr">311 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
376 <span id=
"L312" class=
"LineNr">312 </span> <span class=
"muComment"># setup: screen
</span>
377 <span id=
"L313" class=
"LineNr">313 </span> <span class=
"PreProc">var
</span> screen-storage:
<a href='
500fake-screen.mu.html#L16'
>screen
</a>
378 <span id=
"L314" class=
"LineNr">314 </span> <span class=
"PreProc">var
</span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>)
<span class=
"Special"><-
</span> address screen-storage
379 <span id=
"L315" class=
"LineNr">315 </span> <a href='
500fake-screen.mu.html#L34'
>initialize-screen
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">5</span>,
<span class=
"Constant">4</span>,
<span class=
"Constant">0</span>/no-pixel-graphics
380 <span id=
"L316" class=
"LineNr">316 </span> <span class=
"muComment">#
</span>
381 <span id=
"L317" class=
"LineNr">317 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L128'
>render-stack-from-bottom
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">1</span>/highlight-matching-open-paren,
<span class=
"Constant">1</span>/open-paren-depth
382 <span id=
"L318" class=
"LineNr">318 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"(b)
"</span>,
<span class=
"Constant">"F - test-render-grapheme-stack-while-highlighting-matching-open-paren-with-close-paren-at-end
"</span>
383 <span id=
"L319" class=
"LineNr">319 </span> <a href='
504test-screen.mu.html#L75'
>check-screen-row-in-color
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">0xf</span>/fg=white,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"(
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L301'
>test-render-grapheme-stack-while-highlighting-matching-open-paren-with-close-paren-at-end
</a>: matching paren
"</span>
384 <span id=
"L320" class=
"LineNr">320 </span><span class=
"Delimiter">}
</span>
385 <span id=
"L321" class=
"LineNr">321 </span>
386 <span id=
"L322" class=
"LineNr">322 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
513grapheme-stack.mu.html#L322'
>test-render-grapheme-stack-while-highlighting-matching-open-paren-with-close-paren-at-end-
2</a></span> <span class=
"Delimiter">{
</span>
387 <span id=
"L323" class=
"LineNr">323 </span> <span class=
"muComment"># setup: gs =
"a((b))
"</span>
388 <span id=
"L324" class=
"LineNr">324 </span> <span class=
"PreProc">var
</span> gs-storage:
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>
389 <span id=
"L325" class=
"LineNr">325 </span> <span class=
"PreProc">var
</span> gs/
<span class=
"muRegEdi">edi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> address gs-storage
390 <span id=
"L326" class=
"LineNr">326 </span> <a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a> gs,
<span class=
"Constant">0x10</span>
391 <span id=
"L327" class=
"LineNr">327 </span> <span class=
"PreProc">var
</span> g/eax: code-point-utf8
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x61</span>/a
392 <span id=
"L328" class=
"LineNr">328 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
393 <span id=
"L329" class=
"LineNr">329 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
394 <span id=
"L330" class=
"LineNr">330 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
395 <span id=
"L331" class=
"LineNr">331 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
396 <span id=
"L332" class=
"LineNr">332 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
397 <span id=
"L333" class=
"LineNr">333 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x62</span>/b
398 <span id=
"L334" class=
"LineNr">334 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
399 <span id=
"L335" class=
"LineNr">335 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x29</span>/close-paren
400 <span id=
"L336" class=
"LineNr">336 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
401 <span id=
"L337" class=
"LineNr">337 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x29</span>/close-paren
402 <span id=
"L338" class=
"LineNr">338 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
403 <span id=
"L339" class=
"LineNr">339 </span> <span class=
"muComment"># setup: screen
</span>
404 <span id=
"L340" class=
"LineNr">340 </span> <span class=
"PreProc">var
</span> screen-storage:
<a href='
500fake-screen.mu.html#L16'
>screen
</a>
405 <span id=
"L341" class=
"LineNr">341 </span> <span class=
"PreProc">var
</span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>)
<span class=
"Special"><-
</span> address screen-storage
406 <span id=
"L342" class=
"LineNr">342 </span> <a href='
500fake-screen.mu.html#L34'
>initialize-screen
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">5</span>,
<span class=
"Constant">4</span>,
<span class=
"Constant">0</span>/no-pixel-graphics
407 <span id=
"L343" class=
"LineNr">343 </span> <span class=
"muComment">#
</span>
408 <span id=
"L344" class=
"LineNr">344 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L128'
>render-stack-from-bottom
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">1</span>/highlight-matching-open-paren,
<span class=
"Constant">1</span>/open-paren-depth
409 <span id=
"L345" class=
"LineNr">345 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"a((b))
"</span>,
<span class=
"Constant">"F - test-render-grapheme-stack-while-highlighting-matching-open-paren-with-close-paren-at-end-
2"</span>
410 <span id=
"L346" class=
"LineNr">346 </span> <a href='
504test-screen.mu.html#L75'
>check-screen-row-in-color
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">0xf</span>/fg=white,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">" (
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L322'
>test-render-grapheme-stack-while-highlighting-matching-open-paren-with-close-paren-at-end-
2</a>: matching paren
"</span>
411 <span id=
"L347" class=
"LineNr">347 </span><span class=
"Delimiter">}
</span>
412 <span id=
"L348" class=
"LineNr">348 </span>
413 <span id=
"L349" class=
"LineNr">349 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
513grapheme-stack.mu.html#L349'
>test-render-grapheme-stack-while-highlighting-matching-open-paren
</a></span> <span class=
"Delimiter">{
</span>
414 <span id=
"L350" class=
"LineNr">350 </span> <span class=
"muComment"># setup: gs =
"(b
"</span>
415 <span id=
"L351" class=
"LineNr">351 </span> <span class=
"PreProc">var
</span> gs-storage:
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>
416 <span id=
"L352" class=
"LineNr">352 </span> <span class=
"PreProc">var
</span> gs/
<span class=
"muRegEdi">edi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> address gs-storage
417 <span id=
"L353" class=
"LineNr">353 </span> <a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a> gs,
<span class=
"Constant">5</span>
418 <span id=
"L354" class=
"LineNr">354 </span> <span class=
"PreProc">var
</span> g/eax: code-point-utf8
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
419 <span id=
"L355" class=
"LineNr">355 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
420 <span id=
"L356" class=
"LineNr">356 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x62</span>/b
421 <span id=
"L357" class=
"LineNr">357 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
422 <span id=
"L358" class=
"LineNr">358 </span> <span class=
"muComment"># setup: screen
</span>
423 <span id=
"L359" class=
"LineNr">359 </span> <span class=
"PreProc">var
</span> screen-storage:
<a href='
500fake-screen.mu.html#L16'
>screen
</a>
424 <span id=
"L360" class=
"LineNr">360 </span> <span class=
"PreProc">var
</span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>)
<span class=
"Special"><-
</span> address screen-storage
425 <span id=
"L361" class=
"LineNr">361 </span> <a href='
500fake-screen.mu.html#L34'
>initialize-screen
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">5</span>,
<span class=
"Constant">4</span>,
<span class=
"Constant">0</span>/no-pixel-graphics
426 <span id=
"L362" class=
"LineNr">362 </span> <span class=
"muComment">#
</span>
427 <span id=
"L363" class=
"LineNr">363 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L128'
>render-stack-from-bottom
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">1</span>/highlight-matching-open-paren,
<span class=
"Constant">0</span>/open-paren-depth
428 <span id=
"L364" class=
"LineNr">364 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"(b
"</span>,
<span class=
"Constant">"F - test-render-grapheme-stack-while-highlighting-matching-open-paren
"</span>
429 <span id=
"L365" class=
"LineNr">365 </span> <a href='
504test-screen.mu.html#L75'
>check-screen-row-in-color
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">0xf</span>/fg=white,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"(
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L349'
>test-render-grapheme-stack-while-highlighting-matching-open-paren
</a>: matching paren
"</span>
430 <span id=
"L366" class=
"LineNr">366 </span><span class=
"Delimiter">}
</span>
431 <span id=
"L367" class=
"LineNr">367 </span>
432 <span id=
"L368" class=
"LineNr">368 </span><span class=
"PreProc">fn
</span> <span class=
"muTest"><a href='
513grapheme-stack.mu.html#L368'
>test-render-grapheme-stack-while-highlighting-matching-open-paren-
2</a></span> <span class=
"Delimiter">{
</span>
433 <span id=
"L369" class=
"LineNr">369 </span> <span class=
"muComment"># setup: gs =
"a((b)
"</span>
434 <span id=
"L370" class=
"LineNr">370 </span> <span class=
"PreProc">var
</span> gs-storage:
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>
435 <span id=
"L371" class=
"LineNr">371 </span> <span class=
"PreProc">var
</span> gs/
<span class=
"muRegEdi">edi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> address gs-storage
436 <span id=
"L372" class=
"LineNr">372 </span> <a href='
513grapheme-stack.mu.html#L10'
>initialize-grapheme-stack
</a> gs,
<span class=
"Constant">0x10</span>
437 <span id=
"L373" class=
"LineNr">373 </span> <span class=
"PreProc">var
</span> g/eax: code-point-utf8
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x61</span>/a
438 <span id=
"L374" class=
"LineNr">374 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
439 <span id=
"L375" class=
"LineNr">375 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
440 <span id=
"L376" class=
"LineNr">376 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
441 <span id=
"L377" class=
"LineNr">377 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x28</span>/open-paren
442 <span id=
"L378" class=
"LineNr">378 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
443 <span id=
"L379" class=
"LineNr">379 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x62</span>/b
444 <span id=
"L380" class=
"LineNr">380 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
445 <span id=
"L381" class=
"LineNr">381 </span> g
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0x29</span>/close-paren
446 <span id=
"L382" class=
"LineNr">382 </span> <a href='
513grapheme-stack.mu.html#L41'
>push-grapheme-stack
</a> gs, g
447 <span id=
"L383" class=
"LineNr">383 </span> <span class=
"muComment"># setup: screen
</span>
448 <span id=
"L384" class=
"LineNr">384 </span> <span class=
"PreProc">var
</span> screen-storage:
<a href='
500fake-screen.mu.html#L16'
>screen
</a>
449 <span id=
"L385" class=
"LineNr">385 </span> <span class=
"PreProc">var
</span> <a href='
500fake-screen.mu.html#L16'
>screen
</a>/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
500fake-screen.mu.html#L16'
>screen
</a>)
<span class=
"Special"><-
</span> address screen-storage
450 <span id=
"L386" class=
"LineNr">386 </span> <a href='
500fake-screen.mu.html#L34'
>initialize-screen
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">5</span>,
<span class=
"Constant">4</span>,
<span class=
"Constant">0</span>/no-pixel-graphics
451 <span id=
"L387" class=
"LineNr">387 </span> <span class=
"muComment">#
</span>
452 <span id=
"L388" class=
"LineNr">388 </span> <span class=
"PreProc">var
</span> x/eax: int
<span class=
"Special"><-
</span> <a href='
513grapheme-stack.mu.html#L128'
>render-stack-from-bottom
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>, gs,
<span class=
"Constant">0</span>/x,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">1</span>/highlight-matching-open-paren,
<span class=
"Constant">0</span>/open-paren-depth
453 <span id=
"L389" class=
"LineNr">389 </span> <a href='
504test-screen.mu.html#L7'
>check-screen-row
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">"a((b)
"</span>,
<span class=
"Constant">"F - test-render-grapheme-stack-while-highlighting-matching-open-paren-
2"</span>
454 <span id=
"L390" class=
"LineNr">390 </span> <a href='
504test-screen.mu.html#L75'
>check-screen-row-in-color
</a> <a href='
500fake-screen.mu.html#L16'
>screen
</a>,
<span class=
"Constant">0xf</span>/fg=white,
<span class=
"Constant">2</span>/y,
<span class=
"Constant">" (
"</span>,
<span class=
"Constant">"F -
<a href='
513grapheme-stack.mu.html#L368'
>test-render-grapheme-stack-while-highlighting-matching-open-paren-
2</a>: matching paren
"</span>
455 <span id=
"L391" class=
"LineNr">391 </span><span class=
"Delimiter">}
</span>
456 <span id=
"L392" class=
"LineNr">392 </span>
457 <span id=
"L393" class=
"LineNr">393 </span><span class=
"muComment"># return the index of the matching close-paren of the code-point-utf8 at cursor (top of stack)
</span>
458 <span id=
"L394" class=
"LineNr">394 </span><span class=
"muComment"># or top index if there's no matching close-paren
</span>
459 <span id=
"L395" class=
"LineNr">395 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L395'
>get-matching-close-paren-index
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), render-cursor?: boolean
<span class=
"PreProc"> -
> </span>_/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Delimiter">{
</span>
460 <span id=
"L396" class=
"LineNr">396 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
461 <span id=
"L397" class=
"LineNr">397 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEdx">edx
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
462 <span id=
"L398" class=
"LineNr">398 </span> <span class=
"muComment"># if not rendering cursor, return
</span>
463 <span id=
"L399" class=
"LineNr">399 </span> compare render-cursor?,
<span class=
"Constant">0</span>/false
464 <span id=
"L400" class=
"LineNr">400 </span> <span class=
"Delimiter">{
</span>
465 <span id=
"L401" class=
"LineNr">401 </span> <span class=
"PreProc">break-if-!=
</span>
466 <span id=
"L402" class=
"LineNr">402 </span> <span class=
"PreProc">return
</span> *top-addr
467 <span id=
"L403" class=
"LineNr">403 </span> <span class=
"Delimiter">}
</span>
468 <span id=
"L404" class=
"LineNr">404 </span> <span class=
"PreProc">var
</span> data-ah/eax: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
469 <span id=
"L405" class=
"LineNr">405 </span> <span class=
"PreProc">var
</span> data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
470 <span id=
"L406" class=
"LineNr">406 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy *top-addr
471 <span id=
"L407" class=
"LineNr">407 </span> <span class=
"muComment"># if stack is empty, return
</span>
472 <span id=
"L408" class=
"LineNr">408 </span> compare i,
<span class=
"Constant">0</span>
473 <span id=
"L409" class=
"LineNr">409 </span> <span class=
"Delimiter">{
</span>
474 <span id=
"L410" class=
"LineNr">410 </span> <span class=
"PreProc">break-if-
></span>
475 <span id=
"L411" class=
"LineNr">411 </span> <span class=
"PreProc">return
</span> *top-addr
476 <span id=
"L412" class=
"LineNr">412 </span> <span class=
"Delimiter">}
</span>
477 <span id=
"L413" class=
"LineNr">413 </span> <span class=
"muComment"># if cursor is not '(' return
</span>
478 <span id=
"L414" class=
"LineNr">414 </span> i
<span class=
"Special"><-
</span> decrement
479 <span id=
"L415" class=
"LineNr">415 </span> <span class=
"PreProc">var
</span> g/
<span class=
"muRegEsi">esi
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
480 <span id=
"L416" class=
"LineNr">416 </span> compare *g,
<span class=
"Constant">0x28</span>/open-paren
481 <span id=
"L417" class=
"LineNr">417 </span> <span class=
"Delimiter">{
</span>
482 <span id=
"L418" class=
"LineNr">418 </span> <span class=
"PreProc">break-if-=
</span>
483 <span id=
"L419" class=
"LineNr">419 </span> <span class=
"PreProc">return
</span> *top-addr
484 <span id=
"L420" class=
"LineNr">420 </span> <span class=
"Delimiter">}
</span>
485 <span id=
"L421" class=
"LineNr">421 </span> <span class=
"muComment"># otherwise scan to matching paren
</span>
486 <span id=
"L422" class=
"LineNr">422 </span> <span class=
"PreProc">var
</span> paren-count/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">1</span>
487 <span id=
"L423" class=
"LineNr">423 </span> i
<span class=
"Special"><-
</span> decrement
488 <span id=
"L424" class=
"LineNr">424 </span> <span class=
"Delimiter">{
</span>
489 <span id=
"L425" class=
"LineNr">425 </span> compare i,
<span class=
"Constant">0</span>
490 <span id=
"L426" class=
"LineNr">426 </span> <span class=
"PreProc">break-if-
<</span>
491 <span id=
"L427" class=
"LineNr">427 </span> <span class=
"PreProc">var
</span> g/
<span class=
"muRegEsi">esi
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
492 <span id=
"L428" class=
"LineNr">428 </span> compare *g,
<span class=
"Constant">0x28</span>/open-paren
493 <span id=
"L429" class=
"LineNr">429 </span> <span class=
"Delimiter">{
</span>
494 <span id=
"L430" class=
"LineNr">430 </span> <span class=
"PreProc">break-if-!=
</span>
495 <span id=
"L431" class=
"LineNr">431 </span> paren-count
<span class=
"Special"><-
</span> increment
496 <span id=
"L432" class=
"LineNr">432 </span> <span class=
"Delimiter">}
</span>
497 <span id=
"L433" class=
"LineNr">433 </span> compare *g,
<span class=
"Constant">0x29</span>/close-paren
498 <span id=
"L434" class=
"LineNr">434 </span> <span class=
"Delimiter">{
</span>
499 <span id=
"L435" class=
"LineNr">435 </span> <span class=
"PreProc">break-if-!=
</span>
500 <span id=
"L436" class=
"LineNr">436 </span> compare paren-count,
<span class=
"Constant">1</span>
501 <span id=
"L437" class=
"LineNr">437 </span> <span class=
"Delimiter">{
</span>
502 <span id=
"L438" class=
"LineNr">438 </span> <span class=
"PreProc">break-if-!=
</span>
503 <span id=
"L439" class=
"LineNr">439 </span> <span class=
"PreProc">return
</span> i
504 <span id=
"L440" class=
"LineNr">440 </span> <span class=
"Delimiter">}
</span>
505 <span id=
"L441" class=
"LineNr">441 </span> paren-count
<span class=
"Special"><-
</span> decrement
506 <span id=
"L442" class=
"LineNr">442 </span> <span class=
"Delimiter">}
</span>
507 <span id=
"L443" class=
"LineNr">443 </span> i
<span class=
"Special"><-
</span> decrement
508 <span id=
"L444" class=
"LineNr">444 </span> <span class=
"PreProc">loop
</span>
509 <span id=
"L445" class=
"LineNr">445 </span> <span class=
"Delimiter">}
</span>
510 <span id=
"L446" class=
"LineNr">446 </span> <span class=
"PreProc">return
</span> *top-addr
511 <span id=
"L447" class=
"LineNr">447 </span><span class=
"Delimiter">}
</span>
512 <span id=
"L448" class=
"LineNr">448 </span>
513 <span id=
"L449" class=
"LineNr">449 </span><span class=
"muComment"># return the index of the first open-paren at the given depth
</span>
514 <span id=
"L450" class=
"LineNr">450 </span><span class=
"muComment"># or top index if there's no matching close-paren
</span>
515 <span id=
"L451" class=
"LineNr">451 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L451'
>get-matching-open-paren-index
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), control: boolean, depth: int
<span class=
"PreProc"> -
> </span>_/
<span class=
"muRegEdx">edx
</span>: int
<span class=
"Delimiter">{
</span>
516 <span id=
"L452" class=
"LineNr">452 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
517 <span id=
"L453" class=
"LineNr">453 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEdx">edx
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
518 <span id=
"L454" class=
"LineNr">454 </span> <span class=
"muComment"># if not rendering cursor, return
</span>
519 <span id=
"L455" class=
"LineNr">455 </span> compare control,
<span class=
"Constant">0</span>/false
520 <span id=
"L456" class=
"LineNr">456 </span> <span class=
"Delimiter">{
</span>
521 <span id=
"L457" class=
"LineNr">457 </span> <span class=
"PreProc">break-if-!=
</span>
522 <span id=
"L458" class=
"LineNr">458 </span> <span class=
"PreProc">return
</span> *top-addr
523 <span id=
"L459" class=
"LineNr">459 </span> <span class=
"Delimiter">}
</span>
524 <span id=
"L460" class=
"LineNr">460 </span> <span class=
"PreProc">var
</span> data-ah/eax: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
525 <span id=
"L461" class=
"LineNr">461 </span> <span class=
"PreProc">var
</span> data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
526 <span id=
"L462" class=
"LineNr">462 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEcx">ecx
</span>: int
<span class=
"Special"><-
</span> copy *top-addr
527 <span id=
"L463" class=
"LineNr">463 </span> <span class=
"muComment"># if stack is empty, return
</span>
528 <span id=
"L464" class=
"LineNr">464 </span> compare i,
<span class=
"Constant">0</span>
529 <span id=
"L465" class=
"LineNr">465 </span> <span class=
"Delimiter">{
</span>
530 <span id=
"L466" class=
"LineNr">466 </span> <span class=
"PreProc">break-if-
></span>
531 <span id=
"L467" class=
"LineNr">467 </span> <span class=
"PreProc">return
</span> *top-addr
532 <span id=
"L468" class=
"LineNr">468 </span> <span class=
"Delimiter">}
</span>
533 <span id=
"L469" class=
"LineNr">469 </span> <span class=
"muComment"># scan to matching open paren
</span>
534 <span id=
"L470" class=
"LineNr">470 </span> <span class=
"PreProc">var
</span> paren-count/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
535 <span id=
"L471" class=
"LineNr">471 </span> i
<span class=
"Special"><-
</span> decrement
536 <span id=
"L472" class=
"LineNr">472 </span> <span class=
"Delimiter">{
</span>
537 <span id=
"L473" class=
"LineNr">473 </span> compare i,
<span class=
"Constant">0</span>
538 <span id=
"L474" class=
"LineNr">474 </span> <span class=
"PreProc">break-if-
<</span>
539 <span id=
"L475" class=
"LineNr">475 </span> <span class=
"PreProc">var
</span> g/
<span class=
"muRegEsi">esi
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
540 <span id=
"L476" class=
"LineNr">476 </span> compare *g,
<span class=
"Constant">0x29</span>/close-paren
541 <span id=
"L477" class=
"LineNr">477 </span> <span class=
"Delimiter">{
</span>
542 <span id=
"L478" class=
"LineNr">478 </span> <span class=
"PreProc">break-if-!=
</span>
543 <span id=
"L479" class=
"LineNr">479 </span> paren-count
<span class=
"Special"><-
</span> increment
544 <span id=
"L480" class=
"LineNr">480 </span> <span class=
"Delimiter">}
</span>
545 <span id=
"L481" class=
"LineNr">481 </span> compare *g,
<span class=
"Constant">0x28</span>/open-paren
546 <span id=
"L482" class=
"LineNr">482 </span> <span class=
"Delimiter">{
</span>
547 <span id=
"L483" class=
"LineNr">483 </span> <span class=
"PreProc">break-if-!=
</span>
548 <span id=
"L484" class=
"LineNr">484 </span> compare paren-count, depth
549 <span id=
"L485" class=
"LineNr">485 </span> <span class=
"Delimiter">{
</span>
550 <span id=
"L486" class=
"LineNr">486 </span> <span class=
"PreProc">break-if-!=
</span>
551 <span id=
"L487" class=
"LineNr">487 </span> <span class=
"PreProc">return
</span> i
552 <span id=
"L488" class=
"LineNr">488 </span> <span class=
"Delimiter">}
</span>
553 <span id=
"L489" class=
"LineNr">489 </span> paren-count
<span class=
"Special"><-
</span> decrement
554 <span id=
"L490" class=
"LineNr">490 </span> <span class=
"Delimiter">}
</span>
555 <span id=
"L491" class=
"LineNr">491 </span> i
<span class=
"Special"><-
</span> decrement
556 <span id=
"L492" class=
"LineNr">492 </span> <span class=
"PreProc">loop
</span>
557 <span id=
"L493" class=
"LineNr">493 </span> <span class=
"Delimiter">}
</span>
558 <span id=
"L494" class=
"LineNr">494 </span> <span class=
"PreProc">return
</span> *top-addr
559 <span id=
"L495" class=
"LineNr">495 </span><span class=
"Delimiter">}
</span>
560 <span id=
"L496" class=
"LineNr">496 </span>
561 <span id=
"L497" class=
"LineNr">497 </span><span class=
"muComment"># compare from bottom
</span>
562 <span id=
"L498" class=
"LineNr">498 </span><span class=
"muComment"># beware: modifies 'stream', which must be disposed of after a false result
</span>
563 <span id=
"L499" class=
"LineNr">499 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L499'
>prefix-match?
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), s: (addr stream byte)
<span class=
"PreProc"> -
> </span>_/eax: boolean
<span class=
"Delimiter">{
</span>
564 <span id=
"L500" class=
"LineNr">500 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
565 <span id=
"L501" class=
"LineNr">501 </span> <span class=
"PreProc">var
</span> data-ah/
<span class=
"muRegEdi">edi
</span>: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
566 <span id=
"L502" class=
"LineNr">502 </span> <span class=
"PreProc">var
</span> _data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
567 <span id=
"L503" class=
"LineNr">503 </span> <span class=
"PreProc">var
</span> data/
<span class=
"muRegEdi">edi
</span>: (addr array code-point-utf8)
<span class=
"Special"><-
</span> copy _data
568 <span id=
"L504" class=
"LineNr">504 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEcx">ecx
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
569 <span id=
"L505" class=
"LineNr">505 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
570 <span id=
"L506" class=
"LineNr">506 </span> <span class=
"Delimiter">{
</span>
571 <span id=
"L507" class=
"LineNr">507 </span> compare i, *top-addr
572 <span id=
"L508" class=
"LineNr">508 </span> <span class=
"PreProc">break-if-
>=
</span>
573 <span id=
"L509" class=
"LineNr">509 </span> <span class=
"muComment"># if curr != expected, return false
</span>
574 <span id=
"L510" class=
"LineNr">510 </span> <span class=
"Delimiter">{
</span>
575 <span id=
"L511" class=
"LineNr">511 </span> <span class=
"PreProc">var
</span> curr-a/
<span class=
"muRegEdx">edx
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
576 <span id=
"L512" class=
"LineNr">512 </span> <span class=
"PreProc">var
</span> expected/eax: code-point-utf8
<span class=
"Special"><-
</span> <a href='
403unicode.mu.html#L229'
>read-code-point-utf8
</a> s
577 <span id=
"L513" class=
"LineNr">513 </span> <span class=
"Delimiter">{
</span>
578 <span id=
"L514" class=
"LineNr">514 </span> compare expected, *curr-a
579 <span id=
"L515" class=
"LineNr">515 </span> <span class=
"PreProc">break-if-=
</span>
580 <span id=
"L516" class=
"LineNr">516 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">0</span>/false
581 <span id=
"L517" class=
"LineNr">517 </span> <span class=
"Delimiter">}
</span>
582 <span id=
"L518" class=
"LineNr">518 </span> <span class=
"Delimiter">}
</span>
583 <span id=
"L519" class=
"LineNr">519 </span> i
<span class=
"Special"><-
</span> increment
584 <span id=
"L520" class=
"LineNr">520 </span> <span class=
"PreProc">loop
</span>
585 <span id=
"L521" class=
"LineNr">521 </span> <span class=
"Delimiter">}
</span>
586 <span id=
"L522" class=
"LineNr">522 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">1</span> <span class=
"muComment"># true
</span>
587 <span id=
"L523" class=
"LineNr">523 </span><span class=
"Delimiter">}
</span>
588 <span id=
"L524" class=
"LineNr">524 </span>
589 <span id=
"L525" class=
"LineNr">525 </span><span class=
"muComment"># compare from bottom
</span>
590 <span id=
"L526" class=
"LineNr">526 </span><span class=
"muComment"># beware: modifies 'stream', which must be disposed of after a false result
</span>
591 <span id=
"L527" class=
"LineNr">527 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L527'
>suffix-match?
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>), s: (addr stream byte)
<span class=
"PreProc"> -
> </span>_/eax: boolean
<span class=
"Delimiter">{
</span>
592 <span id=
"L528" class=
"LineNr">528 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
593 <span id=
"L529" class=
"LineNr">529 </span> <span class=
"PreProc">var
</span> data-ah/
<span class=
"muRegEdi">edi
</span>: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
594 <span id=
"L530" class=
"LineNr">530 </span> <span class=
"PreProc">var
</span> _data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
595 <span id=
"L531" class=
"LineNr">531 </span> <span class=
"PreProc">var
</span> data/
<span class=
"muRegEdi">edi
</span>: (addr array code-point-utf8)
<span class=
"Special"><-
</span> copy _data
596 <span id=
"L532" class=
"LineNr">532 </span> <span class=
"PreProc">var
</span> top-addr/eax: (addr int)
<span class=
"Special"><-
</span> get self, top
597 <span id=
"L533" class=
"LineNr">533 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy *top-addr
598 <span id=
"L534" class=
"LineNr">534 </span> i
<span class=
"Special"><-
</span> decrement
599 <span id=
"L535" class=
"LineNr">535 </span> <span class=
"Delimiter">{
</span>
600 <span id=
"L536" class=
"LineNr">536 </span> compare i,
<span class=
"Constant">0</span>
601 <span id=
"L537" class=
"LineNr">537 </span> <span class=
"PreProc">break-if-
<</span>
602 <span id=
"L538" class=
"LineNr">538 </span> <span class=
"Delimiter">{
</span>
603 <span id=
"L539" class=
"LineNr">539 </span> <span class=
"PreProc">var
</span> curr-a/
<span class=
"muRegEdx">edx
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
604 <span id=
"L540" class=
"LineNr">540 </span> <span class=
"PreProc">var
</span> expected/eax: code-point-utf8
<span class=
"Special"><-
</span> <a href='
403unicode.mu.html#L229'
>read-code-point-utf8
</a> s
605 <span id=
"L541" class=
"LineNr">541 </span> <span class=
"muComment"># if curr != expected, return false
</span>
606 <span id=
"L542" class=
"LineNr">542 </span> <span class=
"Delimiter">{
</span>
607 <span id=
"L543" class=
"LineNr">543 </span> compare expected, *curr-a
608 <span id=
"L544" class=
"LineNr">544 </span> <span class=
"PreProc">break-if-=
</span>
609 <span id=
"L545" class=
"LineNr">545 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">0</span>/false
610 <span id=
"L546" class=
"LineNr">546 </span> <span class=
"Delimiter">}
</span>
611 <span id=
"L547" class=
"LineNr">547 </span> <span class=
"Delimiter">}
</span>
612 <span id=
"L548" class=
"LineNr">548 </span> i
<span class=
"Special"><-
</span> decrement
613 <span id=
"L549" class=
"LineNr">549 </span> <span class=
"PreProc">loop
</span>
614 <span id=
"L550" class=
"LineNr">550 </span> <span class=
"Delimiter">}
</span>
615 <span id=
"L551" class=
"LineNr">551 </span> <span class=
"PreProc">return
</span> <span class=
"Constant">1</span> <span class=
"muComment"># true
</span>
616 <span id=
"L552" class=
"LineNr">552 </span><span class=
"Delimiter">}
</span>
617 <span id=
"L553" class=
"LineNr">553 </span>
618 <span id=
"L554" class=
"LineNr">554 </span><span class=
"PreProc">fn
</span> <span class=
"muFunction"><a href='
513grapheme-stack.mu.html#L554'
>grapheme-stack-is-decimal-integer?
</a></span> _self: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"PreProc"> -
> </span>_/eax: boolean
<span class=
"Delimiter">{
</span>
619 <span id=
"L555" class=
"LineNr">555 </span> <span class=
"PreProc">var
</span> self/
<span class=
"muRegEsi">esi
</span>: (addr
<a href='
513grapheme-stack.mu.html#L5'
>grapheme-stack
</a>)
<span class=
"Special"><-
</span> copy _self
620 <span id=
"L556" class=
"LineNr">556 </span> <span class=
"PreProc">var
</span> data-ah/eax: (addr handle array code-point-utf8)
<span class=
"Special"><-
</span> get self, data
621 <span id=
"L557" class=
"LineNr">557 </span> <span class=
"PreProc">var
</span> _data/eax: (addr array code-point-utf8)
<span class=
"Special"><-
</span> <a href='
120allocate.subx.html#L235'
>lookup
</a> *data-ah
622 <span id=
"L558" class=
"LineNr">558 </span> <span class=
"PreProc">var
</span> data/
<span class=
"muRegEdx">edx
</span>: (addr array code-point-utf8)
<span class=
"Special"><-
</span> copy _data
623 <span id=
"L559" class=
"LineNr">559 </span> <span class=
"PreProc">var
</span> top-addr/
<span class=
"muRegEcx">ecx
</span>: (addr int)
<span class=
"Special"><-
</span> get self, top
624 <span id=
"L560" class=
"LineNr">560 </span> <span class=
"PreProc">var
</span> i/
<span class=
"muRegEbx">ebx
</span>: int
<span class=
"Special"><-
</span> copy
<span class=
"Constant">0</span>
625 <span id=
"L561" class=
"LineNr">561 </span> <span class=
"PreProc">var
</span> result/eax: boolean
<span class=
"Special"><-
</span> copy
<span class=
"Constant">1</span>/true
626 <span id=
"L562" class=
"LineNr">562 </span> $grapheme-stack-is-integer?:
<span class=
"PreProc">loop
</span>:
<span class=
"Delimiter">{
</span>
627 <span id=
"L563" class=
"LineNr">563 </span> compare i, *top-addr
628 <span id=
"L564" class=
"LineNr">564 </span> <span class=
"PreProc">break-if-
>=
</span>
629 <span id=
"L565" class=
"LineNr">565 </span> <span class=
"PreProc">var
</span> g/
<span class=
"muRegEdx">edx
</span>: (addr code-point-utf8)
<span class=
"Special"><-
</span> index data, i
630 <span id=
"L566" class=
"LineNr">566 </span> result
<span class=
"Special"><-
</span> <a href='
126write-int-decimal.subx.html#L327'
>decimal-digit?
</a> *g
631 <span id=
"L567" class=
"LineNr">567 </span> compare result,
<span class=
"Constant">0</span>/false
632 <span id=
"L568" class=
"LineNr">568 </span> <span class=
"PreProc">break-if-=
</span>
633 <span id=
"L569" class=
"LineNr">569 </span> i
<span class=
"Special"><-
</span> increment
634 <span id=
"L570" class=
"LineNr">570 </span> <span class=
"PreProc">loop
</span>
635 <span id=
"L571" class=
"LineNr">571 </span> <span class=
"Delimiter">}
</span>
636 <span id=
"L572" class=
"LineNr">572 </span> <span class=
"PreProc">return
</span> result
637 <span id=
"L573" class=
"LineNr">573 </span><span class=
"Delimiter">}
</span>
641 <!-- vim: set foldmethod=manual : -->