8000 py: introduce FileModeFrom · go-python/gpython@88633c0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 88633c0

Browse files
committed
py: introduce FileModeFrom
Signed-off-by: Sebastien Binet <binet@cern.ch>
1 parent 795df15 commit 88633c0

File tree

1 file changed

+67
-64
lines changed

1 file changed

+67
-64
lines changed

py/file.go

Lines changed: 67 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -166,71 +166,10 @@ func (o *File) M__exit__(exc_type, exc_value, traceback Object) (Object, error)
166166
}
167167

168168
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
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
281220
var _ I__enter__ = (*File)(nil)
282221
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

Comments
 (0)
0