@@ -166,71 +166,10 @@ func (o *File) M__exit__(exc_type, exc_value, traceback Object) (Object, error)
166166}
167167
168168func 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
232172 }
233-
234173 var fmode int
235174
236175 switch fileMode & FileReadWrite {
@@ -280,3 +219,67 @@ func OpenFile(filename, mode string, buffering int) (Object, error) {
280219// Check interface is satisfied
281220var _ I__enter__ = (* File )(nil )
282221var _ 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