about summary refs log tree commit diff stats
path: root/html/127next-word.subx.html
blob: 1bdd36dae1c459d9a1c2fc84948fbac2f8493bda (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
Ranger v.1.0.4
==============

Ranger

   A keeper, guardian, or soldier who ranges over a region
   to protect the area or enforce the law.

This is the filemanager Chuck Norris the Texas Ranger would use
if he had a computer with a unix-like operating system.  (He doesn't
trust computers though and prefers to do the calculations himself.)

After all, as a professional ranger, he needs a broad overview of his
territory, and the multi-column display of ranger provides just that,
rather than restricting you to the current directory only.
You can preview the content of the selected file or directory, copy or move
files around with the VIM-like commands dd and yy, execute predefined
applications when opening a file, etc...

Everything is fully customizable and written in Python (2.6 and 3.1
compatible) using curses for the text-based user interface.


About
-----

* Author:          Roman Zimbelmann
* Email:           romanz@lavabit.com
* Website:         http://savannah.nongnu.org/projects/ranger
* Git repo:        http://git.savannah.gnu.org/cgit/ranger.git
* Version:         1.0.4


Features
--------

* Multi-column display
* Preview of the selected file/directory
* Common file operations (create/chmod/copy/delete/...)
* Quickly find files or text inside files
* VIM-like console and hotkeys
* Open files in external programs
* Mouse support
* Change the directory of your shell after exiting ranger
* Bookmarks


Dependencies
------------

* A Unix-like Operating System
* Python 2.6 or 3.1
* Python curses module  (often but not always included with Python)


Bugs and Feature Requests
-------------------------

Report bugs and feature requests on savannah:
    https://savannah.nongnu.org/bugs/?func=additem&group=ranger

Alternatively you can send an email to romanz@lavabit.com.

Please include as much relevant information as possible.
Using ranger with the --debug option will abort the program and
print tracebacks rather than a red message in the statusbar.
If this applies to you, please include such a traceback in your report.


Getting Started
---------------

If you just want to check out ranger without installing it, type

    ./ranger.py --clean

in the top directory of ranger.  By using the --clean switch, it will
leave no trace on your system whatsoever.

To properly install it, follow the instructions in the INSTALL file,
then type:

    ranger

You should see 4 columns.  The third is the directory where you are at
the moment.  To the left, there are the directories above the current
working directory, and the column on the right is a preview of the selected
file/directory.

Now use the arrow keys to navigate, press enter to open a file.

A list of commands with short descriptions can be viewed by
pressing "?" inside the program and following the instructions.
The file ranger/defaults/keys.py contains all key combinations, so that's
another place you may want to check out.


Opening Files with Ranger
-------------------------

If you use the same applications like me, you'll be able to open
files by pressing the right arrow key.  If not, you will have to
specify them in ranger/defaults/apps.py.  It's explained
in the docstrings how exactly to do that.

Once you've set up your applications, you can also use ranger to
open files from the shell:
    ranger blabla.pdf


Customizing Ranger
------------------

The file ranger/defaults/options.py contains most of the options.
apps.py defines how files are run, keys.py defines keybindings.

The files in ranger/defaults/ can be copied into ~/.ranger/ for per-user
modifications.  Colorschemes can be placed in ~/.ranger/colorschemes.

The configuration files should be self-explanatory.  If you need more
information, check out the source code.

Also, see the file HACKING for more detailed instructions on
modifying the program.


Roadmap
-------

Short term:

* Performance improvements everywhere
* Simplification of the code

Long term:

* A plugin system
* Separate ranger into multiple programs:
  1. One daemon running in the background for slow IO operations
  2. A file launcher (ideally an already existing one)
  3. The actual program containing unseparable parts


Tips
----

Change the directory of your parent shell when you exit ranger:

ranger() {
    command ranger --fail-if-run $@ &&
    cd "$(grep \^\' 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 127next-word.subx</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.subxTest { color: #5f8700; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/main/127next-word.subx'>https://github.com/akkartik/mu/blob/main/127next-word.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="subxComment"># Tokenize by whitespace.</span>
<span id="L2" class="LineNr">  2 </span>
<span id="L3" class="LineNr">  3 </span>== code
<span id="L4" class="LineNr">  4 </span><span class="subxComment">#   instruction                     effective address                                                   register    displacement    immediate</span>
<span id="L5" class="LineNr">  5 </span><span class="subxS1Comment"># . op          subop               mod             rm32          base        index         scale       r32</span>
<span id="L6" class="LineNr">  6 </span><span class="subxS1Comment"># . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes</span>
<span id="L7" class="LineNr">  7 </span>
<span id="L8" class="LineNr">  8 </span><span class="subxComment"># (re)compute the bounds of the next word in the line (surrounded by whitespace,</span>
<span id="L9" class="LineNr">  9 </span><span class="subxComment"># treating '#' comments as a single word)</span>
<span id="L10" class="LineNr"> 10 </span><span class="subxComment"># return empty string on reaching end of file</span>
<span id="L11" class="LineNr"> 11 </span><span class="subxFunction">next-word</span>:  <span class="subxComment"># line: (addr stream byte), out: (addr slice)</span>
<span id="L12" class="LineNr"> 12 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L13" class="LineNr"> 13 </span>    55/push-ebp
<span id="L14" class="LineNr"> 14 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L15" class="LineNr"> 15 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L16" class="LineNr"> 16 </span>    50/push-eax
<span id="L17" class="LineNr"> 17 </span>    51/push-ecx
<span id="L18" class="LineNr"> 18 </span>    56/push-esi
<span id="L19" class="LineNr"> 19 </span>    57/push-edi
<span id="L20" class="LineNr"> 20 </span>    <span class="subxComment"># esi = line</span>
<span id="L21" class="LineNr"> 21 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L22" class="LineNr"> 22 </span>    <span class="subxComment"># edi = out</span>
<span id="L23" class="LineNr"> 23 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to edi</span>
<span id="L24" class="LineNr"> 24 </span>    <span class="subxComment"># skip-chars-matching-whitespace(line)</span>
<span id="L25" class="LineNr"> 25 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L26" class="LineNr"> 26 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L27" class="LineNr"> 27 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L28" class="LineNr"> 28 </span>    e8/call  <a href='124next-token.subx.html#L464'>skip-chars-matching-whitespace</a>/disp32
<span id="L29" class="LineNr"> 29 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L30" class="LineNr"> 30 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L31" class="LineNr"> 31 </span><span class="Constant">$next-word:check0</span>:
<span id="L32" class="LineNr"> 32 </span>    <span class="subxComment"># if (line-&gt;read &gt;= line-&gt;write) clear out and return</span>
<span id="L33" class="LineNr"> 33 </span>    <span class="subxS1Comment"># . eax = line-&gt;read</span>
<span id="L34" class="LineNr"> 34 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to eax</span>
<span id="L35" class="LineNr"> 35 </span>    <span class="subxS1Comment"># . if (eax &lt; line-&gt;write) goto next check</span>
<span id="L36" class="LineNr"> 36 </span>    3b/compare                      0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with *esi</span>
<span id="L37" class="LineNr"> 37 </span>    7c/jump-if-&lt;  $next-word:check-for-comment/disp8
<span id="L38" class="LineNr"> 38 </span>    <span class="subxS1Comment"># . return out</span>
<span id="L39" class="LineNr"> 39 </span>    c7          0/subop/copy        0/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># copy to *edi</span>
<span id="L40" class="LineNr"> 40 </span>    c7          0/subop/copy        1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          4/disp8         0/imm32           <span class="subxComment"># copy to *(edi+4)</span>
<span id="L41" class="LineNr"> 41 </span>    eb/jump  $next-word:end/disp8
<span id="L42" class="LineNr"> 42 </span><span class="Constant">$next-word:check-for-comment</span>:
<span id="L43" class="LineNr"> 43 </span>    <span class="subxComment"># out-&gt;start = &amp;line-&gt;data[line-&gt;read]</span>
<span id="L44" class="LineNr"> 44 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L45" class="LineNr"> 45 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+ecx+12 to eax</span>
<span id="L46" class="LineNr"> 46 </span>    89/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *edi</span>
<span id="L47" class="LineNr"> 47 </span>    <span class="subxComment"># if (line-&gt;data[line-&gt;read] == '#') out-&gt;end = &amp;line-&gt;data[line-&gt;write]), skip rest of stream and return</span>
<span id="L48" class="LineNr"> 48 </span>    <span class="subxS1Comment"># . eax = line-&gt;data[line-&gt;read]</span>
<span id="L49" class="LineNr"> 49 </span>    31/xor                          3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># clear eax</span>
<span id="L50" class="LineNr"> 50 </span>    8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/AL    0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy byte at *(esi+ecx+12) to AL</span>
<span id="L51" class="LineNr"> 51 </span>    <span class="subxS1Comment"># . compare</span>
<span id="L52" class="LineNr"> 52 </span>    3d/compare-eax-and  0x23/imm32/pound
<span id="L53" class="LineNr"> 53 </span>    75/jump-if-!=  $next-word:regular-word/disp8
<span id="L54" class="LineNr"> 54 </span><span class="Constant">$next-word:comment</span>:
<span id="L55" class="LineNr"> 55 </span>    <span class="subxS1Comment"># . out-&gt;end = &amp;line-&gt;data[line-&gt;write]</span>
<span id="L56" class="LineNr"> 56 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to eax</span>
<span id="L57" class="LineNr"> 57 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  0/index/eax  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+eax+12 to eax</span>
<span id="L58" class="LineNr"> 58 </span>    89/copy                         1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(edi+4)</span>
<span id="L59" class="LineNr"> 59 </span>    <span class="subxS1Comment"># . line-&gt;read = line-&gt;write</span>
<span id="L60" class="LineNr"> 60 </span>    8b/copy                         0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *esi to eax</span>
<span id="L61" class="LineNr"> 61 </span>    89/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(esi+4)</span>
<span id="L62" class="LineNr"> 62 </span>    <span class="subxS1Comment"># . return</span>
<span id="L63" class="LineNr"> 63 </span>    eb/jump  $next-word:end/disp8
<span id="L64" class="LineNr"> 64 </span><span class="Constant">$next-word:regular-word</span>:
<span id="L65" class="LineNr"> 65 </span>    <span class="subxComment"># otherwise skip-chars-not-matching-whitespace(line)  # including trailing newline</span>
<span id="L66" class="LineNr"> 66 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L67" class="LineNr"> 67 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L68" class="LineNr"> 68 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L69" class="LineNr"> 69 </span>    e8/call  <a href='124next-token.subx.html#L716'>skip-chars-not-matching-whitespace</a>/disp32
<span id="L70" class="LineNr"> 70 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L71" class="LineNr"> 71 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L72" class="LineNr"> 72 </span>    <span class="subxComment"># out-&gt;end = &amp;line-&gt;data[line-&gt;read]</span>
<span id="L73" class="LineNr"> 73 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L74" class="LineNr"> 74 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+ecx+12 to eax</span>
<span id="L75" class="LineNr"> 75 </span>    89/copy                         1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(edi+4)</span>
<span id="L76" class="LineNr"> 76 </span><span class="Constant">$next-word:end</span>:
<span id="L77" class="LineNr"> 77 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L78" class="LineNr"> 78 </span>    5f/pop-to-edi
<span id="L79" class="LineNr"> 79 </span>    5e/pop-to-esi
<span id="L80" class="LineNr"> 80 </span>    59/pop-to-ecx
<span id="L81" class="LineNr"> 81 </span>    58/pop-to-eax
<span id="L82" class="LineNr"> 82 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L83" class="LineNr"> 83 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L84" class="LineNr"> 84 </span>    5d/pop-to-ebp
<span id="L85" class="LineNr"> 85 </span>    c3/return
<span id="L86" class="LineNr"> 86 </span>
<span id="L87" class="LineNr"> 87 </span><span class="subxTest">test-next-word</span>:
<span id="L88" class="LineNr"> 88 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L89" class="LineNr"> 89 </span>    55/push-ebp
<span id="L90" class="LineNr"> 90 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L91" class="LineNr"> 91 </span>    <span class="subxComment"># setup</span>
<span id="L92" class="LineNr"> 92 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L93" class="LineNr"> 93 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L94" class="LineNr"> 94 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L95" class="LineNr"> 95 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L96" class="LineNr"> 96 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L97" class="LineNr"> 97 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L98" class="LineNr"> 98 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L99" class="LineNr"> 99 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L100" class="LineNr">100 </span>    68/push  0/imm32/end
<span id="L101" class="LineNr">101 </span>    68/push  0/imm32/start
<span id="L102" class="LineNr">102 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L103" class="LineNr">103 </span>    <span class="subxComment"># write(_test-stream, &quot;  ab&quot;)</span>
<span id="L104" class="LineNr">104 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L105" class="LineNr">105 </span>    68/push  <span class="Constant">&quot;  ab&quot;</span>/imm32
<span id="L106" class="LineNr">106 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L107" class="LineNr">107 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L108" class="LineNr">108 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L109" class="LineNr">109 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L110" class="LineNr">110 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L111" class="LineNr">111 </span>    <span class="subxComment"># next-word(_test-stream, slice)</span>
<span id="L112" class="LineNr">112 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L113" class="LineNr">113 </span>    51/push-ecx
<span id="L114" class="LineNr">114 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L115" class="LineNr">115 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L116" class="LineNr">116 </span>    e8/call  <a href='127next-word.subx.html#L11'>next-word</a>/disp32
<span id="L117" class="LineNr">117 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L118" class="LineNr">118 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L119" class="LineNr">119 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;start - _test-stream-&gt;data, 2, msg)</span>
<span id="L120" class="LineNr">120 </span>    <span class="subxS1Comment"># . check-ints-equal(slice-&gt;start - _test-stream, 14, msg)</span>
<span id="L121" class="LineNr">121 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L122" class="LineNr">122 </span>    68/push  <span class="Constant">&quot;F - <a href='127next-word.subx.html#L87'>test-next-word</a>: start&quot;</span>/imm32
<span id="L123" class="LineNr">123 </span>    68/push  0xe/imm32
<span id="L124" class="LineNr">124 </span>    <span class="subxS2Comment"># . . push slice-&gt;start - _test-stream</span>
<span id="L125" class="LineNr">125 </span>    8b/copy                         0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *ecx to eax</span>
<span id="L126" class="LineNr">126 </span>    81          5/subop/subtract    3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span class="subxComment"># subtract from eax</span>
<span id="L127" class="LineNr">127 </span>    50/push-eax
<span id="L128" class="LineNr">128 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L129" class="LineNr">129 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L130" class="LineNr">130 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L131" class="LineNr">131 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L132" class="LineNr">132 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;end - _test-stream-&gt;data, 4, msg)</span>
<span id="L133" class="LineNr">133 </span>    <span class="subxS1Comment"># . check-ints-equal(slice-&gt;end - _test-stream, 16, msg)</span>
<span id="L134" class="LineNr">134 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L135" class="LineNr">135 </span>    68/push  <span class="Constant">&quot;F - <a href='127next-word.subx.html#L87'>test-next-word</a>: end&quot;</span>/imm32
<span id="L136" class="LineNr">136 </span>    68/push  0x10/imm32
<span id="L137" class="LineNr">137 </span>    <span class="subxS2Comment"># . . push slice-&gt;end - _test-stream</span>
<span id="L138" class="LineNr">138 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to eax</span>
<span id="L139" class="LineNr">139 </span>    81          5/subop/subtract    3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span class="subxComment"># subtract from eax</span>
<span id="L140" class="LineNr">140 </span>    50/push-eax
<span id="L141" class="LineNr">141 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L142" class="LineNr">142 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L143" class="LineNr">143 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L144" class="LineNr">144 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L145" class="LineNr">145 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L146" class="LineNr">146 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L147" class="LineNr">147 </span>    5d/pop-to-ebp
<span id="L148" class="LineNr">148 </span>    c3/return
<span id="L149" class="LineNr">149 </span>
<span id="L150" class="LineNr">150 </span><span class="subxTest">test-next-word-returns-whole-comment</span>:
<span id="L151" class="LineNr">151 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L152" class="LineNr">152 </span>    55/push-ebp
<span id="L153" class="LineNr">153 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L154" class="LineNr">154 </span>    <span class="subxComment"># setup</span>
<span id="L155" class="LineNr">155 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L156" class="LineNr">156 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L157" class="LineNr">157 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L158" class="LineNr">158 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L159" class="LineNr">159 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L160" class="LineNr">160 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L161" class="LineNr">161 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L162" class="LineNr">162 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L163" class="LineNr">163 </span>    68/push  0/imm32/end
<span id="L164" class="LineNr">164 </span>    68/push  0/imm32/start
<span id="L165" class="LineNr">165 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L166" class="LineNr">166 </span>    <span class="subxComment"># write(_test-stream, &quot;  # a&quot;)</span>
<span id="L167" class="LineNr">167 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L168" class="LineNr">168 </span>    68/push  <span class="Constant">&quot;  # a&quot;</span>/imm32
<span id="L169" class="LineNr">169 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L170" class="LineNr">170 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L171" class="LineNr">171 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L172" class="LineNr">172 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L173" class="LineNr">173 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L174" class="LineNr">174 </span>    <span class="subxComment"># next-word(_test-stream, slice)</span>
<span id="L175" class="LineNr">175 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L176" class="LineNr">176 </span>    51/push-ecx
<span id="L177" class="LineNr">177 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L178" class="LineNr">178 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L179" class="LineNr">179 </span>    e8/call  <a href='127next-word.subx.html#L11'>next-word</a>/disp32
<span id="L180" class="LineNr">180 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L181" class="LineNr">181 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L182" class="LineNr">182 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;start - _test-stream-&gt;data, 2, msg)</span>
<span id="L183" class="LineNr">183 </span>    <span class="subxS1Comment"># . check-ints-equal(slice-&gt;start - _test-stream, 14, msg)</span>
<span id="L184" class="LineNr">184 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L185" class="LineNr">185 </span>    68/push  <span class="Constant">&quot;F - <a href='127next-word.subx.html#L150'>test-next-word-returns-whole-comment</a>: start&quot;</span>/imm32
<span id="L186" class="LineNr">186 </span>    68/push  0xe/imm32
<span id="L187" class="LineNr">187 </span>    <span class="subxS2Comment"># . . push slice-&gt;start - _test-stream</span>
<span id="L188" class="LineNr">188 </span>    8b/copy                         0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy *ecx to eax</span>
<span id="L189" class="LineNr">189 </span>    81          5/subop/subtract    3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span class="subxComment"># subtract from eax</span>
<span id="L190" class="LineNr">190 </span>    50/push-eax
<span id="L191" class="LineNr">191 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L192" class="LineNr">192 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L193" class="LineNr">193 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L194" class="LineNr">194 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L195" class="LineNr">195 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;end - _test-stream-&gt;data, 5, msg)</span>
<span id="L196" class="LineNr">196 </span>    <span class="subxS1Comment"># . check-ints-equal(slice-&gt;end - _test-stream, 17, msg)</span>
<span id="L197" class="LineNr">197 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L198" class="LineNr">198 </span>    68/push  <span class="Constant">&quot;F - <a href='127next-word.subx.html#L150'>test-next-word-returns-whole-comment</a>: end&quot;</span>/imm32
<span id="L199" class="LineNr">199 </span>    68/push  0x11/imm32
<span id="L200" class="LineNr">200 </span>    <span class="subxS2Comment"># . . push slice-&gt;end - _test-stream</span>
<span id="L201" class="LineNr">201 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to eax</span>
<span id="L202" class="LineNr">202 </span>    81          5/subop/subtract    3/mod/direct    0/rm32/eax   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span class="subxComment"># subtract from eax</span>
<span id="L203" class="LineNr">203 </span>    50/push-eax
<span id="L204" class="LineNr">204 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L205" class="LineNr">205 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L206" class="LineNr">206 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L207" class="LineNr">207 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L208" class="LineNr">208 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L209" class="LineNr">209 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L210" class="LineNr">210 </span>    5d/pop-to-ebp
<span id="L211" class="LineNr">211 </span>    c3/return
<span id="L212" class="LineNr">212 </span>
<span id="L213" class="LineNr">213 </span><span class="subxTest">test-next-word-returns-empty-string-on-eof</span>:
<span id="L214" class="LineNr">214 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L215" class="LineNr">215 </span>    55/push-ebp
<span id="L216" class="LineNr">216 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L217" class="LineNr">217 </span>    <span class="subxComment"># setup</span>
<span id="L218" class="LineNr">218 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L219" class="LineNr">219 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L220" class="LineNr">220 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L221" class="LineNr">221 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L222" class="LineNr">222 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L223" class="LineNr">223 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L224" class="LineNr">224 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L225" class="LineNr">225 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L226" class="LineNr">226 </span>    68/push  0/imm32/end
<span id="L227" class="LineNr">227 </span>    68/push  0/imm32/start
<span id="L228" class="LineNr">228 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L229" class="LineNr">229 </span>    <span class="subxComment"># write nothing to _test-stream</span>
<span id="L230" class="LineNr">230 </span>    <span class="subxComment"># next-word(_test-stream, slice)</span>
<span id="L231" class="LineNr">231 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L232" class="LineNr">232 </span>    51/push-ecx
<span id="L233" class="LineNr">233 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L234" class="LineNr">234 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L235" class="LineNr">235 </span>    e8/call  <a href='127next-word.subx.html#L11'>next-word</a>/disp32
<span id="L236" class="LineNr">236 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L237" class="LineNr">237 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L238" class="LineNr">238 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;end - slice-&gt;start, 0, msg)</span>
<span id="L239" class="LineNr">239 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L240" class="LineNr">240 </span>    68/push  <span class="Constant">&quot;F - test-next-word-returns-empty-string-on-eof&quot;</span>/imm32
<span id="L241" class="LineNr">241 </span>    68/push  0/imm32
<span id="L242" class="LineNr">242 </span>    <span class="subxS2Comment"># . . push slice-&gt;end - slice-&gt;start</span>
<span id="L243" class="LineNr">243 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to eax</span>
<span id="L244" class="LineNr">244 </span>    2b/subtract                     0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract *ecx from eax</span>
<span id="L245" class="LineNr">245 </span>    50/push-eax
<span id="L246" class="LineNr">246 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L247" class="LineNr">247 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L248" class="LineNr">248 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L249" class="LineNr">249 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L250" class="LineNr">250 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L251" class="LineNr">251 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L252" class="LineNr">252 </span>    5d/pop-to-ebp
<span id="L253" class="LineNr">253 </span>    c3/return
<span id="L254" class="LineNr">254 </span>
<span id="L255" class="LineNr">255 </span><span class="subxTest">test-next-word-returns-empty-string-on-newline</span>:
<span id="L256" class="LineNr">256 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L257" class="LineNr">257 </span>    55/push-ebp
<span id="L258" class="LineNr">258 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L259" class="LineNr">259 </span>    <span class="subxComment"># setup</span>
<span id="L260" class="LineNr">260 </span>    <span class="subxS1Comment"># . clear-stream(_test-stream)</span>
<span id="L261" class="LineNr">261 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L262" class="LineNr">262 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L263" class="LineNr">263 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L264" class="LineNr">264 </span>    e8/call  <a href='106stream.subx.html#L17'>clear-stream</a>/disp32
<span id="L265" class="LineNr">265 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L266" class="LineNr">266 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L267" class="LineNr">267 </span>    <span class="subxComment"># var slice/ecx: slice</span>
<span id="L268" class="LineNr">268 </span>    68/push  0/imm32/end
<span id="L269" class="LineNr">269 </span>    68/push  0/imm32/start
<span id="L270" class="LineNr">270 </span>    89/copy                         3/mod/direct    1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ecx</span>
<span id="L271" class="LineNr">271 </span>    <span class="subxComment"># write some whitespace and a newline</span>
<span id="L272" class="LineNr">272 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L273" class="LineNr">273 </span>    68/push  <span class="Constant">&quot;  \n&quot;</span>/imm32
<span id="L274" class="LineNr">274 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L275" class="LineNr">275 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L276" class="LineNr">276 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L277" class="LineNr">277 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L278" class="LineNr">278 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L279" class="LineNr">279 </span>    <span class="subxComment"># next-word(_test-stream, slice)</span>
<span id="L280" class="LineNr">280 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L281" class="LineNr">281 </span>    51/push-ecx
<span id="L282" class="LineNr">282 </span>    68/push  <a href='108write.subx.html#L151'>_test-stream</a>/imm32
<span id="L283" class="LineNr">283 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L284" class="LineNr">284 </span>    e8/call  <a href='127next-word.subx.html#L11'>next-word</a>/disp32
<span id="L285" class="LineNr">285 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L286" class="LineNr">286 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L287" class="LineNr">287 </span>    <span class="subxComment"># check-ints-equal(slice-&gt;end - slice-&gt;start, 0, msg)</span>
<span id="L288" class="LineNr">288 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L289" class="LineNr">289 </span>    68/push  <span class="Constant">&quot;F - test-next-word-returns-empty-string-on-newline&quot;</span>/imm32
<span id="L290" class="LineNr">290 </span>    68/push  0/imm32
<span id="L291" class="LineNr">291 </span>    <span class="subxS2Comment"># . . push slice-&gt;end - slice-&gt;start</span>
<span id="L292" class="LineNr">292 </span>    8b/copy                         1/mod/*+disp8   1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ecx+4) to eax</span>
<span id="L293" class="LineNr">293 </span>    2b/subtract                     0/mod/indirect  1/rm32/ecx   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># subtract *ecx from eax</span>
<span id="L294" class="LineNr">294 </span>    50/push-eax
<span id="L295" class="LineNr">295 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L296" class="LineNr">296 </span>    e8/call  <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32
<span id="L297" class="LineNr">297 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L298" class="LineNr">298 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0xc/imm32         <span class="subxComment"># add to esp</span>
<span id="L299" class="LineNr">299 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L300" class="LineNr">300 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L301" class="LineNr">301 </span>    5d/pop-to-ebp
<span id="L302" class="LineNr">302 </span>    c3/return
<span id="L303" class="LineNr">303 </span>
<span id="L304" class="LineNr">304 </span><span class="subxComment"># (re)compute the bounds of the next word in the line (separated by whitespace)</span>
<span id="L305" class="LineNr">305 </span><span class="subxComment"># return empty string on reaching end of file</span>
<span id="L306" class="LineNr">306 </span><span class="subxFunction">next-raw-word</span>:  <span class="subxComment"># line: (addr stream byte), out: (addr slice)</span>
<span id="L307" class="LineNr">307 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L308" class="LineNr">308 </span>    55/push-ebp
<span id="L309" class="LineNr">309 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L310" class="LineNr">310 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L311" class="LineNr">311 </span>    50/push-eax
<span id="L312" class="LineNr">312 </span>    51/push-ecx
<span id="L313" class="LineNr">313 </span>    56/push-esi
<span id="L314" class="LineNr">314 </span>    57/push-edi
<span id="L315" class="LineNr">315 </span>    <span class="subxComment"># esi = line</span>
<span id="L316" class="LineNr">316 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          6/r32/esi   8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+8) to esi</span>
<span id="L317" class="LineNr">317 </span>    <span class="subxComment"># edi = out</span>
<span id="L318" class="LineNr">318 </span>    8b/copy                         1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          7/r32/edi   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy *(ebp+12) to edi</span>
<span id="L319" class="LineNr">319 </span>    <span class="subxComment"># skip-chars-matching-whitespace(line)</span>
<span id="L320" class="LineNr">320 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L321" class="LineNr">321 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L322" class="LineNr">322 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L323" class="LineNr">323 </span>    e8/call  <a href='124next-token.subx.html#L464'>skip-chars-matching-whitespace</a>/disp32
<span id="L324" class="LineNr">324 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L325" class="LineNr">325 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L326" class="LineNr">326 </span><span class="Constant">$next-raw-word:check0</span>:
<span id="L327" class="LineNr">327 </span>    <span class="subxComment"># if (line-&gt;read &gt;= line-&gt;write) clear out and return</span>
<span id="L328" class="LineNr">328 </span>    <span class="subxS1Comment"># . eax = line-&gt;read</span>
<span id="L329" class="LineNr">329 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to eax</span>
<span id="L330" class="LineNr">330 </span>    <span class="subxS1Comment"># . if (eax &lt; line-&gt;write) goto next check</span>
<span id="L331" class="LineNr">331 </span>    3b/compare                      0/mod/indirect  6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># compare eax with *esi</span>
<span id="L332" class="LineNr">332 </span>    7c/jump-if-&lt;  $next-raw-word:word-exists/disp8
<span id="L333" class="LineNr">333 </span>    <span class="subxS1Comment"># . return out</span>
<span id="L334" class="LineNr">334 </span>    c7          0/subop/copy        0/mod/direct    7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              0/imm32           <span class="subxComment"># copy to *edi</span>
<span id="L335" class="LineNr">335 </span>    c7          0/subop/copy        1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          4/disp8         0/imm32           <span class="subxComment"># copy to *(edi+4)</span>
<span id="L336" class="LineNr">336 </span>    eb/jump  $next-raw-word:end/disp8
<span id="L337" class="LineNr">337 </span><span class="Constant">$next-raw-word:word-exists</span>:
<span id="L338" class="LineNr">338 </span>    <span class="subxComment"># out-&gt;start = &amp;line-&gt;data[line-&gt;read]</span>
<span id="L339" class="LineNr">339 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L340" class="LineNr">340 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+ecx+12 to eax</span>
<span id="L341" class="LineNr">341 </span>    89/copy                         0/mod/indirect  7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *edi</span>
<span id="L342" class="LineNr">342 </span>    <span class="subxComment"># skip-chars-not-matching-whitespace(line)  # including trailing newline</span>
<span id="L343" class="LineNr">343 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L344" class="LineNr">344 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L345" class="LineNr">345 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L346" class="LineNr">346 </span>    e8/call  <a href='124next-token.subx.html#L716'>skip-chars-not-matching-whitespace</a>/disp32
<span id="L347" class="LineNr">347 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L348" class="LineNr">348 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              4/imm32           <span class="subxComment"># add to esp</span>
<span id="L349" class="LineNr">349 </span>    <span class="subxComment"># out-&gt;end = &amp;line-&gt;data[line-&gt;read]</span>
<span id="L350" class="LineNr">350 </span>    8b/copy                         1/mod/*+disp8   6/rm32/esi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          1/r32/ecx   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy *(esi+4) to ecx</span>
<span id="L351" class="LineNr">351 </span>    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  1/index/ecx  <span class="Normal"> . </span>          0/r32/eax   0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># copy esi+ecx+12 to eax</span>
<span id="L352" class="LineNr">352 </span>    89/copy                         1/mod/*+disp8   7/rm32/edi   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          0/r32/eax   4/disp8        <span class="Normal"> . </span>                <span class="subxComment"># copy eax to *(edi+4)</span>
<span id="L353" class="LineNr">353 </span><span class="Constant">$next-raw-word:end</span>:
<span id="L354" class="LineNr">354 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L355" class="LineNr">355 </span>    5f/pop-to-edi
<span id="L356" class="LineNr">356 </span>    5e/pop-to-esi
<span id="L357" class="LineNr">357 </span>    59/pop-to-ecx
<span id="L358" class="LineNr">358 </span>    58/pop-to-eax
<span id="L359" class="LineNr">359 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L360" class="LineNr">360 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L361" class="LineNr">361 </span>    5d/pop-to-ebp
<span id="L362" class="LineNr">362 </span>    c3/return
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->