about summary refs log tree commit diff stats
path: root/doc
Commit message (Expand)AuthorAgeFilesLines
* Add pinned tabsJeffas2020-03-091-0/+5
* Correct the khard example so that it works with aercPeter Lamby2020-03-091-1/+1
* Add move-tab commandJeffas2020-03-031-0/+4
* Document smtp-starttlsPeter Lamby2020-03-021-0/+4
* note in aerc-templates.7.scd for toLocal functionsqwishy2020-02-251-0/+7
* Fix typo in message view sectionErazem Kokot2020-02-121-1/+1
* Contextual UI ConfigurationSrivathsan Murali2020-01-241-0/+40
* Fix handling of multiple template-dirsBen Burwell2020-01-241-1/+3
* msgview/save: Adapt to already decoded readerReto Brunner2020-01-201-4/+9
* Add docs for reply -TBen Burwell2020-01-111-1/+3
* template: man cosmetic changesLeszek Cimała2020-01-091-1/+2
* template: add exec and wrapLeszek Cimała2020-01-091-4/+17
* add .OriginalMIMEType variable to reply templateLeszek Cimała2020-01-091-0/+6
* Reword aerc-tutorial with revised constraintsDrew DeVault2020-01-051-5/+5
* Add labels to index format (%g)Reto Brunner2019-12-271-0/+2
* read: adapt to ProvidesMessagesReto Brunner2019-12-221-4/+4
* docs: mark commandReto Brunner2019-12-211-0/+17
* msglist: highlight marked messagesReto Brunner2019-12-211-1/+1
* Add address book completion in composerBen Burwell2019-12-211-0/+16
* Show textinput completions in popoversBen Burwell2019-12-211-0/+10
* Add custom sorting for foldersMichele Finotto2019-12-091-0/+6
* Complete the F rune.Srivathsan Murali2019-11-171-2/+3
* Correct capitalization in quoted_replyDrew DeVault2019-11-101-2/+6
* Add Templates with ParsingSrivathsan Murali2019-11-102-0/+114
* Add support for AUTH LOGIN submissionLuke Drummond2019-11-011-0/+4
* Config for deleting message from message viewerSrivathsan Murali2019-09-201-0/+5
* Change search flagsJeffas2019-09-201-2/+10
* Add documentation for sortJeffas2019-09-202-0/+34
* Add search documentation for maildir backendJeffas2019-09-161-0/+16
* Add signaturesJeffas2019-09-121-0/+8
* Add modify-labels commandReto Brunner2019-09-121-0/+8
* Add display of unread messages in dirlistJeffas2019-09-111-0/+16
* Add new search behaviour for imapJeffas2019-09-111-2/+8
* Allow custom spinner via config filePaul Spooren2019-08-301-0/+15
* notmuch: add search / filter capabilitiesReto Brunner2019-08-291-0/+10
* extract search criteria parsing into the backendsReto Brunner2019-08-292-7/+15
* Add :prompt commandChristopher Vittal2019-08-261-0/+6
* folder filter: only assume regex if filter is ~fmtDrew DeVault2019-08-201-1/+1
* Add forwarding as attachment featureJelle Besseling2019-08-201-1/+3
* Add addresses argument to forward commandJelle Besseling2019-08-201-1/+1
* Support regex filters for foldersDaniel Xu2019-08-191-1/+2
* Revert "add close command at global level"Drew DeVault2019-08-131-5/+7
* add close command at global levelAditya Srivastava2019-08-131-7/+5
* Add optional body argument to compose commandDaniel Bridges2019-08-131-1/+1
* Let user edit arbitrary headers in composerDaniel Bridges2019-08-121-1/+5
* Add notmuch docsReto Brunner2019-08-083-1/+64
* Allow cc/bcc command to receive no argumentsDaniel Bridges2019-08-071-1/+1
* Add cc and bcc commandsDaniel Bridges2019-08-031-0/+4
* doc: Fix missing '\' in aerc-tutorial man page.Ronan Pigott2019-07-291-1/+1
* aerc-tutorial(7): add searching and expand viewerDrew DeVault2019-07-291-0/+8
ster names to lowercase' href='/akkartik/mu/commit/065write-buffered.subx?h=hlt&id=333525360b22f3d3ea31db46a4d2f1b4edbfebdb'>33352536 ^
a94b60b5 ^

33352536 ^

a94b60b5 ^


33352536 ^


a94b60b5 ^



33352536 ^

a94b60b5 ^
33352536 ^
a94b60b5 ^
33352536 ^
a94b60b5 ^
33352536 ^
a94b60b5 ^


33352536 ^
a94b60b5 ^

33352536 ^





7a583220 ^
33352536 ^

a94b60b5 ^










33352536 ^
686a52bd ^
a94b60b5 ^
686a52bd ^
a94b60b5 ^


33352536 ^
a94b60b5 ^






33352536 ^
a94b60b5 ^





33352536 ^
ddd2e989 ^
a94b60b5 ^

ddd2e989 ^

a94b60b5 ^
ddd2e989 ^
a94b60b5 ^
33352536 ^
a94b60b5 ^











33352536 ^
686a52bd ^
a94b60b5 ^
686a52bd ^
a94b60b5 ^


33352536 ^
a94b60b5 ^








33352536 ^
a94b60b5 ^






33352536 ^

a94b60b5 ^


33352536 ^
a94b60b5 ^
ddd2e989 ^
a94b60b5 ^



33352536 ^

a94b60b5 ^


33352536 ^
a94b60b5 ^


e968d773 ^


f1eade72 ^
7e7a8a6e ^
e968d773 ^
686a52bd ^
f0b7e327 ^

e968d773 ^
f0b7e327 ^
e968d773 ^
bfcc0f85 ^
e968d773 ^
f0b7e327 ^
e968d773 ^




a94b60b5 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226






                                                                                                                                                 
                                                                  

                      
                                     
                          
                                

                           

                               



                    


                  
                    

                                                    
     
                

                                                                                                                                                                       
                      







                                                                                                                                                                             
                                         
                                                                                                                                                                         
                                                        



                                                                                                                                                                            
                   


                                                                                                                                                                             

                            
                                                                                                                                                                            
                                                     
                                                         
                                                                                                                                                                            
                                                 
                        
                                                                                                                                                                            

                   
               


                         
                                                                                                                                                                  

                                  

                                                                                                                                                                         


                                


                                                                                                                                                                  



                             

                                                                                                                                                                               
                              
                                                                                                                                                                                
                
                    
          
                    


                                                
                                                                                                                                                                            

                         





                 
                

                                                                                                                                                                       










                                                    
                                                                                                                                                                  
                                                  
                   
                                               


                                
                                                                                                                                                                  






                                                
                                                                                                                                                                  





                                      
                                                                                                                                                                  
                                                  

                                                   

                               
              
                                      
                      
                                                                                                                                                                  











                                                                              
                                                                                                                                                                  
                                                  
                   
                                               


                                
                                                                                                                                                                  








                                                                             
                                                                                                                                                                  






                                                                                  

                                                                                                                                                                 


                                    
                                                                                                                                                                  
                                                       
                                                             



                                                                                     

                                                                                                                                                                     


                                    
                                                                                                                                                                  


             


                                       
                        
                                           
                             
                

                                 
           
                          
           
            
           
            




                                                                               
                            
# write-buffered: like 'write', but for a buffered-file

== 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-buffered:  # f: (addr buffered-file), msg: (addr array byte)
    # pseudocode:
    #   in = msg->data
    #   inend = &msg->data[msg->size]
    #   while (in < inend)
    #     if f->write >= f->size
    #       flush(f)
    #       clear-stream(f)
    #     c = *in
    #     f->data[f->write] = c
    #     ++f->write
    #     ++in
    #
    # registers:
    #   in: esi
    #   inend: ecx
    #   f: edi
    #   f->size: edx
    #   f->write: ebx (cached; need to keep in sync)
    #   c: eax
    #
    # . 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
    52/push-edx
    53/push-ebx
    56/push-esi
    57/push-edi
    # eax = msg
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         0/r32/eax   0xc/disp8       .                 # copy *(ebp+12) to eax
    # var in/esi: (addr byte) = msg->data
    8d/copy-address                 1/mod/*+disp8   0/rm32/eax    .           .             .           6/r32/esi   4/disp8         .                 # copy eax+4 to esi
    # var inend/ecx: (addr byte) = &msg->data[msg->size]
    8b/copy                         0/mod/indirect  0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # copy *eax to ecx
    8d/copy-address                 0/mod/indirect  4/rm32/sib    6/base/esi  1/index/ecx   .           1/r32/ecx   .               .                 # copy esi+ecx to ecx
    # edi = f
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         7/r32/edi   8/disp8         .                 # copy *(ebp+8) to edi
    # edx = f->size
    8b/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           2/r32/edx   0xc/disp8       .                 # copy *(edi+12) to edx
    # ebx = f->write
    8b/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           3/r32/ebx   4/disp8         .                 # copy *(edi+4) to ebx
$write-buffered:loop:
    # if (in >= inend) break
    39/compare                      3/mod/direct    6/rm32/esi    .           .             .           1/r32/ecx   .               .                 # compare esi with ecx
    73/jump-if-addr>=  $write-buffered:loop-end/disp8
    # if (f->write >= f->size) flush and clear f's stream
    39/compare                      3/mod/direct    3/rm32/ebx    .           .             .           2/r32/edx   .               .                 # compare ebx with edx
    7c/jump-if-<  $write-buffered:to-stream/disp8
    # . persist f->write
    89/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           3/r32/ebx   4/disp8         .                 # copy ebx to *(edi+4)
    # . flush(f)
    # . . push args
    57/push-edi
    # . . call
    e8/call  flush/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # . clear-stream(stream = f+4)
    # . . push args
    8d/copy-address                 1/mod/*+disp8   7/rm32/edi    .           .             .           0/r32/eax   4/disp8         .                 # copy edi+4 to eax
    50/push-eax
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # . f->write must now be 0; update its cache at ebx
    31/xor                          3/mod/direct    3/rm32/ebx    .           .             .           3/r32/ebx   .               .                 # clear ebx
$write-buffered:to-stream:
    # write to stream
    # f->data[f->write] = *in
    # . AL = *in
    31/xor                          3/mod/direct    0/rm32/eax    .           .             .           0/r32/eax   .               .                 # clear eax
    8a/copy-byte                    0/mod/indirect  6/rm32/esi    .           .             .           0/r32/AL    .               .                 # copy byte at *esi to AL
    # . f->data[f->write] = AL
    88/copy-byte                    1/mod/*+disp8   4/rm32/sib    7/base/edi  3/index/ebx   .           0/r32/AL    0x10/disp8      .                 # copy AL to *(edi+ebx+16)
    # ++f->write
    43/increment-ebx
    # ++in
    46/increment-esi
    eb/jump  $write-buffered:loop/disp8
$write-buffered:loop-end:
    # persist necessary variables from registers
    89/copy                         1/mod/*+disp8   7/rm32/edi    .           .             .           3/r32/ebx   4/disp8         .                 # copy ebx to *(edi+4)
$write-buffered:end:
    # . restore registers
    5f/pop-to-edi
    5e/pop-to-esi
    5b/pop-to-ebx
    5a/pop-to-edx
    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-buffered:
    # - check that write-buffered writes to the file
    # setup
    # . clear-stream(_test-stream)
    # . . push args
    68/push  _test-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-buffered-file->buffer)
    # . . push args
    68/push  $_test-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
    # write-buffered(_test-buffered-file, "Abc")
    # . . push args
    68/push  "Abc"/imm32
    68/push  _test-buffered-file/imm32
    # . . call
    e8/call  write-buffered/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # flush(_test-buffered-file)
    # . . push args
    68/push  _test-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-stream, "Abc", msg)
    # . . push args
    68/push  "F - test-write-buffered-single"/imm32
    68/push  "Abc"/imm32
    68/push  _test-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
    # . end
    c3/return

test-write-buffered-with-intermediate-flush:
    # - check that write-buffered flushes in the middle if its buffer fills up
    # setup
    # . clear-stream(_test-stream)
    # . . push args
    68/push  _test-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-buffered-file->buffer)
    # . . push args
    68/push  $_test-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
    # _test-stream can hold 8 bytes, but _test-buffered-file can hold only 6.
    # Try to write 7 bytes.
    # . write-buffered(_test-buffered-file, "Abcdefg")
    # . . push args
    68/push  "Abcdefg"/imm32
    68/push  _test-buffered-file/imm32
    # . . call
    e8/call  write-buffered/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # don't flush
    # 6 bytes should still have gotten to _test-stream
    # . check-ints-equal(*_test-stream->write, 6, msg)
    # . . push args
    68/push  "F - test-write-buffered-with-intermediate-flush: flushed data"/imm32
    68/push  6/imm32
    # . . push *_test-stream->write
    b8/copy-to-eax  _test-stream/imm32
    ff          6/subop/push        0/mod/indirect  0/rm32/eax    .           .             .           .           .               .                 # push *eax
    # . . call
    e8/call  check-ints-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # and 1 byte should still be in _test-buffered-file
    # . check-ints-equal(*_test-buffered-file->write, 1, msg)
    # . . push args
    68/push  "F - test-write-buffered-with-intermediate-flush: unflushed bytes"/imm32
    68/push  1/imm32
    # . . push *_test-buffered-file->write
    b8/copy-to-eax  _test-buffered-file/imm32
    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
    # . . call
    e8/call  check-ints-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # . end
    c3/return

== data

# The buffered file for standard error.
Stderr:  # buffered-file
    # file descriptor or (addr stream byte)
    2/imm32  # standard error
$Stderr->buffer:
    # inlined fields for a stream
    #   current write index
    0/imm32
    #   current read index
    0/imm32
    #   size
    8/imm32
    #   data
    00 00 00 00 00 00 00 00  # 8 bytes

# TODO: 8 bytes is too small. We'll need to grow the buffer for efficiency. But
# I don't want to type in 1024 bytes here.

# . . vim:nowrap:textwidth=0