@@ -166,71 +166,10 @@ func (o *File) M__exit__(exc_type, exc_value, traceback Object) (Object, error)
166
166
}
167
167
168
168
func OpenFile (filename , mode string , buffering int ) (Object , error ) {
169
- var fileMode FileMode
170
- var truncate bool
171
- var exclusive bool
172
-
173
- for _ , m := range mode {
174
- switch m {
175
- case 'r' :
176
- if fileMode & FileReadWrite != 0 {
177
- return nil , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
178
- }
179
- fileMode |= FileRead
180
-
181
- case 'w' :
182
- if fileMode & FileReadWrite != 0 {
183
- return nil , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
184
- }
185
- fileMode |= FileWrite
186
- truncate = true
187
-
188
- case 'x' :
189
- if fileMode & FileReadWrite != 0 {
190
- return nil , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
191
- }
192
- fileMode |= FileWrite
193
- exclusive = true
194
-
195
- case 'a' :
196
- if fileMode & FileReadWrite != 0 {
197
- return nil , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
198
- }
199
- fileMode |= FileWrite
200
- truncate = false
201
-
202
- case '+' :
203
- if fileMode & FileReadWrite == 0 {
204
- return nil , ExceptionNewf (ValueError , "Must have exactly one of create/read/write/append mode and at most one plus" )
205
- }
206
-
207
- truncate = (fileMode & FileWrite ) != 0
208
- fileMode |= FileReadWrite
209
-
210
- case 'b' :
211
- if fileMode & FileReadWrite == 0 {
212
- return nil , ExceptionNewf (ValueError , "Must have exactly one of create/read/write/append mode and at most one plus" )
213
- }
214
-
215
- if fileMode & FileText != 0 {
216
- return nil , ExceptionNewf (ValueError , "can't have text and binary mode at once" )
217
- }
218
-
219
- fileMode |= FileBinary
220
-
221
- case 't' :
222
- if fileMode & FileReadWrite == 0 {
223
- return nil , ExceptionNewf (ValueError , "Must have exactly one of create/read/write/append mode and at most one plus" )
224
- }
225
-
226
- if fileMode & FileBinary != 0 {
227
- return nil , ExceptionNewf (ValueError , "can't have text and binary mode at once" )
228
- }
229
-
230
- fileMode |= FileText
231
- }
169
+ fileMode , truncate , exclusive , err := FileModeFrom (mode )
170
+ if err != nil {
171
+ return nil , err
232
172
}
233
-
234
173
var fmode int
235
174
236
175
switch fileMode & FileReadWrite {
@@ -280,3 +219,67 @@ func OpenFile(filename, mode string, buffering int) (Object, error) {
280
219
// Check interface is satisfied
281
220
var _ I__enter__ = (* File )(nil )
282
221
var _ I__exit__ = (* File )(nil )
222
+
223
+ func FileModeFrom (mode string ) (perm FileMode , trunc , excl bool , err error ) {
224
+ for _ , m := range mode {
225
+ switch m {
226
+ case 'r' :
227
+ if perm & FileReadWrite != 0 {
228
+ return 0 , false , false , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
229
+ }
230
+ perm |= FileRead
231
+
232
+ case 'w' :
233
+ if perm & FileReadWrite != 0 {
234
+ return 0 , false , false , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
235
+ }
236
+ perm |= FileWrite
237
+ trunc = true
238
+
239
+ case 'x' :
240
+ if perm & FileReadWrite != 0 {
241
+ return 0 , false , false , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
242
+ }
243
+ perm |= FileWrite
244
+ excl = true
245
+
246
+ case 'a' :
247
+ if perm & FileReadWrite != 0 {
248
+ return 0 , false , false , ExceptionNewf (ValueError , "must have exactly one of create/read/write/append mode" )
249
+ }
250
+ perm |= FileWrite
251
+ trunc = false
252
+
253
+ case '+' :
254
+ if perm & FileReadWrite == 0 {
255
+ return 0 , false , false , ExceptionNewf (ValueError , "Must have exactly one of create/read/write/append mode and at most one plus" )
256
+ }
257
+
258
+ trunc = (perm & FileWrite ) != 0
259
+ perm |= FileReadWrite
260
+
261
+ case 'b' :
262
+ if perm & FileReadWrite == 0 {
263
+ return 0 , false , false , ExceptionNewf (ValueError , "Must have exactly one of create/read/write/append mode and at most one plus" )
264
+ }
265
+
266
+ if perm & FileText != 0 {
267
+ return 0 , false , false , ExceptionNewf (ValueError , "can't have text and binary mode at once" )
268
+ }
269
+
270
+ perm |= FileBinary
271
+
272
+ case 't' :
273
+ if perm & FileReadWrite == 0 {
274
+ return 0 , false , false , ExceptionNewf (ValueError , "Must have exactly one of create/read/write/append mode and at most one plus" )
275
+ }
276
+
277
+ if perm & FileBinary != 0 {
278
+ return 0 , false , false , ExceptionNewf (ValueError , "can't have text and binary mode at once" )
279
+ }
280
+
281
+ perm |= FileText
282
+ }
283
+ }
284
+ return perm , trunc , excl , nil
285
+ }
0 commit comments