Mercurial > repos > rhope
annotate file.rhope @ 183:24c6f8767190
Remove obsolete version of compiler that ran under the interpreter
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 27 Jul 2011 21:14:23 -0700 |
parents | ac5c2d78663f |
children |
rev | line source |
---|---|
79 | 1 |
80 | 2 //This implementation will change quite a bit once the transaction system is working |
3 //and I've finalized how File I/O will fit into that. This is just a very basic | |
4 //implementation to allow the compiler to be self-hosting. | |
5 | |
6 Foreign C:libc | |
7 { | |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
8 open[name(Array,Raw Pointer),flags(Int32,Naked),mode(UInt32,Naked):filedes(Int32,Naked)] |
80 | 9 close[filedes(Int32,Naked):status(Int32,Naked)] |
10 fsync[filedes(Int32,Naked):status(Int32,Naked)] | |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
11 fstat[filedes(Int32,Naked),buf(Stat,Raw Pointer,Mutable):err(Int32,Naked),buf] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
12 lseek[filedes(Int32,Naked),offset(Int64,Naked),whence(Int32,Naked):out(Int64,Naked)] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
13 ftruncate[filedes(Int32,Naked),length(Int64,Naked):status(Int32,Naked)] |
80 | 14 } |
79 | 15 |
16 Blueprint Stat | |
17 { | |
80 | 18 Device(UInt64,Naked) |
19 Inode(UInt64,Naked) | |
20 Link Count(UInt64,Naked) | |
21 Mode(UInt32,Naked) | |
22 Owner ID(UInt32,Naked) | |
23 Group ID(UInt32,Naked) | |
24 Pad0(Int32,Naked) | |
25 RDevice(UInt64,Naked) | |
26 Size(Int64,Naked) | |
27 Block Size(Int64,Naked) | |
28 Block Count(Int64,Naked) | |
29 Access Time(Int64,Naked) | |
30 Access Time Nano(UInt64,Naked) | |
31 Mod Time(Int64,Naked) | |
32 Mod Time Nano(UInt64,Naked) | |
33 Status Time(Int64,Naked) | |
34 Status Time Nano(UInt64,Naked) | |
35 Unused1(Int64,Naked) | |
36 Unused2(Int64,Naked) | |
37 Unused3(Int64,Naked) | |
38 } | |
39 | |
40 Stat[fd:out] | |
41 { | |
42 err,out <- fstat[fd, Build[Stat()]] | |
79 | 43 } |
44 | |
45 Blueprint File | |
46 { | |
47 Name | |
48 } | |
49 | |
50 Blueprint File Read | |
51 { | |
52 Name | |
53 Descriptor(Int32,Naked) | |
54 Info | |
55 } | |
56 | |
57 Blueprint File Write | |
58 { | |
59 Name | |
60 Descriptor(Int32,Naked) | |
61 Info | |
62 } | |
63 | |
64 Blueprint File ReadWrite | |
65 { | |
66 Name | |
67 Read Offset(Int64,Naked) | |
68 Descriptor(Int32,Naked) | |
69 Info | |
70 } | |
71 | |
72 File[name:out] | |
73 { | |
74 out <- [Build[File()]]Name <<[name] | |
75 } | |
76 | |
77 | |
78 Open@File[file,mode:out,error] | |
79 { | |
80 If[[mode]=["r"]] | |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
81 { |
82
2e2e55fc12f9
Fix bug with conditionally assigning a literal or input to a named pipe
Mike Pavone <pavone@retrodev.com>
parents:
81
diff
changeset
|
82 imode <- 0i32 |
2e2e55fc12f9
Fix bug with conditionally assigning a literal or input to a named pipe
Mike Pavone <pavone@retrodev.com>
parents:
81
diff
changeset
|
83 type <- File Read() |
79 | 84 out <- Val[ofile] |
85 }{ | |
86 If[[mode]=["w"]] | |
87 { | |
82
2e2e55fc12f9
Fix bug with conditionally assigning a literal or input to a named pipe
Mike Pavone <pavone@retrodev.com>
parents:
81
diff
changeset
|
88 imode <- 65i32 |
2e2e55fc12f9
Fix bug with conditionally assigning a literal or input to a named pipe
Mike Pavone <pavone@retrodev.com>
parents:
81
diff
changeset
|
89 type <- File Write() |
79 | 90 out <- Val[ofile] |
170
ac5c2d78663f
Inline calls to If@Boolean when static type info is present
Mike Pavone <pavone@retrodev.com>
parents:
114
diff
changeset
|
91 { |
ac5c2d78663f
Inline calls to If@Boolean when static type info is present
Mike Pavone <pavone@retrodev.com>
parents:
114
diff
changeset
|
92 lseek[fd, 0i64, 2i32] |
ac5c2d78663f
Inline calls to If@Boolean when static type info is present
Mike Pavone <pavone@retrodev.com>
parents:
114
diff
changeset
|
93 } |
79 | 94 }{ |
95 ,error <- If[[mode]=["rw"]] | |
96 { | |
82
2e2e55fc12f9
Fix bug with conditionally assigning a literal or input to a named pipe
Mike Pavone <pavone@retrodev.com>
parents:
81
diff
changeset
|
97 imode <- 66i32 |
2e2e55fc12f9
Fix bug with conditionally assigning a literal or input to a named pipe
Mike Pavone <pavone@retrodev.com>
parents:
81
diff
changeset
|
98 type <- File ReadWrite() |
79 | 99 out <- [ofile]Read Offset <<[0i64] |
100 } | |
101 } | |
102 } | |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
82
diff
changeset
|
103 fd <- open[[[[[file]Name >>]Flatten]Buffer >>]Append[0u8], imode, 438u32] |
79 | 104 error <- If[[fd]=[-1i32]] {} |
105 { | |
80 | 106 ofile <- [[[Build[type] |
79 | 107 ]Name <<[ [file]Name >> ] |
108 ]Descriptor <<[fd] | |
109 ]Info <<[Stat[fd]] | |
110 } | |
111 } | |
112 | |
113 Read@File[file,bytes:data,outfile,error] | |
114 { | |
115 ,error <- [file]Open["r"] | |
116 { | |
117 data,outfile,error <- [~]Read[bytes] | |
118 } | |
119 } | |
80 | 120 /* |
79 | 121 Append@File[file,data:out,error] |
122 { | |
123 ,error <- [file]Open["w"] | |
124 { | |
125 out,error <- [~]Append[data] | |
126 } | |
80 | 127 }*/ |
79 | 128 |
129 String@File[file:out,error] | |
130 { | |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
131 f,error <- [file]Open["r"] |
79 | 132 { |
133 out,error <- String[~] | |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
134 { Close[f] } |
79 | 135 } |
136 } | |
137 | |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
138 Truncate@File[file:out,error] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
139 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
140 f,error <- [file]Open["w"] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
141 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
142 out,error <- Truncate[f] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
143 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
144 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
145 |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
146 Write@File[file,data:out,error] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
147 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
148 f,error <- [file]Open["w"] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
149 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
150 out,error <- [f]Write[data] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
151 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
152 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
153 |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
154 |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
155 String@File Read[file:out,error] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
156 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
157 ,error <- [file]Read[[file]Length] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
158 { out <- String[~] } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
159 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
160 |
79 | 161 Read@File Read[file,inbytes(Int32):data,outfile,error] |
162 { | |
80 | 163 readbytes, mdata <- read[[file]Descriptor >>, [Array[]]Set[inbytes, 0u8], Int64[inbytes]] |
164 error <- If[[readbytes]<[0i64]] {} | |
165 { | |
166 outfile <- file | |
167 data <- [mdata]Length <<[ Trunc Int32[readbytes] ] | |
168 } | |
169 /* | |
170 //Skip buffering for now. Buffering approach may need to change later anyway | |
79 | 171 buflen <- [[file]Buffer >>]Length |
172 If[buflen] | |
173 { | |
174 If[[inbytes]=[buflen]] | |
175 { | |
176 data <- [file]Buffer >> | |
177 outfile <- [file]Buffer <<[Array[]] | |
178 }{ | |
179 If[[inbytes]<[buflen]] | |
180 { | |
181 | |
182 }{ | |
183 | |
184 } | |
185 } | |
186 }{ | |
187 readbytes, mdata <- read[[file]Descriptor >>, [Array[]]Set[inbytes, 0u8], Int64[inbytes]] | |
188 error <- If[[readbytes]<[0i64]] {} | |
189 { | |
190 outfile <- file | |
191 data <- [mdata]Length <<[ Trunc Int32[readbytes] ] | |
192 } | |
80 | 193 } */ |
194 } | |
195 | |
196 Length@File Read[file:out] | |
197 { | |
198 out <- Trunc Int32[[[file]Info >>]Size >>] | |
79 | 199 } |
200 | |
80 | 201 Close@File Read[file:out] |
202 { | |
203 close[[file]Descriptor >>] | |
204 out <- File[[file]Name >>] | |
205 } | |
206 | |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
207 Length@File Write[file:out] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
208 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
209 out <- Trunc Int32[[[file]Info >>]Size >>] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
210 } |
80 | 211 |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
212 Truncate@File Write[file:out,err] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
213 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
214 err <- If[ftruncate[[file]Descriptor >>, 0i64]] {} |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
215 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
216 err <- If[lseek[[file]Descriptor >>, 0i64, 0i32]] {} |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
217 { out <- [file]Info <<[ [[file]Info >>]Size <<[0i64] ] } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
218 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
219 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
220 |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
221 Write@File Write[file,data(Array):out,err] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
222 { |
114
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
223 err <- If[[write[[file]Descriptor >>, data, Int64[[data]Length >>]]]<[0i32]] {} |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
224 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
225 out <- file |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
226 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
227 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
228 |
114
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
229 Write to File@String[str,file:out,err] |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
230 { |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
231 out,err <- [file]Write[[str]Buffer >>] |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
232 } |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
233 |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
234 Write to File@String Slice[str,file:out,err] |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
235 { |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
236 out,err <- [[str]Flatten]Write to File[file] |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
237 } |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
238 |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
239 Write to File@String Cat[str,file:out,err] |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
240 { |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
241 ,err <- [[str]Left >>]Write to File[file] |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
242 { out,err <- [[str]Right >>]Write to File[~] } |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
243 } |
25a205094f9b
More performance optimizations
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
244 |
81
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
245 Close@File Write[file:out] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
246 { |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
247 fsync[[file]Descriptor >>] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
248 { close[[file]Descriptor >>] } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
249 out <- File[[file]Name >>] |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
250 } |
dbe95bfec970
Very basic file access is now working; however, there's a bug involving assigning a literal to a named pipe inside a conditional block that needs fixing
Mike Pavone <pavone@retrodev.com>
parents:
80
diff
changeset
|
251 |