about summary refs log tree commit diff stats
path: root/manifesto.html
blob: abf5635cd1307ded6408067b8002131504443c2b (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
<!DOCTYPE html>
<html dir="ltr" lang="en">
    <head>
        <meta charset='utf-8'>
        <title>c9 Manifesto</title>
    </head>
    <body>

        <a href="index.html">Documentation Index</a>

        <h1>c9 Manifesto</h1>

        <p>There is no c9 manifesto but a collection of manifestos found on the
        Internet that share same vision. </p>

        <h2>Making The Network Work</h2>

        <p>From
        <a href="http://www.sterneck.net/cyber/online-communities/index.php">Sternececk.net</a>;</p>

         <pre>
         Every citizen, regardless of their economic circumstances,
         should be able to share the benefits of the Information Age -
         including better communications, greater participation,
         electronic life long learning, and e-commerce.
         To achieve this they should have access to local community
         technology centres, plus public online forums and services
         to create an online community. The centres will provide
         technical support and help 'on the ground', the forums will
         be 'virtual spaces' for online communities related to localities.
         </pre>

        <h2>Guerilla Open Access Manifesto</h2>

        <pre>
        Information is power. But like all power, there are those who want to keep it for
        themselves. The world's entire scientific and cultural heritage, published over centuries
        in books and journals, is increasingly being digitized and locked up by a handful of
        private corporations. Want to read the papers featuring the most famous results of the
        sciences? You'll need to send enormous amounts to publishers like Reed Elsevier.

        There are those struggling to change this. The Open Access Movement has fought
        valiantly to ensure that scientists do not sign their copyrights away but instead ensure
        their work is published on the Internet, under terms that allow anyone to access it. But
        even under the best scenarios, their work will only apply to things published in the future.
        Everything up until now will have been lost.

        That is too high a price to pay. Forcing academics to pay money to read the work of their
        colleagues? Scanning entire libraries but only allowing the folks at Google to read them?
        Providing scientific articles to those at elite universities in the First World, but not to
        children in the Global South? It's outrageous and unacceptable.

        "I agree," many say, "but what can we do? The companies hold the copyrights, they
        make enormous amounts of money by charging for access, and it's perfectly legal -
        there's nothing we can do to stop them." But there is something we can, something that's
        already being done: we can fight back.

        Those with access to these resources - students, librarians, scientists  - you have been
        given a privilege. You get to feed at this banquet of knowledge while the rest of the world
        is locked out. But you need not - indeed, morally, you cannot keep this privilege for
        yourselves. You have a duty to share it with the world. And you have: trading passwords
        with colleagues, filling download requests for friends.



        Meanwhile, those who have been locked out are not standing idly by. You have been
        sneaking through holes and climbing over fences, liberating the information locked up by
        the publishers and sharing them with your friends.

        But all of this action goes on in the dark, hidden underground. It's called stealing or
        piracy, as if sharing a wealth of knowledge were the moral equivalent of plundering a
        ship and murdering its crew. But sharing isn't immoral - it's a moral imperative. Only
        those blinded by greed would refuse to let a friend make a copy.

        Large corporations, of course, are blinded by greed. The laws under which they operate
        require it - their shareholders would revolt at anything less. And the politicians they
        have bought off back them, passing laws giving them the exclusive power to decide who
        can make copies.

        There is no justice in following unjust laws. It's time to come into the light and, in the
        grand tradition of civil disobedience, declare our opposition to this private theft of public
        culture.

        We need to take information, wherever it is stored, make our copies and share them with
        the world. We need to take stuff that's out of copyright and add it to the archive. We need
        to buy secret databases and put them on the Web. We need to download scientific
        journals and upload them to file sharing networks. We need to fight for Guerilla Open
        Access.

        With enough of us, around the world, we'll not just send a strong message opposing the
        privatization of knowledge - we'll make it a thing of the past. Will you join us?

        Aaron Swartz

        July 2008, Eremo, Italy
        </pre>

        <a href="index.html">Documentation Index</a>
        <p>This is part of the c9 Manual.
        Copyright (C) 2016
        c9 team.
        See the file <a href="fdl-1.3-standalone.html">Gnu Free Documentation License</a>
        for copying conditions.</p>
    </body>
</html>
content="number_lines,use_css,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback"> <meta name="colorscheme" content="minimal-light"> <style> <!-- pre { font-family: monospace; color: #000000; background-color: #ffffd7; } body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; } a { color:inherit; } * { font-size:12pt; font-size: 1em; } .subxComment { color: #005faf; } .subxS2Comment { color: #8a8a8a; } .LineNr { } .subxFunction { color: #af5f00; text-decoration: underline; } .subxS1Comment { color: #0000af; } .Constant { color: #008787; } .SpecialChar { color: #d70000; } .Normal { color: #000000; background-color: #ffffd7; padding-bottom: 1px; } .subxTest { color: #5f8700; } .subxH1Comment { color: #005faf; text-decoration: underline; } --> </style> <script> <!-- /* 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/linux/116write-buffered.subx'>https://github.com/akkartik/mu/blob/main/linux/116write-buffered.subx</a> <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="subxComment"># write-buffered: like 'write', but for a buffered-file</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="subxFunction">write-buffered</span>: <span class="subxComment"># f: (addr buffered-file), msg: (addr array byte)</span> <span id="L9" class="LineNr"> 9 </span> <span class="subxComment"># pseudocode:</span> <span id="L10" class="LineNr"> 10 </span> <span class="subxComment"># in = msg-&gt;data</span> <span id="L11" class="LineNr"> 11 </span> <span class="subxComment"># inend = &amp;msg-&gt;data[msg-&gt;size]</span> <span id="L12" class="LineNr"> 12 </span> <span class="subxComment"># while (in &lt; inend)</span> <span id="L13" class="LineNr"> 13 </span> <span class="subxComment"># if f-&gt;write &gt;= f-&gt;size</span> <span id="L14" class="LineNr"> 14 </span> <span class="subxComment"># flush(f)</span> <span id="L15" class="LineNr"> 15 </span> <span class="subxComment"># clear-stream(f)</span> <span id="L16" class="LineNr"> 16 </span> <span class="subxComment"># c = *in</span> <span id="L17" class="LineNr"> 17 </span> <span class="subxComment"># f-&gt;data[f-&gt;write] = c</span> <span id="L18" class="LineNr"> 18 </span> <span class="subxComment"># ++f-&gt;write</span> <span id="L19" class="LineNr"> 19 </span> <span class="subxComment"># ++in</span> <span id="L20" class="LineNr"> 20 </span> <span class="subxComment">#</span> <span id="L21" class="LineNr"> 21 </span> <span class="subxComment"># registers:</span> <span id="L22" class="LineNr"> 22 </span> <span class="subxComment"># in: esi</span> <span id="L23" class="LineNr"> 23 </span> <span class="subxComment"># inend: ecx</span> <span id="L24" class="LineNr"> 24 </span> <span class="subxComment"># f: edi</span> <span id="L25" class="LineNr"> 25 </span> <span class="subxComment"># f-&gt;size: edx</span> <span id="L26" class="LineNr"> 26 </span> <span class="subxComment"># f-&gt;write: ebx (cached; need to keep in sync)</span> <span id="L27" class="LineNr"> 27 </span> <span class="subxComment"># c: eax</span> <span id="L28" class="LineNr"> 28 </span> <span class="subxComment">#</span> <span id="L29" class="LineNr"> 29 </span> <span class="subxS1Comment"># . prologue</span> <span id="L30" class="LineNr"> 30 </span> 55/push-ebp <span id="L31" class="LineNr"> 31 </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="L32" class="LineNr"> 32 </span> <span class="subxS1Comment"># . save registers</span> <span id="L33" class="LineNr"> 33 </span> 50/push-eax <span id="L34" class="LineNr"> 34 </span> 51/push-ecx <span id="L35" class="LineNr"> 35 </span> 52/push-edx <span id="L36" class="LineNr"> 36 </span> 53/push-ebx <span id="L37" class="LineNr"> 37 </span> 56/push-esi <span id="L38" class="LineNr"> 38 </span> 57/push-edi <span id="L39" class="LineNr"> 39 </span> <span class="subxComment"># eax = msg</span> <span id="L40" class="LineNr"> 40 </span> 8b/copy 1/mod/*+disp8 5/rm32/ebp <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/eax 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ebp+12) to eax</span> <span id="L41" class="LineNr"> 41 </span> <span class="subxComment"># var in/esi: (addr byte) = msg-&gt;data</span> <span id="L42" class="LineNr"> 42 </span> 8d/copy-address 1/mod/*+disp8 0/rm32/eax <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 6/r32/esi 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy eax+4 to esi</span> <span id="L43" class="LineNr"> 43 </span> <span class="subxComment"># var inend/ecx: (addr byte) = &amp;msg-&gt;data[msg-&gt;size]</span> <span id="L44" class="LineNr"> 44 </span> 8b/copy 0/mod/indirect 0/rm32/eax <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ecx <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy *eax to ecx</span> <span id="L45" class="LineNr"> 45 </span> 8d/copy-address 0/mod/indirect 4/rm32/sib 6/base/esi 1/index/ecx <span class="Normal"> . </span> 1/r32/ecx <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy esi+ecx to ecx</span> <span id="L46" class="LineNr"> 46 </span> <span class="subxComment"># edi = f</span> <span id="L47" class="LineNr"> 47 </span> 8b/copy 1/mod/*+disp8 5/rm32/ebp <span class="Normal"> . </span> <span class="Normal"> . </span> 7/r32/edi 8/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(ebp+8) to edi</span> <span id="L48" class="LineNr"> 48 </span> <span class="subxComment"># edx = f-&gt;size</span> <span id="L49" class="LineNr"> 49 </span> 8b/copy 1/mod/*+disp8 7/rm32/edi <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/edx 0xc/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(edi+12) to edx</span> <span id="L50" class="LineNr"> 50 </span> <span class="subxComment"># ebx = f-&gt;write</span> <span id="L51" class="LineNr"> 51 </span> 8b/copy 1/mod/*+disp8 7/rm32/edi <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/ebx 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy *(edi+4) to ebx</span> <span id="L52" class="LineNr"> 52 </span><span class="Constant">$write-buffered:loop</span>: <span id="L53" class="LineNr"> 53 </span> <span class="subxComment"># if (in &gt;= inend) break</span> <span id="L54" class="LineNr"> 54 </span> 39/compare 3/mod/direct 6/rm32/esi <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 1/r32/ecx <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare esi with ecx</span> <span id="L55" class="LineNr"> 55 </span> 73/jump-if-addr&gt;= $write-buffered:loop-end/disp8 <span id="L56" class="LineNr"> 56 </span> <span class="subxComment"># if (f-&gt;write &gt;= f-&gt;size) flush and clear f's stream</span> <span id="L57" class="LineNr"> 57 </span> 39/compare 3/mod/direct 3/rm32/ebx <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 2/r32/edx <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># compare ebx with edx</span> <span id="L58" class="LineNr"> 58 </span> 7c/jump-if-&lt; $write-buffered:to-stream/disp8 <span id="L59" class="LineNr"> 59 </span> <span class="subxS1Comment"># . persist f-&gt;write</span> <span id="L60" class="LineNr"> 60 </span> 89/copy 1/mod/*+disp8 7/rm32/edi <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/ebx 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ebx to *(edi+4)</span> <span id="L61" class="LineNr"> 61 </span> <span class="subxS1Comment"># . flush(f)</span> <span id="L62" class="LineNr"> 62 </span> <span class="subxS2Comment"># . . push args</span> <span id="L63" class="LineNr"> 63 </span> 57/push-edi <span id="L64" class="LineNr"> 64 </span> <span class="subxS2Comment"># . . call</span> <span id="L65" class="LineNr"> 65 </span> e8/call <a href='115write-byte.subx.html#L81'>flush</a>/disp32 <span id="L66" class="LineNr"> 66 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L67" class="LineNr"> 67 </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="L68" class="LineNr"> 68 </span> <span class="subxS1Comment"># . clear-stream(stream = f+4)</span> <span id="L69" class="LineNr"> 69 </span> <span class="subxS2Comment"># . . push args</span> <span id="L70" class="LineNr"> 70 </span> 8d/copy-address 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 edi+4 to eax</span> <span id="L71" class="LineNr"> 71 </span> 50/push-eax <span id="L72" class="LineNr"> 72 </span> <span class="subxS2Comment"># . . call</span> <span id="L73" class="LineNr"> 73 </span> e8/call <a href='106stream.subx.html#L17'>clear-stream</a>/disp32 <span id="L74" class="LineNr"> 74 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L75" class="LineNr"> 75 </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="L76" class="LineNr"> 76 </span> <span class="subxS1Comment"># . f-&gt;write must now be 0; update its cache at ebx</span> <span id="L77" class="LineNr"> 77 </span> 31/xor 3/mod/direct 3/rm32/ebx <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/ebx <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># clear ebx</span> <span id="L78" class="LineNr"> 78 </span><span class="Constant">$write-buffered:to-stream</span>: <span id="L79" class="LineNr"> 79 </span> <span class="subxComment"># write to stream</span> <span id="L80" class="LineNr"> 80 </span> <span class="subxComment"># f-&gt;data[f-&gt;write] = *in</span> <span id="L81" class="LineNr"> 81 </span> <span class="subxS1Comment"># . AL = *in</span> <span id="L82" class="LineNr"> 82 </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="L83" class="LineNr"> 83 </span> 8a/copy-byte 0/mod/indirect 6/rm32/esi <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 0/r32/AL <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># copy byte at *esi to AL</span> <span id="L84" class="LineNr"> 84 </span> <span class="subxS1Comment"># . f-&gt;data[f-&gt;write] = AL</span> <span id="L85" class="LineNr"> 85 </span> 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/edi 3/index/ebx <span class="Normal"> . </span> 0/r32/AL 0x10/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy AL to *(edi+ebx+16)</span> <span id="L86" class="LineNr"> 86 </span> <span class="subxComment"># ++f-&gt;write</span> <span id="L87" class="LineNr"> 87 </span> 43/increment-ebx <span id="L88" class="LineNr"> 88 </span> <span class="subxComment"># ++in</span> <span id="L89" class="LineNr"> 89 </span> 46/increment-esi <span id="L90" class="LineNr"> 90 </span> eb/jump $write-buffered:<span class="Constant">loop</span>/disp8 <span id="L91" class="LineNr"> 91 </span><span class="Constant">$write-buffered:loop-end</span>: <span id="L92" class="LineNr"> 92 </span> <span class="subxComment"># persist necessary variables from registers</span> <span id="L93" class="LineNr"> 93 </span> 89/copy 1/mod/*+disp8 7/rm32/edi <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 3/r32/ebx 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># copy ebx to *(edi+4)</span> <span id="L94" class="LineNr"> 94 </span><span class="Constant">$write-buffered:end</span>: <span id="L95" class="LineNr"> 95 </span> <span class="subxS1Comment"># . restore registers</span> <span id="L96" class="LineNr"> 96 </span> 5f/pop-to-edi <span id="L97" class="LineNr"> 97 </span> 5e/pop-to-esi <span id="L98" class="LineNr"> 98 </span> 5b/pop-to-ebx <span id="L99" class="LineNr"> 99 </span> 5a/pop-to-edx <span id="L100" class="LineNr">100 </span> 59/pop-to-ecx <span id="L101" class="LineNr">101 </span> 58/pop-to-eax <span id="L102" class="LineNr">102 </span> <span class="subxS1Comment"># . epilogue</span> <span id="L103" class="LineNr">103 </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="L104" class="LineNr">104 </span> 5d/pop-to-ebp <span id="L105" class="LineNr">105 </span> c3/return <span id="L106" class="LineNr">106 </span> <span id="L107" class="LineNr">107 </span><span class="subxTest">test-write-buffered</span>: <span id="L108" class="LineNr">108 </span> <span class="subxH1Comment"># - check that write-buffered writes to the file</span> <span id="L109" class="LineNr">109 </span> <span class="subxComment"># setup</span> <span id="L110" class="LineNr">110 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span> <span id="L111" class="LineNr">111 </span> <span class="subxS2Comment"># . . push args</span> <span id="L112" class="LineNr">112 </span> 68/push <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span id="L113" class="LineNr">113 </span> <span class="subxS2Comment"># . . call</span> <span id="L114" class="LineNr">114 </span> e8/call <a href='106stream.subx.html#L17'>clear-stream</a>/disp32 <span id="L115" class="LineNr">115 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L116" class="LineNr">116 </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="L117" class="LineNr">117 </span> <span class="subxS1Comment"># . clear-stream($_test-buffered-file-&gt;buffer)</span> <span id="L118" class="LineNr">118 </span> <span class="subxS2Comment"># . . push args</span> <span id="L119" class="LineNr">119 </span> 68/push $_test-buffered-file-&gt;buffer/imm32 <span id="L120" class="LineNr">120 </span> <span class="subxS2Comment"># . . call</span> <span id="L121" class="LineNr">121 </span> e8/call <a href='106stream.subx.html#L17'>clear-stream</a>/disp32 <span id="L122" class="LineNr">122 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L123" class="LineNr">123 </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="L124" class="LineNr">124 </span> <span class="subxComment"># write-buffered(_test-buffered-file, &quot;Abc&quot;)</span> <span id="L125" class="LineNr">125 </span> <span class="subxS2Comment"># . . push args</span> <span id="L126" class="LineNr">126 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32 <span id="L127" class="LineNr">127 </span> 68/push <a href='112read-byte.subx.html#L318'>_test-buffered-file</a>/imm32 <span id="L128" class="LineNr">128 </span> <span class="subxS2Comment"># . . call</span> <span id="L129" class="LineNr">129 </span> e8/call <a href='116write-buffered.subx.html#L8'>write-buffered</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> 8/imm32 <span class="subxComment"># add to esp</span> <span id="L132" class="LineNr">132 </span> <span class="subxComment"># flush(_test-buffered-file)</span> <span id="L133" class="LineNr">133 </span> <span class="subxS2Comment"># . . push args</span> <span id="L134" class="LineNr">134 </span> 68/push <a href='112read-byte.subx.html#L318'>_test-buffered-file</a>/imm32 <span id="L135" class="LineNr">135 </span> <span class="subxS2Comment"># . . call</span> <span id="L136" class="LineNr">136 </span> e8/call <a href='115write-byte.subx.html#L81'>flush</a>/disp32 <span id="L137" class="LineNr">137 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L138" class="LineNr">138 </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="L139" class="LineNr">139 </span> <span class="subxComment"># check-stream-equal(_test-stream, &quot;Abc&quot;, msg)</span> <span id="L140" class="LineNr">140 </span> <span class="subxS2Comment"># . . push args</span> <span id="L141" class="LineNr">141 </span> 68/push <span class="Constant">&quot;F - test-write-buffered-single&quot;</span>/imm32 <span id="L142" class="LineNr">142 </span> 68/push <span class="Constant">&quot;Abc&quot;</span>/imm32 <span id="L143" class="LineNr">143 </span> 68/push <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span id="L144" class="LineNr">144 </span> <span class="subxS2Comment"># . . call</span> <span id="L145" class="LineNr">145 </span> e8/call <a href='109stream-equal.subx.html#L194'>check-stream-equal</a>/disp32 <span id="L146" class="LineNr">146 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L147" class="LineNr">147 </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="L148" class="LineNr">148 </span> <span class="subxS1Comment"># . end</span> <span id="L149" class="LineNr">149 </span> c3/return <span id="L150" class="LineNr">150 </span> <span id="L151" class="LineNr">151 </span><span class="subxTest">test-write-buffered-with-intermediate-flush</span>: <span id="L152" class="LineNr">152 </span> <span class="subxH1Comment"># - check that write-buffered flushes in the middle if its buffer fills up</span> <span id="L153" class="LineNr">153 </span> <span class="subxComment"># setup</span> <span id="L154" class="LineNr">154 </span> <span class="subxS1Comment"># . clear-stream(_test-stream)</span> <span id="L155" class="LineNr">155 </span> <span class="subxS2Comment"># . . push args</span> <span id="L156" class="LineNr">156 </span> 68/push <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span id="L157" class="LineNr">157 </span> <span class="subxS2Comment"># . . call</span> <span id="L158" class="LineNr">158 </span> e8/call <a href='106stream.subx.html#L17'>clear-stream</a>/disp32 <span id="L159" class="LineNr">159 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L160" class="LineNr">160 </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="L161" class="LineNr">161 </span> <span class="subxS1Comment"># . clear-stream($_test-buffered-file-&gt;buffer)</span> <span id="L162" class="LineNr">162 </span> <span class="subxS2Comment"># . . push args</span> <span id="L163" class="LineNr">163 </span> 68/push $_test-buffered-file-&gt;buffer/imm32 <span id="L164" class="LineNr">164 </span> <span class="subxS2Comment"># . . call</span> <span id="L165" class="LineNr">165 </span> e8/call <a href='106stream.subx.html#L17'>clear-stream</a>/disp32 <span id="L166" class="LineNr">166 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L167" class="LineNr">167 </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="L168" class="LineNr">168 </span> <span class="subxComment"># _test-stream can hold 8 bytes, but _test-buffered-file can hold only 6.</span> <span id="L169" class="LineNr">169 </span> <span class="subxComment"># Try to write 7 bytes.</span> <span id="L170" class="LineNr">170 </span> <span class="subxS1Comment"># . write-buffered(_test-buffered-file, &quot;Abcdefg&quot;)</span> <span id="L171" class="LineNr">171 </span> <span class="subxS2Comment"># . . push args</span> <span id="L172" class="LineNr">172 </span> 68/push <span class="Constant">&quot;Abcdefg&quot;</span>/imm32 <span id="L173" class="LineNr">173 </span> 68/push <a href='112read-byte.subx.html#L318'>_test-buffered-file</a>/imm32 <span id="L174" class="LineNr">174 </span> <span class="subxS2Comment"># . . call</span> <span id="L175" class="LineNr">175 </span> e8/call <a href='116write-buffered.subx.html#L8'>write-buffered</a>/disp32 <span id="L176" class="LineNr">176 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L177" class="LineNr">177 </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="L178" class="LineNr">178 </span> <span class="subxComment"># don't flush</span> <span id="L179" class="LineNr">179 </span> <span class="subxComment"># 6 bytes should still have gotten to _test-stream</span> <span id="L180" class="LineNr">180 </span> <span class="subxS1Comment"># . check-ints-equal(*_test-stream-&gt;write, 6, msg)</span> <span id="L181" class="LineNr">181 </span> <span class="subxS2Comment"># . . push args</span> <span id="L182" class="LineNr">182 </span> 68/push <span class="Constant">&quot;F - <a href='116write-buffered.subx.html#L151'>test-write-buffered-with-intermediate-flush</a>: flushed data&quot;</span>/imm32 <span id="L183" class="LineNr">183 </span> 68/push 6/imm32 <span id="L184" class="LineNr">184 </span> <span class="subxS2Comment"># . . push *_test-stream-&gt;write</span> <span id="L185" class="LineNr">185 </span> b8/copy-to-eax <a href='108write.subx.html#L151'>_test-stream</a>/imm32 <span id="L186" class="LineNr">186 </span> ff 6/subop/push 0/mod/indirect 0/rm32/eax <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="subxComment"># push *eax</span> <span id="L187" class="LineNr">187 </span> <span class="subxS2Comment"># . . call</span> <span id="L188" class="LineNr">188 </span> e8/call <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32 <span id="L189" class="LineNr">189 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L190" class="LineNr">190 </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="L191" class="LineNr">191 </span> <span class="subxComment"># and 1 byte should still be in _test-buffered-file</span> <span id="L192" class="LineNr">192 </span> <span class="subxS1Comment"># . check-ints-equal(*_test-buffered-file-&gt;write, 1, msg)</span> <span id="L193" class="LineNr">193 </span> <span class="subxS2Comment"># . . push args</span> <span id="L194" class="LineNr">194 </span> 68/push <span class="Constant">&quot;F - <a href='116write-buffered.subx.html#L151'>test-write-buffered-with-intermediate-flush</a>: unflushed bytes&quot;</span>/imm32 <span id="L195" class="LineNr">195 </span> 68/push 1/imm32 <span id="L196" class="LineNr">196 </span> <span class="subxS2Comment"># . . push *_test-buffered-file-&gt;write</span> <span id="L197" class="LineNr">197 </span> b8/copy-to-eax <a href='112read-byte.subx.html#L318'>_test-buffered-file</a>/imm32 <span id="L198" class="LineNr">198 </span> ff 6/subop/push 1/mod/*+disp8 0/rm32/eax <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> <span class="Normal"> . </span> 4/disp8 <span class="Normal"> . </span> <span class="subxComment"># push *(eax+4)</span> <span id="L199" class="LineNr">199 </span> <span class="subxS2Comment"># . . call</span> <span id="L200" class="LineNr">200 </span> e8/call <a href='102test.subx.html#L23'>check-ints-equal</a>/disp32 <span id="L201" class="LineNr">201 </span> <span class="subxS2Comment"># . . discard args</span> <span id="L202" class="LineNr">202 </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="L203" class="LineNr">203 </span> <span class="subxS1Comment"># . end</span> <span id="L204" class="LineNr">204 </span> c3/return <span id="L205" class="LineNr">205 </span> <span id="L206" class="LineNr">206 </span>== data <span id="L207" class="LineNr">207 </span> <span id="L208" class="LineNr">208 </span><span class="subxComment"># The buffered file for standard error.</span> <span id="L209" class="LineNr">209 </span><span class="SpecialChar">Stderr</span>: <span class="subxComment"># buffered-file</span> <span id="L210" class="LineNr">210 </span> <span class="subxComment"># file descriptor or (addr stream byte)</span> <span id="L211" class="LineNr">211 </span> 2/imm32 <span class="subxComment"># standard error</span> <span id="L212" class="LineNr">212 </span><span class="Constant">$Stderr-&gt;buffer</span>: <span id="L213" class="LineNr">213 </span> <span class="subxComment"># inlined fields for a stream</span> <span id="L214" class="LineNr">214 </span> <span class="subxComment"># current write index</span> <span id="L215" class="LineNr">215 </span> 0/imm32 <span id="L216" class="LineNr">216 </span> <span class="subxComment"># current read index</span> <span id="L217" class="LineNr">217 </span> 0/imm32 <span id="L218" class="LineNr">218 </span> <span class="subxComment"># size</span> <span id="L219" class="LineNr">219 </span> 8/imm32 <span id="L220" class="LineNr">220 </span> <span class="subxComment"># data</span> <span id="L221" class="LineNr">221 </span> 00 00 00 00 00 00 00 00 <span class="subxComment"># 8 bytes</span> <span id="L222" class="LineNr">222 </span> <span id="L223" class="LineNr">223 </span><span class="subxComment"># TODO: 8 bytes is too small. We'll need to grow the buffer for efficiency. But</span> <span id="L224" class="LineNr">224 </span><span class="subxComment"># I don't want to type in 1024 bytes here.</span> <span id="L225" class="LineNr">225 </span> <span id="L226" class="LineNr">226 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->