Fix some miscellaneous places that incorrectly insisted on str8.
This commit is contained in:
parent
3b116a3187
commit
bce56a6c5b
|
@ -235,19 +235,19 @@ _set_char(const char *name, char *target, PyObject *src, char dflt)
|
||||||
if (src == NULL)
|
if (src == NULL)
|
||||||
*target = dflt;
|
*target = dflt;
|
||||||
else {
|
else {
|
||||||
if (src == Py_None || PyString_Size(src) == 0)
|
|
||||||
*target = '\0';
|
*target = '\0';
|
||||||
else if (!PyString_Check(src) || PyString_Size(src) != 1) {
|
if (src != Py_None) {
|
||||||
|
const char *buf;
|
||||||
|
Py_ssize_t len;
|
||||||
|
if (PyObject_AsCharBuffer(src, &buf, &len) < 0 ||
|
||||||
|
len > 1) {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"\"%s\" must be an 1-character string",
|
"\"%s\" must be an 1-character string",
|
||||||
name);
|
name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else {
|
if (len > 0)
|
||||||
char *s = PyString_AsString(src);
|
*target = buf[0];
|
||||||
if (s == NULL)
|
|
||||||
return -1;
|
|
||||||
*target = s[0];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1144,7 +1144,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
|
||||||
PyObject *zreplacement = NULL; /* py string, replacement for %z */
|
PyObject *zreplacement = NULL; /* py string, replacement for %z */
|
||||||
PyObject *Zreplacement = NULL; /* py string, replacement for %Z */
|
PyObject *Zreplacement = NULL; /* py string, replacement for %Z */
|
||||||
|
|
||||||
char *pin; /* pointer to next char in input format */
|
const char *pin;/* pointer to next char in input format */
|
||||||
|
Py_ssize_t flen;/* length of input format */
|
||||||
char ch; /* next char in input format */
|
char ch; /* next char in input format */
|
||||||
|
|
||||||
PyObject *newfmt = NULL; /* py string, the output format */
|
PyObject *newfmt = NULL; /* py string, the output format */
|
||||||
|
@ -1153,11 +1154,15 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
|
||||||
exclusive of trailing \0 */
|
exclusive of trailing \0 */
|
||||||
int usednew; /* number bytes used so far in output format buffer */
|
int usednew; /* number bytes used so far in output format buffer */
|
||||||
|
|
||||||
char *ptoappend; /* pointer to string to append to output buffer */
|
const char *ptoappend;/* pointer to string to append to output buffer */
|
||||||
int ntoappend; /* # of bytes to append to output buffer */
|
int ntoappend; /* # of bytes to append to output buffer */
|
||||||
|
|
||||||
assert(object && format && timetuple);
|
assert(object && format && timetuple);
|
||||||
assert(PyString_Check(format));
|
assert(PyString_Check(format) || PyUnicode_Check(format));
|
||||||
|
|
||||||
|
/* Convert the input format to a C string and size */
|
||||||
|
if (PyObject_AsCharBuffer(format, &pin, &flen) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* Give up if the year is before 1900.
|
/* Give up if the year is before 1900.
|
||||||
* Python strftime() plays games with the year, and different
|
* Python strftime() plays games with the year, and different
|
||||||
|
@ -1188,13 +1193,12 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
|
||||||
* a new format. Since computing the replacements for those codes
|
* a new format. Since computing the replacements for those codes
|
||||||
* is expensive, don't unless they're actually used.
|
* is expensive, don't unless they're actually used.
|
||||||
*/
|
*/
|
||||||
totalnew = PyString_Size(format) + 1; /* realistic if no %z/%Z */
|
totalnew = flen + 1; /* realistic if no %z/%Z */
|
||||||
newfmt = PyString_FromStringAndSize(NULL, totalnew);
|
newfmt = PyString_FromStringAndSize(NULL, totalnew);
|
||||||
if (newfmt == NULL) goto Done;
|
if (newfmt == NULL) goto Done;
|
||||||
pnew = PyString_AsString(newfmt);
|
pnew = PyString_AsString(newfmt);
|
||||||
usednew = 0;
|
usednew = 0;
|
||||||
|
|
||||||
pin = PyString_AsString(format);
|
|
||||||
while ((ch = *pin++) != '\0') {
|
while ((ch = *pin++) != '\0') {
|
||||||
if (ch != '%') {
|
if (ch != '%') {
|
||||||
ptoappend = pin - 1;
|
ptoappend = pin - 1;
|
||||||
|
@ -2441,8 +2445,8 @@ date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw)
|
||||||
PyObject *tuple;
|
PyObject *tuple;
|
||||||
static char *keywords[] = {"format", NULL};
|
static char *keywords[] = {"format", NULL};
|
||||||
|
|
||||||
if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:strftime", keywords,
|
if (! PyArg_ParseTupleAndKeywords(args, kw, "S:strftime", keywords,
|
||||||
&PyString_Type, &format))
|
&format))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()");
|
tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()");
|
||||||
|
@ -3174,8 +3178,8 @@ time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)
|
||||||
PyObject *tuple;
|
PyObject *tuple;
|
||||||
static char *keywords[] = {"format", NULL};
|
static char *keywords[] = {"format", NULL};
|
||||||
|
|
||||||
if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:strftime", keywords,
|
if (! PyArg_ParseTupleAndKeywords(args, kw, "S:strftime", keywords,
|
||||||
&PyString_Type, &format))
|
&format))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Python's strftime does insane things with the year part of the
|
/* Python's strftime does insane things with the year part of the
|
||||||
|
|
|
@ -6966,13 +6966,19 @@ conv_confname(PyObject *arg, int *valuep, struct constdef *table,
|
||||||
*valuep = PyInt_AS_LONG(arg);
|
*valuep = PyInt_AS_LONG(arg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (PyString_Check(arg)) {
|
else {
|
||||||
/* look up the value in the table using a binary search */
|
/* look up the value in the table using a binary search */
|
||||||
size_t lo = 0;
|
size_t lo = 0;
|
||||||
size_t mid;
|
size_t mid;
|
||||||
size_t hi = tablesize;
|
size_t hi = tablesize;
|
||||||
int cmp;
|
int cmp;
|
||||||
char *confname = PyString_AS_STRING(arg);
|
const char *confname;
|
||||||
|
Py_ssize_t namelen;
|
||||||
|
if (PyObject_AsCharBuffer(arg, &confname, &namelen) < 0) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"configuration names must be strings or integers");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
while (lo < hi) {
|
while (lo < hi) {
|
||||||
mid = (lo + hi) / 2;
|
mid = (lo + hi) / 2;
|
||||||
cmp = strcmp(confname, table[mid].name);
|
cmp = strcmp(confname, table[mid].name);
|
||||||
|
@ -6986,12 +6992,9 @@ conv_confname(PyObject *arg, int *valuep, struct constdef *table,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
|
PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
|
||||||
}
|
|
||||||
else
|
|
||||||
PyErr_SetString(PyExc_TypeError,
|
|
||||||
"configuration names must be strings or integers");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
|
#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
|
||||||
|
|
Loading…
Reference in New Issue