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->read >= line->write) clear out and return</span>
<span id="L33" class="LineNr"> 33 </span> <span class="subxS1Comment"># . eax = line->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 < line->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-< $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->start = &line->data[line->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->data[line->read] == '#') out->end = &line->data[line->write]), skip rest of stream and return</span>
<span id="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . eax = line->data[line->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->end = &line->data[line->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->read = line->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->end = &line->data[line->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, " ab")</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">" ab"</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->start - _test-stream->data, 2, msg)</span>
<span id="L120" class="LineNr">120 </span> <span class="subxS1Comment"># . check-ints-equal(slice->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">"F - <a href='127next-word.subx.html#L87'>test-next-word</a>: start"</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->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->end - _test-stream->data, 4, msg)</span>
<span id="L133" class="LineNr">133 </span> <span class="subxS1Comment"># . check-ints-equal(slice->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">"F - <a href='127next-word.subx.html#L87'>test-next-word</a>: end"</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->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, " # a")</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">" # a"</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->start - _test-stream->data, 2, msg)</span>
<span id="L183" class="LineNr">183 </span> <span class="subxS1Comment"># . check-ints-equal(slice->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">"F - <a href='127next-word.subx.html#L150'>test-next-word-returns-whole-comment</a>: start"</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->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->end - _test-stream->data, 5, msg)</span>
<span id="L196" class="LineNr">196 </span> <span class="subxS1Comment"># . check-ints-equal(slice->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">"F - <a href='127next-word.subx.html#L150'>test-next-word-returns-whole-comment</a>: end"</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->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->end - slice->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">"F - test-next-word-returns-empty-string-on-eof"</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->end - slice->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">" \n"</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->end - slice->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">"F - test-next-word-returns-empty-string-on-newline"</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->end - slice->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->read >= line->write) clear out and return</span>
<span id="L328" class="LineNr">328 </span> <span class="subxS1Comment"># . eax = line->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 < line->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-< $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->start = &line->data[line->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->end = &line->data[line->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 : -->