diff options
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/object.c | 23 | ||||
-rw-r--r-- | Objects/stringobject.c | 21 | ||||
-rw-r--r-- | Objects/xxobject.c | 1 |
3 files changed, 34 insertions, 11 deletions
diff --git a/Objects/object.c b/Objects/object.c index 9a8d4b3..e28158e 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -213,6 +213,29 @@ setattr(v, name, w) } } +/* Test a value used as condition, e.g., in a for or if statement. + Return -1 if an error occurred */ + +int +testbool(v) + object *v; +{ + int res; + if (v == None) + res = 0; + else if (v->ob_type->tp_as_number != NULL) + res = (*v->ob_type->tp_as_number->nb_nonzero)(v); + else if (v->ob_type->tp_as_mapping != NULL) + res = (*v->ob_type->tp_as_mapping->mp_length)(v); + else if (v->ob_type->tp_as_sequence != NULL) + res = (*v->ob_type->tp_as_sequence->sq_length)(v); + else + res = 1; + if (res > 0) + res = 1; + return res; +} + /* NoObject is usable as a non-NULL undefined value, used by the macro None. diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 5c7345d..33fe485 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -491,13 +491,13 @@ formatstring(format, args) err_badcall(); return NULL; } - reslen = rescnt = 100; + fmt = getstringvalue(format); + fmtcnt = getstringsize(format); + reslen = rescnt = fmtcnt + 100; result = newsizedstringobject((char *)NULL, reslen); if (result == NULL) return NULL; res = getstringvalue(result); - fmt = getstringvalue(format); - fmtcnt = getstringsize(format); if (is_tupleobject(args)) { arglen = gettuplesize(args); argidx = 0; @@ -509,12 +509,11 @@ formatstring(format, args) while (--fmtcnt >= 0) { if (*fmt != '%') { if (--rescnt < 0) { - rescnt = reslen; - reslen = reslen * 2; /* Maybe less when big? */ + rescnt = fmtcnt + 100; + reslen += rescnt; if (resizestring(&result, reslen) < 0) return NULL; - res = getstringvalue(result) + rescnt; - rescnt = reslen - rescnt; + res = getstringvalue(result) + reslen - rescnt; } *res++ = *fmt++; } @@ -692,12 +691,12 @@ formatstring(format, args) if (width < len) width = len; if (rescnt < width + (sign != '\0')) { - rescnt = reslen; - reslen = reslen + width + 100; + reslen -= rescnt; + rescnt = width + fmtcnt + 100; + reslen += rescnt; if (resizestring(&result, reslen) < 0) return NULL; - res = getstringvalue(result) + rescnt; - rescnt = reslen - rescnt; + res = getstringvalue(result) + reslen - rescnt; } if (sign) { *res++ = sign; diff --git a/Objects/xxobject.c b/Objects/xxobject.c index 2d03cfd..64e0228 100644 --- a/Objects/xxobject.c +++ b/Objects/xxobject.c @@ -137,4 +137,5 @@ static typeobject Xxtype = { 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ }; |