about summary refs log blame commit diff stats
path: root/src/tools/parser.c
blob: 1f8a522021faa267f2e463be30d64f87d4fe1f4c (plain) (tree)
pan class="nt">span> cursor-column:number<span class="Special"> &lt;- </span>get *recipes, <span class="Constant">cursor-column:offset</span> <span class="Delimiter">}</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sandbox-in-focus? cursor-row:number<span class="Special"> &lt;- </span>get *current-sandbox, <span class="Constant">cursor-row:offset</span> cursor-column:number<span class="Special"> &lt;- </span>get *current-sandbox, <span class="Constant">cursor-column:offset</span> <span class="Delimiter">}</span> screen<span class="Special"> &lt;- </span>move-cursor screen, cursor-row, cursor-column <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> ] <span class="Comment"># row, screen &lt;- render-string screen:address, s:address:array:character, left:number, right:number, color:number, row:number</span> <span class="Comment"># print a string 's' to 'editor' in 'color' starting at 'row'</span> <span class="Comment"># clear rest of last line, move cursor to next line</span> <span class="muRecipe">recipe</span> render-string [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> s:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> left:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> right:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> color:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> row:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply-unless</span> s, row/same-as-ingredient:<span class="Constant">5</span>, screen/same-as-ingredient:<span class="Constant">0</span> column:number<span class="Special"> &lt;- </span>copy left screen<span class="Special"> &lt;- </span>move-cursor screen, row, column screen-height:number<span class="Special"> &lt;- </span>screen-height screen i:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> len:number<span class="Special"> &lt;- </span>length *s <span class="Delimiter">{</span> <span class="Constant"> +next-character</span> done?:boolean<span class="Special"> &lt;- </span>greater-or-equal i, len <span class="muControl">break-if</span> done? done?<span class="Special"> &lt;- </span>greater-or-equal row, screen-height <span class="muControl">break-if</span> done? c:character<span class="Special"> &lt;- </span>index *s, i <span class="Delimiter">{</span> <span class="Comment"># at right? wrap.</span> at-right?:boolean<span class="Special"> &lt;- </span>equal column, right <span class="muControl">break-unless</span> at-right? <span class="Comment"># print wrap icon</span> print-character screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> column<span class="Special"> &lt;- </span>copy left row<span class="Special"> &lt;- </span>add row, <span class="Constant">1</span> screen<span class="Special"> &lt;- </span>move-cursor screen, row, column <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Comment"># retry i</span> <span class="Delimiter">}</span> i<span class="Special"> &lt;- </span>add i, <span class="Constant">1</span> <span class="Delimiter">{</span> <span class="Comment"># newline? move to left rather than 0</span> newline?:boolean<span class="Special"> &lt;- </span>equal c, <span class="Constant">10/newline</span> <span class="muControl">break-unless</span> newline? <span class="Comment"># clear rest of line in this window</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> &lt;- </span>greater-than column, right <span class="muControl">break-if</span> done? print-character screen, <span class="Constant">32/space</span> column<span class="Special"> &lt;- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> row<span class="Special"> &lt;- </span>add row, <span class="Constant">1</span> column<span class="Special"> &lt;- </span>copy left screen<span class="Special"> &lt;- </span>move-cursor screen, row, column <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Delimiter">}</span> print-character screen, c, color column<span class="Special"> &lt;- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> was-at-left?:boolean<span class="Special"> &lt;- </span>equal column, left clear-line-delimited screen, column, right <span class="Delimiter">{</span> <span class="muControl">break-if</span> was-at-left? row<span class="Special"> &lt;- </span>add row, <span class="Constant">1</span> <span class="Delimiter">}</span> move-cursor row, left <span class="muControl">reply</span> row/same-as-ingredient:<span class="Constant">5</span>, screen/same-as-ingredient:<span class="Constant">0</span> ] <span class="Comment"># row, screen &lt;- render-code-string screen:address, s:address:array:character, left:number, right:number, row:number</span> <span class="Comment"># like 'render-string' but with colorization for comments like in the editor</span> <span class="muRecipe">recipe</span> render-code-string [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> s:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> left:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> right:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> row:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply-unless</span> s, row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> color:number<span class="Special"> &lt;- </span>copy <span class="Constant">7/white</span> column:number<span class="Special"> &lt;- </span>copy left screen<span class="Special"> &lt;- </span>move-cursor screen, row, column screen-height:number<span class="Special"> &lt;- </span>screen-height screen i:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> len:number<span class="Special"> &lt;- </span>length *s <span class="Delimiter">{</span> <span class="Constant"> +next-character</span> done?:boolean<span class="Special"> &lt;- </span>greater-or-equal i, len <span class="muControl">break-if</span> done? done?<span class="Special"> &lt;- </span>greater-or-equal row, screen-height <span class="muControl">break-if</span> done? c:character<span class="Special"> &lt;- </span>index *s, i <span class="Constant">&lt;character-c-received&gt;</span> <span class="Comment"># only line different from render-string</span> <span class="Delimiter">{</span> <span class="Comment"># at right? wrap.</span> at-right?:boolean<span class="Special"> &lt;- </span>equal column, right <span class="muControl">break-unless</span> at-right? <span class="Comment"># print wrap icon</span> print-character screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> column<span class="Special"> &lt;- </span>copy left row<span class="Special"> &lt;- </span>add row, <span class="Constant">1</span> screen<span class="Special"> &lt;- </span>move-cursor screen, row, column <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Comment"># retry i</span> <span class="Delimiter">}</span> i<span class="Special"> &lt;- </span>add i, <span class="Constant">1</span> <span class="Delimiter">{</span> <span class="Comment"># newline? move to left rather than 0</span> newline?:boolean<span class="Special"> &lt;- </span>equal c, <span class="Constant">10/newline</span> <span class="muControl">break-unless</span> newline? <span class="Comment"># clear rest of line in this window</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> &lt;- </span>greater-than column, right <span class="muControl">break-if</span> done? print-character screen, <span class="Constant">32/space</span> column<span class="Special"> &lt;- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> row<span class="Special"> &lt;- </span>add row, <span class="Constant">1</span> column<span class="Special"> &lt;- </span>copy left screen<span class="Special"> &lt;- </span>move-cursor screen, row, column <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Delimiter">}</span> print-character screen, c, color column<span class="Special"> &lt;- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> was-at-left?:boolean<span class="Special"> &lt;- </span>equal column, left clear-line-delimited screen, column, right <span class="Delimiter">{</span> <span class="muControl">break-if</span> was-at-left? row<span class="Special"> &lt;- </span>add row, <span class="Constant">1</span> <span class="Delimiter">}</span> move-cursor row, left <span class="muControl">reply</span> row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> ] <span class="Comment"># ctrl-l - redraw screen (just in case it printed junk somehow)</span> <span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [ <span class="Delimiter">{</span> redraw-screen?:boolean<span class="Special"> &lt;- </span>equal *c, <span class="Constant">12/ctrl-l</span> <span class="muControl">break-unless</span> redraw-screen? screen<span class="Special"> &lt;- </span>render-all screen, env:address:programming-environment-data sync-screen screen <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> <span class="Delimiter">}</span> ] <span class="Comment"># ctrl-n - switch focus</span> <span class="Comment"># todo: test this</span> <span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [ <span class="Delimiter">{</span> switch-side?:boolean<span class="Special"> &lt;- </span>equal *c, <span class="Constant">14/ctrl-n</span> <span class="muControl">break-unless</span> switch-side? *sandbox-in-focus?<span class="Special"> &lt;- </span>not *sandbox-in-focus? screen<span class="Special"> &lt;- </span>update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> <span class="Delimiter">}</span> ] <span class="Comment"># ctrl-x - maximize/unmaximize the side with focus</span> <span class="muScenario">scenario</span> maximize-side [ $close-trace <span class="Comment"># trace too long</span> assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span> <span class="Comment"># initialize both halves of screen</span> <span class="Constant">1</span>:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abc]</span> <span class="Constant">2</span>:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[def]</span> <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> &lt;- </span>new-programming-environment screen:address, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character screen<span class="Special"> &lt;- </span>render-all screen, <span class="Constant">3</span>:address:programming-environment-data screen-should-contain [ <span class="Constant"> . run (F4) .</span> <span class="Constant"> .abc ┊def .</span> <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> <span class="Constant"> . ┊ .</span> ] <span class="Comment"># hit ctrl-x</span> assume-console [ press ctrl-x ] run [ event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data ] <span class="Comment"># only left side visible</span> screen-should-contain [ <span class="Constant"> . run (F4) .</span> <span class="Constant"> .abc .</span> <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈.</span> <span class="Constant"> . .</span> ] <span class="Comment"># hit any key to toggle back</span> assume-console [ press ctrl-x ] run [ event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data ] screen-should-contain [ <span class="Constant"> . run (F4) .</span> <span class="Constant"> .abc ┊def .</span> <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> <span class="Constant"> . ┊ .</span> ] ] <span class="CommentedCode">#? # ctrl-t - browse trace</span> <span class="CommentedCode">#? after &lt;global-type&gt; [</span> <span class="CommentedCode">#? {</span> <span class="CommentedCode">#? browse-trace?:boolean &lt;- equal *c, 20/ctrl-t</span> <span class="CommentedCode">#? break-unless browse-trace?</span> <span class="CommentedCode">#? $browse-trace</span> <span class="CommentedCode">#? screen &lt;- render-all screen, env:address:programming-environment-data</span> <span class="CommentedCode">#? loop +next-event:label</span> <span class="CommentedCode">#? }</span> <span class="CommentedCode">#? ]</span> <span class="muData">container</span> programming-environment-data [ maximized?:boolean ] <span class="muRecipe">after</span> <span class="Constant">&lt;global-type&gt;</span> [ <span class="Delimiter">{</span> maximize?:boolean<span class="Special"> &lt;- </span>equal *c, <span class="Constant">24/ctrl-x</span> <span class="muControl">break-unless</span> maximize? screen, console<span class="Special"> &lt;- </span>maximize screen, console, env:address:programming-environment-data <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> <span class="Delimiter">}</span> ] <span class="muRecipe">recipe</span> maximize [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> console:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> env:address:programming-environment-data<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> hide-screen screen <span class="Comment"># maximize one of the sides</span> maximized?:address:boolean<span class="Special"> &lt;- </span>get-address *env, <span class="Constant">maximized?:offset</span> *maximized?<span class="Special"> &lt;- </span>copy <span class="Constant">1/true</span> <span class="Comment">#</span> sandbox-in-focus?:boolean<span class="Special"> &lt;- </span>get *env, <span class="Constant">sandbox-in-focus?:offset</span> <span class="Delimiter">{</span> <span class="muControl">break-if</span> sandbox-in-focus? editor:address:editor-data<span class="Special"> &lt;- </span>get *env, <span class="Constant">recipes:offset</span> right:address:number<span class="Special"> &lt;- </span>get-address *editor, <span class="Constant">right:offset</span> *right<span class="Special"> &lt;- </span>screen-width screen *right<span class="Special"> &lt;- </span>subtract *right, <span class="Constant">1</span> screen<span class="Special"> &lt;- </span>render-recipes screen, env <span class="Delimiter">}</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sandbox-in-focus? editor:address:editor-data<span class="Special"> &lt;- </span>get *env, <span class="Constant">current-sandbox:offset</span> left:address:number<span class="Special"> &lt;- </span>get-address *editor, <span class="Constant">left:offset</span> *left<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> screen<span class="Special"> &lt;- </span>render-sandbox-side screen, env <span class="Delimiter">}</span> show-screen screen <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span>, console/same-as-ingredient:<span class="Constant">1</span> ] <span class="Comment"># when maximized, wait for any event and simply unmaximize</span> <span class="muRecipe">after</span> <span class="Constant">&lt;handle-event&gt;</span> [ <span class="Delimiter">{</span> maximized?:address:boolean<span class="Special"> &lt;- </span>get-address *env, <span class="Constant">maximized?:offset</span> <span class="muControl">break-unless</span> *maximized? *maximized?<span class="Special"> &lt;- </span>copy <span class="Constant">0/false</span> <span class="Comment"># undo maximize</span> <span class="Delimiter">{</span> <span class="muControl">break-if</span> *sandbox-in-focus? editor:address:editor-data<span class="Special"> &lt;- </span>get *env, <span class="Constant">recipes:offset</span> right:address:number<span class="Special"> &lt;- </span>get-address *editor, <span class="Constant">right:offset</span> *right<span class="Special"> &lt;- </span>screen-width screen *right<span class="Special"> &lt;- </span>divide *right, <span class="Constant">2</span> *right<span class="Special"> &lt;- </span>subtract *right, <span class="Constant">1</span> <span class="Delimiter">}</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> *sandbox-in-focus? editor:address:editor-data<span class="Special"> &lt;- </span>get *env, <span class="Constant">current-sandbox:offset</span> left:address:number<span class="Special"> &lt;- </span>get-address *editor, <span class="Constant">left:offset</span> *left<span class="Special"> &lt;- </span>screen-width screen *left<span class="Special"> &lt;- </span>divide *left, <span class="Constant">2</span> *left<span class="Special"> &lt;- </span>add *left, <span class="Constant">1</span> <span class="Delimiter">}</span> render-all screen, env show-screen screen <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> <span class="Delimiter">}</span> ] <span class="SalientComment">## helpers</span> <span class="muRecipe">recipe</span> draw-vertical [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> col:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> y:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> bottom:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> style:character, style-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="muControl">break-if</span> style-found? style<span class="Special"> &lt;- </span>copy <span class="Constant">9474/vertical</span> <span class="Delimiter">}</span> color:number, color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default color to white</span> <span class="muControl">break-if</span> color-found? color<span class="Special"> &lt;- </span>copy <span class="Constant">245/grey</span> <span class="Delimiter">}</span> <span class="Delimiter">{</span> continue?:boolean<span class="Special"> &lt;- </span>lesser-than y, bottom <span class="muControl">break-unless</span> continue? screen<span class="Special"> &lt;- </span>move-cursor screen, y, col print-character screen, style, color y<span class="Special"> &lt;- </span>add y, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> ] </pre> </body> </html> <!-- vim: set foldmethod=manual : -->