summary refs log tree commit diff stats
path: root/lib
Commit message (Expand)AuthorAgeFilesLines
* ensureScroll on text input framesDrew DeVault2019-05-251-0/+2
* Implement scrolling in text inputDrew DeVault2019-05-251-3/+31
* Show account wizard if no accounts configuredDrew DeVault2019-05-221-1/+1
* New account wizard, part oneDrew DeVault2019-05-212-10/+23
* Flesh out multipart switcherDrew DeVault2019-05-201-1/+1
* lib/ui/ui: use atomic instead of channelSimon Ser2019-05-191-26/+21
* Update internal state and draw from the same goroutineSimon Ser2019-05-193-23/+7
* s/aerc2/aerc/gDrew DeVault2019-05-172-2/+2
* Fix issues with OOB uidsDrew DeVault2019-05-161-3/+3
* Implement (basic form) of :replyDrew DeVault2019-05-161-0/+34
* Let caller pass in custom headers to composeDrew DeVault2019-05-161-0/+4
* Implement move, mv commandsDrew DeVault2019-05-141-0/+27
* Implement :copy (aka :cp)Drew DeVault2019-05-141-2/+16
* Update tab name as subject changesDrew DeVault2019-05-142-1/+18
* Remove leftover debug loggingDrew DeVault2019-05-131-3/+0
* Handle incoming emails gracefullyDrew DeVault2019-05-131-0/+6
* Spec out review message screenDrew DeVault2019-05-131-3/+3
* Implement :{next,prev}-field in compose viewDrew DeVault2019-05-121-3/+3
* Add initial compose widgetDrew DeVault2019-05-121-2/+3
* Refactor ctx stashing out of exlineDrew DeVault2019-05-111-0/+2
* Split ex line text handling into dedicated widgetDrew DeVault2019-05-111-0/+136
* lib/ui: fix UI.Exit race conditionSimon Ser2019-05-051-2/+13
* lib/ui: fix Grid race conditionSimon Ser2019-05-051-1/+20
* lib/msgstore: protect with a mutexSimon Ser2019-04-291-3/+22
* lib/ui: fix GridCell.invalid raceSimon Ser2019-04-291-5/+6
* lib/ui: introduce InvalidatableSimon Ser2019-04-274-32/+37
* Make message viewer real, part twoDrew DeVault2019-03-311-1/+1
* Rename FetchMessageBodies to FetchFullMessagesDrew DeVault2019-03-311-2/+2
* Make the message viewer real, part oneDrew DeVault2019-03-311-1/+15
* Don't parse mail in worker; send a reader insteadDrew DeVault2019-03-311-7/+6
* Pull BodyStructure up from IMAP workerDrew DeVault2019-03-311-1/+15
* Add basic message viewer mockupDrew DeVault2019-03-301-0/+10
* Use tcell.Style.Reverse instead of black on whiteDrew DeVault2019-03-303-10/+14
* Show deleted emails pending server ack in greyDrew DeVault2019-03-301-2/+15
* Add body fetching support codeDrew DeVault2019-03-291-6/+71
* Remove unused import from msgstore.goDrew DeVault2019-03-211-2/+0
* Implement :delete-messageDrew DeVault2019-03-201-3/+26
* Add :term-closeDrew DeVault2019-03-172-3/+7
* Move exline handling up to aerc, add :termDrew DeVault2019-03-171-3/+5
* Add basic terminal widgetDrew DeVault2019-03-172-0/+3
* Add TODO to msgstore.goDrew DeVault2019-03-151-1/+1
* Move MessageStore into its own fileDrew DeVault2019-03-151-0/+86
* Add :quit commandDrew DeVault2019-03-151-5/+0
* Implement the Container interface in lib/ui/Drew DeVault2019-01-205-7/+26
* Merge lib/ui/interfaces.go and add anotherDrew DeVault2019-01-203-30/+42
* Make repeated invalidations more efficientDrew DeVault2019-01-141-0/+10
* Add cursor handling in ex lineDrew DeVault2019-01-141-8/+9
* Revert "Add abstract list, update dirlist accordingly"Drew DeVault2019-01-132-111/+0
* Revert "Render selected list item differently"Drew DeVault2019-01-131-1/+0
* Render selected list item differentlyDrew DeVault2019-01-131-0/+1
an> ^
33352536 ^


ee9a9237 ^
33352536 ^



b8475380 ^
7a583220 ^
33352536 ^

6030d7e2 ^
3d6450f2 ^
3d6450f2 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

9d27e966 ^
33352536 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^

3d6450f2 ^

6030d7e2 ^
ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

9d27e966 ^
33352536 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^

b31455f8 ^


f1eade72 ^
6030d7e2 ^
9b16f190 ^
6030d7e2 ^
9b16f190 ^

438e5a0d ^



6ee77ba7 ^
ee9a9237 ^
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

                                                                            

                                                                             



                                                                             



                                                                               

                                            


                                                     
       


                                                                                                                                                 
 
                                                               
                                                           
                

                                                                                                                                                                       
                                                                                                                            
                                                                                                                                                                        
                                        
                   

                                                                                                                                                                      
              
                          
                      
                                                                                                                                                                  
                             
            
                                                   
                      










                                                                                                                                                                            
                
                                                                                                                                                                      
                                  

                                                                                                                                                                              
                                 

                                                                                                                                                                              
              
                             
                      


                                                                                                                                                                       
                         



                 
           
                

                                                                                                                                                                       
             
 
                  
                                
                   
                               
              
                                
                      
                                                                                                                                                                  
                               
                   

                               
              
                         
                      
                                                                                                                                                                  
                                                                 
                   

                                          
                                  

                                                                                                                                                                      
              
                                    
                      
                                                                                                                                                                  

             

                   
                                
                   
                               
              
                                
                      
                                                                                                                                                                  
                              
                   

                               
              
                         
                      
                                                                                                                                                                  
                              
                   

                               
              
                         
                      
                                                                                                                                                                  
                                                                 
                   

                                           
                                  

                                                                                                                                                                      
              
                                    
                      
                                                                                                                                                                  

             


       
                              
                         
           
                        

            



                                   
 
                            
# write: like _write, but also support in-memory streams in addition to file
# descriptors.
#
# Our first dependency-injected and testable primitive. We can pass it either
# a file descriptor or an address to a stream. If a file descriptor is passed
# in, we _write to it using the right syscall. If a 'fake file descriptor' or
# stream is passed in, we append to the stream. This lets us redirect output
# in tests and check it later.
#
# We assume our data segment will never begin at an address shorter than
# 0x08000000, so any smaller arguments are assumed to be real file descriptors.
#
# A stream looks like this:
#   read: int  # index at which to read next
#   write: int  # index at which writes go
#   data: (array byte)  # prefixed by length as usual

== 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

# TODO: come up with a way to signal when a write to disk fails
write:  # f: fd or (addr stream byte), s: (addr array byte)
    # . prologue
    55/push-ebp
    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
    # if (f < 0x08000000) _write(f, s) and return  # f can't be a user-mode address, so treat it as a kernel file descriptor
    81          7/subop/compare     1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         0x08000000/imm32  # compare *(ebp+8)
    73/jump-if-addr>=  $write:fake/disp8
    # . . push args
    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       .                 # push *(ebp+12)
    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 # push *(ebp+8)
    # . . call
    e8/call  _write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    eb/jump  $write:end/disp8
$write:fake:
    # otherwise, treat 'f' as a stream to append to
    # . save registers
    50/push-eax
    51/push-ecx
    52/push-edx
    53/push-ebx
    # ecx = f
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         1/r32/ecx   8/disp8         .                 # copy *(ebp+8) to ecx
    # edx = f->write
    8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           2/r32/edx   .               .                 # copy *ecx to edx
    # ebx = f->length
    8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           3/r32/ebx   8/disp8         .                 # copy *(ecx+8) to ebx
    # eax = _append-3(&f->data[f->write], &f->data[f->length], s)
    # . . push s
    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       .                 # push *(ebp+12)
    # . . push &f->data[f->length]
    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  3/index/ebx   .           3/r32/ebx   0xc/disp8       .                 # copy ecx+ebx+12 to ebx
    53/push-ebx
    # . . push &f->data[f->write]
    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx   .           3/r32/ebx   0xc/disp8       .                 # copy ecx+edx+12 to ebx
    53/push-ebx
    # . . call
    e8/call  _append-3/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # f->write += eax
    01/add                          0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # add eax to *ecx
    # . restore registers
    5b/pop-to-ebx
    5a/pop-to-edx
    59/pop-to-ecx
    58/pop-to-eax
$write:end:
    # . epilogue
    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
    5d/pop-to-ebp
    c3/return

test-write-single:
    # 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
    # write(_test-stream, "Ab")
    # . . push args
    68/push  "Ab"/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # check-ints-equal(*_test-stream->data, 41/A 62/b 00 00, msg)
    # . . push args
    68/push  "F - test-write-single"/imm32
    68/push  0x006241/imm32/Ab
    # . . push *_test-stream->data
    b8/copy-to-eax  _test-stream/imm32
    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           0xc/disp8       .                 # push *(eax+12)
    # . . 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

test-write-appends:
    # 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
    # write(_test-stream, "C")
    # . . push args
    68/push  "C"/imm32
    68/push  _test-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(_test-stream, "D")
    # . . push args
    68/push  "D"/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # check-ints-equal(*_test-stream->data, 43/C 44/D 00 00, msg)
    # . . push args
    68/push  "F - test-write-appends"/imm32
    68/push  0x00004443/imm32/C-D
    # . . push *_test-stream->data
    b8/copy-to-eax  _test-stream/imm32
    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           0xc/disp8       .                 # push *(eax+12)
    # . . 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

_test-stream:  # (stream byte)
    # current write index
    0/imm32
    # current read index
    0/imm32
    # length
    0x10/imm32
    # data (2 lines x 8 bytes/line)
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00

# . . vim:nowrap:textwidth=0