about summary refs log tree commit diff stats
path: root/074write-stream-data.subx
blob: 0cc8ba6551d1920b3fa62cc01ab97e5972bb97a6 (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
== code
#   instruction                     effective address                                                   register    displacement    immediate
# . op          subop               mod             rm32          base        index         scale       r32
# . 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

# write an entire stream's contents to a buffered-file
# ways to do this:
#   - construct a 'maximal slice' and pass it to write-slice-buffered
#   - flush the buffered-file and pass the stream directly to its fd (disabling buffering)
# we'll go with the first way for now
write-stream-data:  # f: (addr buffered-file), s: (addr stream byte)
    # . prologue
    55/push-ebp
    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
    # . save registers
    50/push-eax
    51/push-ecx
    56/push-esi
    # esi = s
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           6/r32/esi   0xc/disp8       .                 # copy *(ebp+12) to esi
    # var slice/ecx: slice = {s->data, &s->data[s->write]}
    # . push &s->data[s->write]
    8b/copy                         0/mod/indirect  6/rm32/esi    .           .             .           0/r32/eax   .               .                 # copy *esi to eax
    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    6/base/esi  0/index/eax   .           0/r32/eax   0xc/disp8       .                 # copy esi+eax+12 to eax
    50/push-eax
    # . push s->data
    8d/copy-address                 1/mod/*+disp8   6/rm32/esi    .           .             .           0/r32/eax   0xc/disp8       .                 # copy esi+12 to eax
    50/push-eax
    # . ecx = esp
    89/copy                         3/mod/direct    1/rm32/ecx    .           .             .           4/r32/esp   .               .                 # copy esp to ecx
    # write-slice-buffered(f, slice)
    # . . push args
    51/push-ecx
    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 # push *(ebp+8)
    # . . call
    e8/call  write-slice-buffered/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
$write-stream-data:end:
    # . restore locals
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # . restore registers
    5e/pop-to-esi
    59/pop-to-ecx
    58/pop-to-eax
    # . epilogue
    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
    5d/pop-to-ebp
    c3/return

test-write-stream-data:
    # . prologue
    55/push-ebp
    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
    # setup
    # . clear-stream(_test-output-stream)
    # . . push args
    68/push  _test-output-stream/imm32
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # . clear-stream($_test-output-buffered-file->buffer)
    # . . push args
    68/push  $_test-output-buffered-file->buffer/imm32
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # . clear-stream(_test-input-stream)
    # . . push args
    68/push  _test-input-stream/imm32
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # initialize input
    # . write(_test-input-stream, "abcd")
    # . . push args
    68/push  "abcd"/imm32
    68/push  _test-input-stream/imm32
    # . . call
    e8/call  write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # write-stream-data(_test-output-buffered-file, _test-input-stream)
    # . . push args
    68/push  _test-input-stream/imm32
    68/push  _test-output-buffered-file/imm32
    # . . call
    e8/call  write-stream-data/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # check that the write happened as expected
    # . flush(_test-output-buffered-file)
    # . . push args
    68/push  _test-output-buffered-file/imm32
    # . . call
    e8/call  flush/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # . check-stream-equal(_test-output-stream, "abcd", msg)
    # . . push args
    68/push  "F - test-write-stream-data"/imm32
    68/push  "abcd"/imm32
    68/push  _test-output-stream/imm32
    # . . call
    e8/call  check-stream-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # . epilogue
    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
    5d/pop-to-ebp
    c3/return
?h=v0.3.0&id=920306cbcad3df05e01699cd19f3767e069ab139'>920306c ^
29c35a3 ^
920306c ^
61d34d4 ^


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




                                                                                              
                                                            
                                                     
                                           


                      





                        





                                                            
                   


                        
                          

                                    

                                          
                                   


                            



                                                                                                                 
                                                                                                              





                                                                                                                                      
                                                                            



                                                                                         
                                                                                         









                                                                                                     
                                                                                                                     

                                                   
                                                                                               


                                                                                                     
                                                               
                                                                                                     







                                                                                                                                                                                    
          
                   
                                                                         
          


        
<!DOCTYPE PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/1/DTD/1-strict.dtd">
<html xmlns="http://www.w3.org/1999/" lang="en" xml:lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta name="application-name" content="getwtxt {{.Vers}}">
  <link rel="stylesheet" type="text/css" href="/css">
  <title>{{.Name}} - twtxt Registry</title>
</head>
<body>
  <div id="container">
    <div id="head">
      <h2>{{.Name}}</h2>
    </div>
    <div id="subhead">
      twtxt registry
    </div>
    <div id="info">
      Instance Owner:<br />
      <span style="padding-left:1em">{{.Owner}}</span><br />
      Mail:<br />
      <span style="padding-left:1em">{{.Mail}}</span><br />
    </div>
    <div id="body">
      <div id="desc">
        <p>{{.Desc}}</p>
      </div>
      <p>API base URL:</p>
        <pre><code>/api</code></pre>
      <p>Formats available:</p>
        <pre><code>/api/plain</code></pre>
      <p>Endpoints:</p>
        <pre><code>/api/plain/users
/api/plain/mentions
/api/plain/tweets
/api/plain/tags</code></pre>
        <p>Add new user by submitting a <code>POST</code> request to the <code>/api/plain/users</code> endpoint. 
        If both <code>?url=X</code> and <code>?nickname=X</code> are not passed, or the user already exists in 
        this registry, you will receive <code>400 Bad Request</code> as a response. If you are unsure what went
        wrong, the error message should provide enough information for you to correct the request.</p>
        <pre><code>$ curl -X POST '{{.URL}}/api/plain/users?url=https://foo.ext/twtxt.txt&amp;nickname=foobar'
200 OK</code></pre>
      <p>Query responses are in descending chronological order. This means the newest user or tweet will be in the
      first row of the response, with older users or tweets in subsequent rows. Additionally, All queries accept <code>?page=N</code> 
      as a parameter, returning groups of 20 results. This may be omitted for the first page of results.</p>
      <p>Get all users:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/users'
foo               https://example.com/twtxt.txt     2019-05-09T08:42:23.000Z
foobar            https://example2.com/twtxt.txt    2019-04-14T19:23:00.000Z
foo_barrington    https://example3.com/twtxt.txt    2019-03-01T15:59:39.000Z</code></pre>
      <p>Query for user by URL:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/users?url=https://example3.com/twtxt.txt'
foo_barrington    https://example3.com/twtxt.txt    2019-05-01T15:59:39.000Z</code></pre>
      <p>Query for user by keyword:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/users?q=bar'
foobar            https://example2.com/twtxt.txt    2019-05-14T19:23:00.000Z
foo_barrington    https://example3.com/twtxt.txt    2019-04-01T15:59:39.000Z</code></pre>
      <p>Get all tweets:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/tweets'
foobar    https://example2.com/twtxt.txt    2019-05-13T12:46:20.000Z    It's been a busy day at work!
...</code></pre>
      <p>Query tweets by keyword:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/tweets?q=getwtxt'
foo_barrington    https://example3.com/twtxt.txt    2019-04-30T06:00:09.000Z    I just installed getwtxt</code></pre>
      <p>Get all tweets with tags:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/tags'
foo    https://example.com/twtxt.txt    2019-03-01T09:33:12.000Z    No, seriously, I need #help
foo    https://example.com/twtxt.txt    2019-03-01T09:32:05.000Z    Seriously, I love #programming!
foo    https://example.com/twtxt.txt    2019-03-01T09:31:02.000Z    I love #programming!</code></pre>
      <p>Query tweets by tag:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/tags/programming'
foo    https://example.com/twtxt.txt    2019-03-01T09:31:02.000Z    I love #programming!</code></pre>
      <p>Get all tweets with mentions:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/mentions'
foo               https://example.com/twtxt.txt     2019-02-28T11:06:44.000Z    @&lt;foo_barrington https://example3.com/twtxt.txt&gt; Hey!! Are you still working on that project?
bar               https://mxmmplm.com/twtxt.txt     2019-02-27T11:06:44.000Z    @&lt;foobar https://example2.com/twtxt.txt&gt; How's your day going, bud?
foo_barrington    https://example3.com/twtxt.txt    2019-02-26T11:06:44.000Z    @&lt;foo https://example.com/twtxt.txt&gt; Did you eat my lunch?</code></pre>
      <p>Query tweets by mention URL:</p>
        <pre><code>$ curl '{{.URL}}/api/plain/mentions?url=https://foobarrington.co.uk/twtxt.txt'
foo    https://example.com/twtxt.txt    2019-02-26T11:06:44.000Z    @&lt;foo_barrington https://example3.com/twtxt.txt&gt; Hey!! Are you still working on that project?</code></pre>
    </div>
    <div id="foot">
      powered by <a href="https://github.com/getwtxt/getwtxt">getwtxt</a>
    </div>
  </div>
</body>
</html>