(original) (raw)
Index: Modules/_fileio.c =================================================================== --- Modules/_fileio.c (revision 68204) +++ Modules/_fileio.c (working copy) @@ -180,30 +180,19 @@ } } - s = mode; - while (*s) { - switch (*s++) { + for(s=mode; *s; ++s) { + switch (*s) { case 'r': - if (rwa) { - bad_mode: - PyErr_SetString(PyExc_ValueError, - "Must have exactly one of read/write/append mode"); - goto error; - } - rwa = 1; + ++rwa; self->readable = 1; break; case 'w': - if (rwa) - goto bad_mode; - rwa = 1; + ++rwa; self->writable = 1; flags |= O_CREAT | O_TRUNC; break; case 'a': - if (rwa) - goto bad_mode; - rwa = 1; + ++rwa; self->writable = 1; flags |= O_CREAT; append = 1; @@ -211,10 +200,8 @@ case 'b': break; case '+': - if (plus) - goto bad_mode; + ++plus; self->readable = self->writable = 1; - plus = 1; break; default: PyErr_Format(PyExc_ValueError, @@ -222,10 +209,12 @@ goto error; } } + if ((rwa!=1) || (plus>1)) { + PyErr_SetString(PyExc_ValueError, + "Must have exactly one of read/write/append mode and at most one optional plus"); + goto error; + } - if (!rwa) - goto bad_mode; - if (self->readable && self->writable) flags |= O_RDWR; else if (self->readable)