about summary refs log tree commit diff stats
path: root/core
Commit message (Expand)AuthorAgeFilesLines
...
* tar backup script fixSilvino Silva2016-09-221-2/+4
* final 0.2.1 revisionSilvino Silva2016-09-223-11/+14
* initial exim and mutt local delivery testSilvino Silva2016-09-213-8/+35
* exim revisionSilvino Silva2016-09-214-12/+913
|\
| * core exim revisionSilvino Silva2016-09-214-12/+913
* | moved tool config from coreSilvino Silva2016-09-2012-592/+0
|/
* index's revisionSilvino Silva2016-09-201-0/+3
* converted c9 Team to lower charSilvino Silva2016-09-1813-13/+13
* changed Silvino Silva to c9 Team and added team pageSilvino Silva2016-09-1813-13/+13
* core added exim, tar and vim moved to toolsSilvino Silva2016-09-184-303/+233
* core bash, dash and tmux revisionSilvino Silva2016-09-183-17/+17
* updated core linux ports and iptables scriptSilvino Silva2016-09-179-361/+4362
* core linux fix names, added initramfs and grubSilvino Silva2016-09-171-6/+17
* core tty-terminal revisionSilvino Silva2016-09-171-2/+2
* core package fix link to licenseSilvino Silva2016-09-171-1/+1
* core linux revisionSilvino Silva2016-09-171-44/+49
* core index, I try hard to improve my english :)Silvino Silva2016-09-171-2/+2
* fix wrong destination of c9-ports collectionSilvino Silva2016-09-171-1/+1
* core ports dracut missing Maintainer fieldSilvino Silva2016-09-151-1/+1
* updated core port linux from c9-portsSilvino Silva2016-09-151-5/+1
* dracut revisionSilvino Silva2016-09-154-5/+25
* core packages revision, iptables and added ports collectionsSilvino Silva2016-09-155-10/+38
* core package revisionSilvino Silva2016-09-151-14/+19
* core ports link fixSilvino Silva2016-09-131-1/+0
* fix ports and prt-get configuration build as userSilvino Silva2016-09-132-6/+6
* link to core os index normalizationSilvino Silva2016-09-133-4/+4
* core ports link do handbook fixSilvino Silva2016-09-131-1/+1
* core network link to index fixSilvino Silva2016-09-131-1/+1
* core os configure and network links fixSilvino Silva2016-09-132-2/+2
* network fix indentationSilvino Silva2016-09-131-21/+19
* added core/conf/sysctl.confSilvino Silva2016-09-131-0/+102
* network links to conf and scripts fixSilvino Silva2016-09-121-5/+5
* network revisionSilvino Silva2016-09-124-46/+58
* network iptables and resolver revisionSilvino Silva2016-09-113-5/+63
* Index revision and sysdoc renamed to c9-docSilvino Silva2016-09-1010-50/+52
* linux crux updatedSilvino Silva2016-09-104-481/+282
* prtget renamed to package managementSilvino Silva2016-08-232-22/+34
* core terminal dash and bash revisionSilvino Silva2016-08-233-31/+39
* added terminal and shellsSilvino Silva2016-08-223-54/+91
* added all core filesSilvino Silva2016-08-2213-36/+1635
* added patch to linux port, gcc optimizationsSilvino Silva2016-08-221-0/+2
* first doc core os revisionSilvino Silva2016-08-2241-205/+5836
* added skeletons to installSilvino Silva2016-08-203-0/+132
* initial ports, scripts revisionSilvino Silva2016-08-203-88/+316
* initial core configure script and docSilvino Silva2016-08-191-0/+347
* initial install documentationSilvino Silva2016-08-192-0/+471
ubx/068read-line.subx?h=hlt&id=a4df80db2bfaf9c5d98e10b4b35f240b71ddc4c0'>a4df80db ^
aff782c4 ^
























38ef68b2 ^

aff782c4 ^
38ef68b2 ^
aff782c4 ^




38ef68b2 ^
aff782c4 ^

f0705578 ^
38ef68b2 ^
aff782c4 ^
f0705578 ^
aff782c4 ^




bddd7e3a ^
a4df80db ^
















38ef68b2 ^
a4df80db ^
38ef68b2 ^
a4df80db ^











38ef68b2 ^

a4df80db ^
38ef68b2 ^
a4df80db ^




38ef68b2 ^
a4df80db ^
bddd7e3a ^
ddd2e989 ^
38ef68b2 ^
a4df80db ^
ddd2e989 ^
a4df80db ^



aff782c4 ^

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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252




                                                                                                                                                 






                                                                                                                                                                                         
                                                                             
                                                
                                
                                                                              
                 
                  






                                                            
                               



                                                                                                                                                                       
               


























                                                                                                                                                                                 
                                                      








                                                                                                                                                                  
                              
                                                                
                                 
                                                                                                                                                                   
                                          









                                                                                                                                                                                        
                            

                                                                                                                                                                   









                                                                                                                                                                            
                 













                                                                                                                                                                       







                                                                                                                                                                  
























                                                                                                                                                                  
                                      
                   
                                   



                                                                                                                                                                  
























                                                                                                                                                                  

                                                                                           
                   
                                   




                                                                                                                                                                  
                                                               

                                       
                       
                                   
              
                                                




                                                                                                                                                                  
                                          
















                                                                                                                                                                  
                                      
                   
                                   











                                                                                                                                                                  

                                                                                           
                   
                                   




                                                                                                                                                                  
                                                     
                   
                                                                  
                       
                                   
              
                                      



                                                                                                                                                                  

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

#? Entry:  # run a single test, while debugging
#?     e8/call test-read-line/disp32
#?     # syscall(exit, Num-test-failures)
#?     8b/copy                         0/mod/indirect  5/rm32/.disp32            .             .           3/r32/EBX   Num-test-failures/disp32          # copy *Num-test-failures to EBX
#?     b8/copy-to-EAX  1/imm32/exit
#?     cd/syscall  0x80/imm8

# read bytes from 'f' until (and including) a newline and store them into 's'
# 's' fails to grow if and only if no data found
# just abort if 's' is too small
read-line:  # f : (address buffered-file), s : (address stream byte) -> <void>
    # pseudocode:
    #   while true
    #     if (s->write >= s->length) abort
    #     if (f->read >= f->write) populate stream from file
    #     if (f->write == 0) break
    #     AL = f->data[f->read]
    #     s->data[s->write] = AL
    #     ++f->read
    #     ++s->write
    #     if (AL == '\n') break
    # . prolog
    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
    56/push-ESI
    57/push-EDI
    # ESI = f
    8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           6/r32/ESI   8/disp8         .                 # copy *(EBP+8) to ESI
    # ECX = f->read
    8b/copy                         1/mod/*+disp8   6/rm32/ESI    .           .             .           1/r32/ECX   8/disp8         .                 # copy *(ESI+8) to ECX
    # EDI = s
    8b/copy                         1/mod/*+disp8   5/rm32/EBP    .           .             .           7/r32/EDI   0xc/disp8       .                 # copy *(EBP+12) to EDI
    # EDX = s->write
    8b/copy                         0/mod/indirect  7/rm32/EDI    .           .             .           2/r32/EDX   .               .                 # copy *EDI to EDX
$read-line:loop:
    # if (s->write >= s->length) abort
    3b/compare                      1/mod/*+disp8   7/rm32/EDI    .           .             .           2/r32/EDX   8/disp8         .                 # compare EDX with *(EDI+8)
    7d/jump-if-greater-or-equal  $read-line:abort/disp8
    # if (f->read >= f->write) populate stream from file
    3b/compare                      1/mod/*+disp8   6/rm32/ESI    .           .             .           1/r32/ECX   4/disp8         .                 # compare ECX with *(ESI+4)
    7c/jump-if-lesser  $read-line:from-stream/disp8
    # . clear-stream(stream = f+4)
    # . . push args
    8d/copy-address                 1/mod/*+disp8   6/rm32/ESI    .           .             .           0/r32/EAX   4/disp8         .                 # copy ESI+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->read must now be 0; update its cache at ECX
    31/xor                          3/mod/direct    1/rm32/ECX    .           .             .           1/r32/ECX   .               .                 # clear ECX
    # . EAX = read(f->fd, stream = f+4)
    # . . push args
    50/push-EAX
    ff          6/subop/push        0/mod/indirect  6/rm32/ESI    .           .             .           .           .               .                 # push *ESI
    # . . call
    e8/call  read/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
    # if (f->write == 0) break
    # since f->read was initially 0, EAX is the same as f->write
    # . if (EAX == 0) return true
    81          7/subop/compare     3/mod/direct    0/rm32/EAX    .           .             .           .           .               0/imm32           # compare EAX
    74/jump-if-equal  $read-line:end/disp8
$read-line:from-stream:
    # AL = f->data[f->read]
    31/xor                          3/mod/direct    0/rm32/EAX    .           .             .           0/r32/EAX   .               .                 # clear EAX
    8a/copy-byte                    1/mod/*+disp8   4/rm32/sib    6/base/ESI  1/index/ECX   .           0/r32/AL    0x10/disp8      .                 # copy byte at *(ESI+ECX+16) to AL
    # s->data[s->write] = AL
    88/copy-byte                    1/mod/*+disp8   4/rm32/sib    7/base/EDI  2/index/EDX   .           0/r32/AL    0xc/disp8       .                 # copy AL to *(EDI+EDX+12)
    # ++f->read
    41/increment-ECX
    # ++s->write
    42/increment-EDX
    # if (AL == '\n') return
    81          7/subop/compare     3/mod/direct    0/rm32/EAX    .           .             .           .           .               0xa/imm32         # compare EAX
    75/jump-if-not-equal  $read-line:loop/disp8
$read-line:end:
    # save f->read
    89/copy                         1/mod/*+disp8   6/rm32/ESI    .           .             .           1/r32/ECX   8/disp8         .                 # copy ECX to *(ESI+8)
    # save s->write
    89/copy                         0/mod/indirect  7/rm32/EDI    .           .             .           2/r32/EDX   .               .                 # copy EDX to *EDI
    # . restore registers
    5f/pop-to-EDI
    5e/pop-to-ESI
    5a/pop-to-EDX
    59/pop-to-ECX
    58/pop-to-EAX
    # . epilog
    89/copy                         3/mod/direct    4/rm32/ESP    .           .             .           5/r32/EBP   .               .                 # copy EBP to ESP
    5d/pop-to-EBP
    c3/return

$read-line:abort:
    # . _write(2/stderr, error)
    # . . push args
    68/push  "read-line: line too long"/imm32
    68/push  2/imm32/stderr
    # . . call
    e8/call  _write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
    # . _write(2/stderr, Newline)
    # . . push args
    68/push  Newline/imm32
    68/push  2/imm32/stderr
    # . . call
    e8/call  _write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
    # . syscall(exit, 1)
    bb/copy-to-EBX  1/imm32
    b8/copy-to-EAX  1/imm32/exit
    cd/syscall  0x80/imm8
    # never gets here

test-read-line:
    # - check that read-line stops at a newline
    # 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+4)
    # . . push args
    b8/copy-to-EAX  _test-buffered-file/imm32
    05/add-to-EAX  4/imm32
    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
    # . clear-stream(_test-tmp-stream)
    # . . push args
    68/push  _test-tmp-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\ncd")
    # . 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
    # . write(_test-stream, "\n")
    # . . push args
    68/push Newline/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, "cd")
    # . . push args
    68/push  "cd"/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
    # read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream
    # . EAX = read-line(_test-buffered-file, _test-tmp-stream)
    # . . push args
    68/push  _test-tmp-stream/imm32
    68/push  _test-buffered-file/imm32
    # . . call
    e8/call  read-line/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
    # check-next-stream-line-equal(_test-tmp-stream, "ab", msg)
    # . . push args
    68/push  "F - test-read-line"/imm32
    68/push  "ab"/imm32
    68/push  _test-tmp-stream/imm32
    # . . call
    e8/call  check-next-stream-line-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               0xc/imm32         # add to ESP
    # end
    c3/return

test-read-line-reads-final-line-until-Eof:
    # 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+4)
    # . . push args
    b8/copy-to-EAX  _test-buffered-file/imm32
    05/add-to-EAX  4/imm32
    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
    # . clear-stream(_test-tmp-stream)
    # . . push args
    68/push  _test-tmp-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, "cd")
    # . . push args
    68/push  "cd"/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
    # read a line from _test-stream (buffered by _test-buffered-file) into _test-tmp-stream
    # . EAX = read-line(_test-buffered-file, _test-tmp-stream)
    # . . push args
    68/push  _test-tmp-stream/imm32
    68/push  _test-buffered-file/imm32
    # . . call
    e8/call  read-line/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
    # check-stream-equal(_test-tmp-stream, "cd", msg)
    # . . push args
    68/push  "F - test-read-line-reads-final-line-until-Eof"/imm32
    68/push  "cd"/imm32
    68/push  _test-tmp-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

# . . vim:nowrap:textwidth=0