about summary refs log tree commit diff stats
path: root/doc/aerc-config.5.scd
diff options
context:
space:
mode:
authorBen Burwell <ben@benburwell.com>2019-07-07 22:43:58 -0400
committerDrew DeVault <sir@cmpwn.com>2019-07-08 16:06:28 -0400
commitc610c3cd9dd47c400e52c1858e987f5f32a7a45b (patch)
tree6e521ba706d87ea4a03ce81d57ff84317506f3df /doc/aerc-config.5.scd
parent88c379dcbaaf9fd549cd271817e79fe634b1dd84 (diff)
downloadaerc-c610c3cd9dd47c400e52c1858e987f5f32a7a45b.tar.gz
Factor IMAP-specific structs out of UI models
Before, we were using several IMAP-specific concepts to represent
information being displayed in the UI. Factor these structures out of
the IMAP package to make it easier for other backends to provide the
required information.
Diffstat (limited to 'doc/aerc-config.5.scd')
0 files changed, 0 insertions, 0 deletions
d2e9891e843279cf1c190c1ee7c5ceef9ef96b'>^
71e4f381 ^


03c6f1d3 ^





71eb22a5 ^
7a583220 ^
33352536 ^

03c6f1d3 ^
33352536 ^



bfcc0f85 ^
33352536 ^
bfcc0f85 ^
33352536 ^
03c6f1d3 ^
33352536 ^
03c6f1d3 ^
33352536 ^
3ac95f6a ^

71eb22a5 ^
33352536 ^
03c6f1d3 ^
2a2a5b1e ^
33352536 ^
6070c23e ^
2a2a5b1e ^
6ecddbaa ^
2a2a5b1e ^
33352536 ^
03c6f1d3 ^


33352536 ^

7a583220 ^
33352536 ^

03c6f1d3 ^
f0705578 ^
71eb22a5 ^
7a583220 ^
33352536 ^

f0705578 ^
33352536 ^


f0705578 ^
33352536 ^
f0705578 ^

33352536 ^
7a583220 ^
33352536 ^

f0705578 ^
1639687b ^

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


                                                                      

                                            
                                                   
 
                                           
                                                        
                                         


                                                                             





                                                                                                                                                 
                                      
                

                                                                                                                                                                       
                      



                                                                                                                                                                            
                                  
                                                                                                                                                                            
                                                  
                                                                                                                                                                              
                  
                                                                                                                                                                    
                 
                                                                                                                                                                        

                                                                                                       
                                         
                                                                                                                                                                  
                   
                            
                                                                                                                                                                            
                                              
               
                                                                                                                                                                         
            
                    


                                     

                 
                

                                                                                                                                                                       
             
 
                                       
                

                                                                                                                                                                       
                      


                                                                                                                                                                            
                 
                                                                                                                                                                        

                         
                 
                

                                                                                                                                                                       
             

                            
# streams: data structure for operating on arrays in a stateful manner
#
# A stream looks like this:
#   write: int  # index at which writes go
#   read: int  # index that we've read until
#   data: (array byte)  # prefixed by size as usual
#
# some primitives for operating on streams:
#   - clear-stream (clears everything but the data size)
#   - rewind-stream (resets read pointer)
#
# We need to do this in machine code because streams need to be opaque types,
# and we don't yet support opaque types in Mu.

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

clear-stream:  # f: (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
    # eax = f
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         0/r32/eax   8/disp8         .                 # copy *(ebp+8) to eax
    # var count/ecx: int = f->size
    8b/copy                         1/mod/*+disp8   0/rm32/eax    .           .             .           1/r32/ecx   8/disp8         .                 # copy *(eax+8) to ecx
    # var max/ecx: (addr byte) = &f->data[f->size]
    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx   .           1/r32/ecx   0xc/disp8       .                 # copy eax+ecx+12 to ecx
    # f->write = 0
    c7          0/subop/copy        0/mod/direct    0/rm32/eax    .           .             .           .           .               0/imm32           # copy to *eax
    # f->read = 0
    c7          0/subop/copy        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         0/imm32           # copy to *(eax+4)
    # - clear all stream data
    # - this isn't strictly necessary, and it can slow things down *a lot*, but better safe than sorry.
    # var curr/eax: (addr byte) = f->data
    81          0/subop/add         3/mod/direct    0/rm32/eax    .           .             .           .           .               0xc/imm32         # add to eax
$clear-stream:loop:
    # if (curr >= max) break
    39/compare                      3/mod/direct    0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # compare eax with ecx
    73/jump-if-addr>=  $clear-stream:end/disp8
    # *curr = 0
    c6          0/subop/copy-byte   0/mod/direct    0/rm32/eax    .           .             .           .           .               0/imm8            # copy byte to *eax
    # ++curr
    40/increment-eax
    eb/jump  $clear-stream:loop/disp8
$clear-stream:end:
    # . restore registers
    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

rewind-stream:  # f: (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
    # eax = f
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         0/r32/eax   8/disp8         .                 # copy *(ebp+8) to eax
    # f->read = 0
    c7          0/subop/copy        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         0/imm32           # copy to *(eax+4)
$rewind-stream:end:
    # . restore registers
    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

# . . vim:nowrap:textwidth=0