bz2 uses bytes everywhere (even for the 'newlines' attribute).

test_bz2 passes.
This commit is contained in:
Guido van Rossum 2007-05-22 23:13:45 +00:00
parent 776152b601
commit 522a6c66ac
2 changed files with 118 additions and 82 deletions

View File

@ -15,9 +15,9 @@ has_cmdline_bunzip2 = sys.platform not in ("win32", "os2emx", "riscos")
class BaseTest(unittest.TestCase): class BaseTest(unittest.TestCase):
"Base for other testcases." "Base for other testcases."
TEXT = 'root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:\ndaemon:x:2:2:daemon:/sbin:\nadm:x:3:4:adm:/var/adm:\nlp:x:4:7:lp:/var/spool/lpd:\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:\nnews:x:9:13:news:/var/spool/news:\nuucp:x:10:14:uucp:/var/spool/uucp:\noperator:x:11:0:operator:/root:\ngames:x:12:100:games:/usr/games:\ngopher:x:13:30:gopher:/usr/lib/gopher-data:\nftp:x:14:50:FTP User:/var/ftp:/bin/bash\nnobody:x:65534:65534:Nobody:/home:\npostfix:x:100:101:postfix:/var/spool/postfix:\nniemeyer:x:500:500::/home/niemeyer:/bin/bash\npostgres:x:101:102:PostgreSQL Server:/var/lib/pgsql:/bin/bash\nmysql:x:102:103:MySQL server:/var/lib/mysql:/bin/bash\nwww:x:103:104::/var/www:/bin/false\n' TEXT = b'root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:\ndaemon:x:2:2:daemon:/sbin:\nadm:x:3:4:adm:/var/adm:\nlp:x:4:7:lp:/var/spool/lpd:\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:\nnews:x:9:13:news:/var/spool/news:\nuucp:x:10:14:uucp:/var/spool/uucp:\noperator:x:11:0:operator:/root:\ngames:x:12:100:games:/usr/games:\ngopher:x:13:30:gopher:/usr/lib/gopher-data:\nftp:x:14:50:FTP User:/var/ftp:/bin/bash\nnobody:x:65534:65534:Nobody:/home:\npostfix:x:100:101:postfix:/var/spool/postfix:\nniemeyer:x:500:500::/home/niemeyer:/bin/bash\npostgres:x:101:102:PostgreSQL Server:/var/lib/pgsql:/bin/bash\nmysql:x:102:103:MySQL server:/var/lib/mysql:/bin/bash\nwww:x:103:104::/var/www:/bin/false\n'
DATA = 'BZh91AY&SY.\xc8N\x18\x00\x01>_\x80\x00\x10@\x02\xff\xf0\x01\x07n\x00?\xe7\xff\xe00\x01\x99\xaa\x00\xc0\x03F\x86\x8c#&\x83F\x9a\x03\x06\xa6\xd0\xa6\x93M\x0fQ\xa7\xa8\x06\x804hh\x12$\x11\xa4i4\xf14S\xd2<Q\xb5\x0fH\xd3\xd4\xdd\xd5\x87\xbb\xf8\x94\r\x8f\xafI\x12\xe1\xc9\xf8/E\x00pu\x89\x12]\xc9\xbbDL\nQ\x0e\t1\x12\xdf\xa0\xc0\x97\xac2O9\x89\x13\x94\x0e\x1c7\x0ed\x95I\x0c\xaaJ\xa4\x18L\x10\x05#\x9c\xaf\xba\xbc/\x97\x8a#C\xc8\xe1\x8cW\xf9\xe2\xd0\xd6M\xa7\x8bXa<e\x84t\xcbL\xb3\xa7\xd9\xcd\xd1\xcb\x84.\xaf\xb3\xab\xab\xad`n}\xa0lh\tE,\x8eZ\x15\x17VH>\x88\xe5\xcd9gd6\x0b\n\xe9\x9b\xd5\x8a\x99\xf7\x08.K\x8ev\xfb\xf7xw\xbb\xdf\xa1\x92\xf1\xdd|/";\xa2\xba\x9f\xd5\xb1#A\xb6\xf6\xb3o\xc9\xc5y\\\xebO\xe7\x85\x9a\xbc\xb6f8\x952\xd5\xd7"%\x89>V,\xf7\xa6z\xe2\x9f\xa3\xdf\x11\x11"\xd6E)I\xa9\x13^\xca\xf3r\xd0\x03U\x922\xf26\xec\xb6\xed\x8b\xc3U\x13\x9d\xc5\x170\xa4\xfa^\x92\xacDF\x8a\x97\xd6\x19\xfe\xdd\xb8\xbd\x1a\x9a\x19\xa3\x80ankR\x8b\xe5\xd83]\xa9\xc6\x08\x82f\xf6\xb9"6l$\xb8j@\xc0\x8a\xb0l1..\xbak\x83ls\x15\xbc\xf4\xc1\x13\xbe\xf8E\xb8\x9d\r\xa8\x9dk\x84\xd3n\xfa\xacQ\x07\xb1%y\xaav\xb4\x08\xe0z\x1b\x16\xf5\x04\xe9\xcc\xb9\x08z\x1en7.G\xfc]\xc9\x14\xe1B@\xbb!8`' DATA = b'BZh91AY&SY.\xc8N\x18\x00\x01>_\x80\x00\x10@\x02\xff\xf0\x01\x07n\x00?\xe7\xff\xe00\x01\x99\xaa\x00\xc0\x03F\x86\x8c#&\x83F\x9a\x03\x06\xa6\xd0\xa6\x93M\x0fQ\xa7\xa8\x06\x804hh\x12$\x11\xa4i4\xf14S\xd2<Q\xb5\x0fH\xd3\xd4\xdd\xd5\x87\xbb\xf8\x94\r\x8f\xafI\x12\xe1\xc9\xf8/E\x00pu\x89\x12]\xc9\xbbDL\nQ\x0e\t1\x12\xdf\xa0\xc0\x97\xac2O9\x89\x13\x94\x0e\x1c7\x0ed\x95I\x0c\xaaJ\xa4\x18L\x10\x05#\x9c\xaf\xba\xbc/\x97\x8a#C\xc8\xe1\x8cW\xf9\xe2\xd0\xd6M\xa7\x8bXa<e\x84t\xcbL\xb3\xa7\xd9\xcd\xd1\xcb\x84.\xaf\xb3\xab\xab\xad`n}\xa0lh\tE,\x8eZ\x15\x17VH>\x88\xe5\xcd9gd6\x0b\n\xe9\x9b\xd5\x8a\x99\xf7\x08.K\x8ev\xfb\xf7xw\xbb\xdf\xa1\x92\xf1\xdd|/";\xa2\xba\x9f\xd5\xb1#A\xb6\xf6\xb3o\xc9\xc5y\\\xebO\xe7\x85\x9a\xbc\xb6f8\x952\xd5\xd7"%\x89>V,\xf7\xa6z\xe2\x9f\xa3\xdf\x11\x11"\xd6E)I\xa9\x13^\xca\xf3r\xd0\x03U\x922\xf26\xec\xb6\xed\x8b\xc3U\x13\x9d\xc5\x170\xa4\xfa^\x92\xacDF\x8a\x97\xd6\x19\xfe\xdd\xb8\xbd\x1a\x9a\x19\xa3\x80ankR\x8b\xe5\xd83]\xa9\xc6\x08\x82f\xf6\xb9"6l$\xb8j@\xc0\x8a\xb0l1..\xbak\x83ls\x15\xbc\xf4\xc1\x13\xbe\xf8E\xb8\x9d\r\xa8\x9dk\x84\xd3n\xfa\xacQ\x07\xb1%y\xaav\xb4\x08\xe0z\x1b\x16\xf5\x04\xe9\xcc\xb9\x08z\x1en7.G\xfc]\xc9\x14\xe1B@\xbb!8`'
DATA_CRLF = 'BZh91AY&SY\xaez\xbbN\x00\x01H\xdf\x80\x00\x12@\x02\xff\xf0\x01\x07n\x00?\xe7\xff\xe0@\x01\xbc\xc6`\x86*\x8d=M\xa9\x9a\x86\xd0L@\x0fI\xa6!\xa1\x13\xc8\x88jdi\x8d@\x03@\x1a\x1a\x0c\x0c\x83 \x00\xc4h2\x19\x01\x82D\x84e\t\xe8\x99\x89\x19\x1ah\x00\r\x1a\x11\xaf\x9b\x0fG\xf5(\x1b\x1f?\t\x12\xcf\xb5\xfc\x95E\x00ps\x89\x12^\xa4\xdd\xa2&\x05(\x87\x04\x98\x89u\xe40%\xb6\x19\'\x8c\xc4\x89\xca\x07\x0e\x1b!\x91UIFU%C\x994!DI\xd2\xfa\xf0\xf1N8W\xde\x13A\xf5\x9cr%?\x9f3;I45A\xd1\x8bT\xb1<l\xba\xcb_\xc00xY\x17r\x17\x88\x08\x08@\xa0\ry@\x10\x04$)`\xf2\xce\x89z\xb0s\xec\x9b.iW\x9d\x81\xb5-+t\x9f\x1a\'\x97dB\xf5x\xb5\xbe.[.\xd7\x0e\x81\xe7\x08\x1cN`\x88\x10\xca\x87\xc3!"\x80\x92R\xa1/\xd1\xc0\xe6mf\xac\xbd\x99\xcca\xb3\x8780>\xa4\xc7\x8d\x1a\\"\xad\xa1\xabyBg\x15\xb9l\x88\x88\x91k"\x94\xa4\xd4\x89\xae*\xa6\x0b\x10\x0c\xd6\xd4m\xe86\xec\xb5j\x8a\x86j\';\xca.\x01I\xf2\xaaJ\xe8\x88\x8cU+t3\xfb\x0c\n\xa33\x13r2\r\x16\xe0\xb3(\xbf\x1d\x83r\xe7M\xf0D\x1365\xd8\x88\xd3\xa4\x92\xcb2\x06\x04\\\xc1\xb0\xea//\xbek&\xd8\xe6+t\xe5\xa1\x13\xada\x16\xder5"w]\xa2i\xb7[\x97R \xe2IT\xcd;Z\x04dk4\xad\x8a\t\xd3\x81z\x10\xf1:^`\xab\x1f\xc5\xdc\x91N\x14$+\x9e\xae\xd3\x80' DATA_CRLF = b'BZh91AY&SY\xaez\xbbN\x00\x01H\xdf\x80\x00\x12@\x02\xff\xf0\x01\x07n\x00?\xe7\xff\xe0@\x01\xbc\xc6`\x86*\x8d=M\xa9\x9a\x86\xd0L@\x0fI\xa6!\xa1\x13\xc8\x88jdi\x8d@\x03@\x1a\x1a\x0c\x0c\x83 \x00\xc4h2\x19\x01\x82D\x84e\t\xe8\x99\x89\x19\x1ah\x00\r\x1a\x11\xaf\x9b\x0fG\xf5(\x1b\x1f?\t\x12\xcf\xb5\xfc\x95E\x00ps\x89\x12^\xa4\xdd\xa2&\x05(\x87\x04\x98\x89u\xe40%\xb6\x19\'\x8c\xc4\x89\xca\x07\x0e\x1b!\x91UIFU%C\x994!DI\xd2\xfa\xf0\xf1N8W\xde\x13A\xf5\x9cr%?\x9f3;I45A\xd1\x8bT\xb1<l\xba\xcb_\xc00xY\x17r\x17\x88\x08\x08@\xa0\ry@\x10\x04$)`\xf2\xce\x89z\xb0s\xec\x9b.iW\x9d\x81\xb5-+t\x9f\x1a\'\x97dB\xf5x\xb5\xbe.[.\xd7\x0e\x81\xe7\x08\x1cN`\x88\x10\xca\x87\xc3!"\x80\x92R\xa1/\xd1\xc0\xe6mf\xac\xbd\x99\xcca\xb3\x8780>\xa4\xc7\x8d\x1a\\"\xad\xa1\xabyBg\x15\xb9l\x88\x88\x91k"\x94\xa4\xd4\x89\xae*\xa6\x0b\x10\x0c\xd6\xd4m\xe86\xec\xb5j\x8a\x86j\';\xca.\x01I\xf2\xaaJ\xe8\x88\x8cU+t3\xfb\x0c\n\xa33\x13r2\r\x16\xe0\xb3(\xbf\x1d\x83r\xe7M\xf0D\x1365\xd8\x88\xd3\xa4\x92\xcb2\x06\x04\\\xc1\xb0\xea//\xbek&\xd8\xe6+t\xe5\xa1\x13\xada\x16\xder5"w]\xa2i\xb7[\x97R \xe2IT\xcd;Z\x04dk4\xad\x8a\t\xd3\x81z\x10\xf1:^`\xab\x1f\xc5\xdc\x91N\x14$+\x9e\xae\xd3\x80'
if has_cmdline_bunzip2: if has_cmdline_bunzip2:
def decompress(self, data): def decompress(self, data):
@ -69,7 +69,7 @@ class BZ2FileTest(BaseTest):
# "Test BZ2File.read() in chunks of 10 bytes" # "Test BZ2File.read() in chunks of 10 bytes"
self.createTempFile() self.createTempFile()
bz2f = BZ2File(self.filename) bz2f = BZ2File(self.filename)
text = '' text = b''
while 1: while 1:
str = bz2f.read(10) str = bz2f.read(10)
if not str: if not str:
@ -117,7 +117,7 @@ class BZ2FileTest(BaseTest):
self.createTempFile() self.createTempFile()
bz2f = BZ2File(self.filename, "rU") bz2f = BZ2File(self.filename, "rU")
self.assertEqual(bz2f.read(), self.TEXT) self.assertEqual(bz2f.read(), self.TEXT)
self.assertEqual(bz2f.newlines, "\n") self.assertEqual(bz2f.newlines, b"\n")
bz2f.close() bz2f.close()
def testUniversalNewlinesCRLF(self): def testUniversalNewlinesCRLF(self):
@ -125,7 +125,7 @@ class BZ2FileTest(BaseTest):
self.createTempFile(crlf=1) self.createTempFile(crlf=1)
bz2f = BZ2File(self.filename, "rU") bz2f = BZ2File(self.filename, "rU")
self.assertEqual(bz2f.read(), self.TEXT) self.assertEqual(bz2f.read(), self.TEXT)
self.assertEqual(bz2f.newlines, "\r\n") self.assertEqual(bz2f.newlines, b"\r\n")
bz2f.close() bz2f.close()
def testWrite(self): def testWrite(self):
@ -207,7 +207,7 @@ class BZ2FileTest(BaseTest):
bz2f = BZ2File(self.filename) bz2f = BZ2File(self.filename)
bz2f.seek(150000) bz2f.seek(150000)
self.assertEqual(bz2f.tell(), len(self.TEXT)) self.assertEqual(bz2f.tell(), len(self.TEXT))
self.assertEqual(bz2f.read(), "") self.assertEqual(bz2f.read(), b"")
bz2f.close() bz2f.close()
def testSeekPostEndTwice(self): def testSeekPostEndTwice(self):
@ -217,7 +217,7 @@ class BZ2FileTest(BaseTest):
bz2f.seek(150000) bz2f.seek(150000)
bz2f.seek(150000) bz2f.seek(150000)
self.assertEqual(bz2f.tell(), len(self.TEXT)) self.assertEqual(bz2f.tell(), len(self.TEXT))
self.assertEqual(bz2f.read(), "") self.assertEqual(bz2f.read(), b"")
bz2f.close() bz2f.close()
def testSeekPreStart(self): def testSeekPreStart(self):
@ -252,18 +252,18 @@ class BZ2FileTest(BaseTest):
def testBug1191043(self): def testBug1191043(self):
# readlines() for files containing no newline # readlines() for files containing no newline
data = 'BZh91AY&SY\xd9b\x89]\x00\x00\x00\x03\x80\x04\x00\x02\x00\x0c\x00 \x00!\x9ah3M\x13<]\xc9\x14\xe1BCe\x8a%t' data = b'BZh91AY&SY\xd9b\x89]\x00\x00\x00\x03\x80\x04\x00\x02\x00\x0c\x00 \x00!\x9ah3M\x13<]\xc9\x14\xe1BCe\x8a%t'
f = open(self.filename, "wb") f = open(self.filename, "wb")
f.write(data) f.write(data)
f.close() f.close()
bz2f = BZ2File(self.filename) bz2f = BZ2File(self.filename)
lines = bz2f.readlines() lines = bz2f.readlines()
bz2f.close() bz2f.close()
self.assertEqual(lines, ['Test']) self.assertEqual(lines, [b'Test'])
bz2f = BZ2File(self.filename) bz2f = BZ2File(self.filename)
xlines = list(bz2f.readlines()) xlines = list(bz2f.readlines())
bz2f.close() bz2f.close()
self.assertEqual(xlines, ['Test']) self.assertEqual(xlines, [b'Test'])
class BZ2CompressorTest(BaseTest): class BZ2CompressorTest(BaseTest):
@ -279,7 +279,7 @@ class BZ2CompressorTest(BaseTest):
# "Test BZ2Compressor.compress()/flush() with chunks of 10 bytes" # "Test BZ2Compressor.compress()/flush() with chunks of 10 bytes"
bz2c = BZ2Compressor() bz2c = BZ2Compressor()
n = 0 n = 0
data = '' data = b''
while 1: while 1:
str = self.TEXT[n*10:(n+1)*10] str = self.TEXT[n*10:(n+1)*10]
if not str: if not str:
@ -303,7 +303,7 @@ class BZ2DecompressorTest(BaseTest):
def testDecompressChunks10(self): def testDecompressChunks10(self):
# "Test BZ2Decompressor.decompress() with chunks of 10 bytes" # "Test BZ2Decompressor.decompress() with chunks of 10 bytes"
bz2d = BZ2Decompressor() bz2d = BZ2Decompressor()
text = '' text = b''
n = 0 n = 0
while 1: while 1:
str = self.DATA[n*10:(n+1)*10] str = self.DATA[n*10:(n+1)*10]
@ -316,7 +316,7 @@ class BZ2DecompressorTest(BaseTest):
def testDecompressUnusedData(self): def testDecompressUnusedData(self):
# "Test BZ2Decompressor.decompress() with unused data" # "Test BZ2Decompressor.decompress() with unused data"
bz2d = BZ2Decompressor() bz2d = BZ2Decompressor()
unused_data = "this is unused data" unused_data = b"this is unused data"
text = bz2d.decompress(self.DATA+unused_data) text = bz2d.decompress(self.DATA+unused_data)
self.assertEqual(text, self.TEXT) self.assertEqual(text, self.TEXT)
self.assertEqual(bz2d.unused_data, unused_data) self.assertEqual(bz2d.unused_data, unused_data)
@ -343,8 +343,8 @@ class FuncTest(BaseTest):
def testDecompressEmpty(self): def testDecompressEmpty(self):
# "Test decompress() function with empty string" # "Test decompress() function with empty string"
text = bz2.decompress("") text = bz2.decompress(b"")
self.assertEqual(text, "") self.assertEqual(text, b"")
def testDecompressIncomplete(self): def testDecompressIncomplete(self):
# "Test decompress() function with incomplete data" # "Test decompress() function with incomplete data"

View File

@ -34,7 +34,7 @@ typedef fpos_t Py_off_t;
#error "Large file support, but neither off_t nor fpos_t is large enough." #error "Large file support, but neither off_t nor fpos_t is large enough."
#endif #endif
#define BUF(v) PyString_AS_STRING((PyStringObject *)v) #define BUF(v) PyBytes_AS_STRING(v)
#define MODE_CLOSED 0 #define MODE_CLOSED 0
#define MODE_READ 1 #define MODE_READ 1
@ -238,7 +238,7 @@ Util_GetLine(BZ2FileObject *f, int n)
int univ_newline = f->f_univ_newline; int univ_newline = f->f_univ_newline;
total_v_size = n > 0 ? n : 100; total_v_size = n > 0 ? n : 100;
v = PyString_FromStringAndSize((char *)NULL, total_v_size); v = PyBytes_FromStringAndSize((char *)NULL, total_v_size);
if (v == NULL) if (v == NULL)
return NULL; return NULL;
@ -311,15 +311,21 @@ Util_GetLine(BZ2FileObject *f, int n)
Py_DECREF(v); Py_DECREF(v);
return NULL; return NULL;
} }
if (_PyString_Resize(&v, total_v_size) < 0) if (PyBytes_Resize(v, total_v_size) < 0) {
Py_DECREF(v);
return NULL; return NULL;
}
buf = BUF(v) + used_v_size; buf = BUF(v) + used_v_size;
end = BUF(v) + total_v_size; end = BUF(v) + total_v_size;
} }
used_v_size = buf - BUF(v); used_v_size = buf - BUF(v);
if (used_v_size != total_v_size) if (used_v_size != total_v_size) {
_PyString_Resize(&v, used_v_size); if (PyBytes_Resize(v, used_v_size) < 0) {
Py_DECREF(v);
v = NULL;
}
}
return v; return v;
} }
@ -442,10 +448,10 @@ Util_ReadAhead(BZ2FileObject *f, int bufsize)
/* This is a hacked version of Python's /* This is a hacked version of Python's
* fileobject.c:readahead_get_line_skip(). */ * fileobject.c:readahead_get_line_skip(). */
static PyStringObject * static PyBytesObject *
Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize) Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize)
{ {
PyStringObject* s; PyBytesObject* s;
char *bufptr; char *bufptr;
char *buf; char *buf;
int len; int len;
@ -456,17 +462,17 @@ Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize)
len = f->f_bufend - f->f_bufptr; len = f->f_bufend - f->f_bufptr;
if (len == 0) if (len == 0)
return (PyStringObject *) return (PyBytesObject *)
PyString_FromStringAndSize(NULL, skip); PyBytes_FromStringAndSize(NULL, skip);
bufptr = memchr(f->f_bufptr, '\n', len); bufptr = memchr(f->f_bufptr, '\n', len);
if (bufptr != NULL) { if (bufptr != NULL) {
bufptr++; /* Count the '\n' */ bufptr++; /* Count the '\n' */
len = bufptr - f->f_bufptr; len = bufptr - f->f_bufptr;
s = (PyStringObject *) s = (PyBytesObject *)
PyString_FromStringAndSize(NULL, skip+len); PyBytes_FromStringAndSize(NULL, skip+len);
if (s == NULL) if (s == NULL)
return NULL; return NULL;
memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len); memcpy(PyBytes_AS_STRING(s)+skip, f->f_bufptr, len);
f->f_bufptr = bufptr; f->f_bufptr = bufptr;
if (bufptr == f->f_bufend) if (bufptr == f->f_bufend)
Util_DropReadAhead(f); Util_DropReadAhead(f);
@ -480,7 +486,7 @@ Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize)
PyMem_Free(buf); PyMem_Free(buf);
return NULL; return NULL;
} }
memcpy(PyString_AS_STRING(s)+skip, bufptr, len); memcpy(PyBytes_AS_STRING(s)+skip, bufptr, len);
PyMem_Free(buf); PyMem_Free(buf);
} }
return s; return s;
@ -513,7 +519,7 @@ BZ2File_read(BZ2FileObject *self, PyObject *args)
case MODE_READ: case MODE_READ:
break; break;
case MODE_READ_EOF: case MODE_READ_EOF:
ret = PyString_FromString(""); ret = PyBytes_FromStringAndSize("", 0);
goto cleanup; goto cleanup;
case MODE_CLOSED: case MODE_CLOSED:
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
@ -535,7 +541,7 @@ BZ2File_read(BZ2FileObject *self, PyObject *args)
"more than a Python string can hold"); "more than a Python string can hold");
goto cleanup; goto cleanup;
} }
ret = PyString_FromStringAndSize((char *)NULL, buffersize); ret = PyBytes_FromStringAndSize((char *)NULL, buffersize);
if (ret == NULL) if (ret == NULL)
goto cleanup; goto cleanup;
bytesread = 0; bytesread = 0;
@ -561,14 +567,21 @@ BZ2File_read(BZ2FileObject *self, PyObject *args)
} }
if (bytesrequested < 0) { if (bytesrequested < 0) {
buffersize = Util_NewBufferSize(buffersize); buffersize = Util_NewBufferSize(buffersize);
if (_PyString_Resize(&ret, buffersize) < 0) if (PyBytes_Resize(ret, buffersize) < 0) {
Py_DECREF(ret);
ret = NULL;
goto cleanup; goto cleanup;
}
} else { } else {
break; break;
} }
} }
if (bytesread != buffersize) if (bytesread != buffersize) {
_PyString_Resize(&ret, bytesread); if (PyBytes_Resize(ret, bytesread) < 0) {
Py_DECREF(ret);
ret = NULL;
}
}
cleanup: cleanup:
RELEASE_LOCK(self); RELEASE_LOCK(self);
@ -598,7 +611,7 @@ BZ2File_readline(BZ2FileObject *self, PyObject *args)
case MODE_READ: case MODE_READ:
break; break;
case MODE_READ_EOF: case MODE_READ_EOF:
ret = PyString_FromString(""); ret = PyBytes_FromStringAndSize("", 0);
goto cleanup; goto cleanup;
case MODE_CLOSED: case MODE_CLOSED:
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
@ -611,7 +624,7 @@ BZ2File_readline(BZ2FileObject *self, PyObject *args)
} }
if (sizehint == 0) if (sizehint == 0)
ret = PyString_FromString(""); ret = PyBytes_FromStringAndSize("", 0);
else else
ret = Util_GetLine(self, (sizehint < 0) ? 0 : sizehint); ret = Util_GetLine(self, (sizehint < 0) ? 0 : sizehint);
@ -705,17 +718,21 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args)
} }
if (big_buffer == NULL) { if (big_buffer == NULL) {
/* Create the big buffer */ /* Create the big buffer */
big_buffer = PyString_FromStringAndSize( big_buffer = PyBytes_FromStringAndSize(
NULL, buffersize); NULL, buffersize);
if (big_buffer == NULL) if (big_buffer == NULL)
goto error; goto error;
buffer = PyString_AS_STRING(big_buffer); buffer = PyBytes_AS_STRING(big_buffer);
memcpy(buffer, small_buffer, nfilled); memcpy(buffer, small_buffer, nfilled);
} }
else { else {
/* Grow the big buffer */ /* Grow the big buffer */
_PyString_Resize(&big_buffer, buffersize); if (PyBytes_Resize(big_buffer, buffersize) < 0){
buffer = PyString_AS_STRING(big_buffer); Py_DECREF(big_buffer);
big_buffer = NULL;
goto error;
}
buffer = PyBytes_AS_STRING(big_buffer);
} }
continue; continue;
} }
@ -724,7 +741,7 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args)
while (p != NULL) { while (p != NULL) {
/* Process complete lines */ /* Process complete lines */
p++; p++;
line = PyString_FromStringAndSize(q, p-q); line = PyBytes_FromStringAndSize(q, p-q);
if (line == NULL) if (line == NULL)
goto error; goto error;
err = PyList_Append(list, line); err = PyList_Append(list, line);
@ -747,18 +764,21 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args)
} }
if (nfilled != 0) { if (nfilled != 0) {
/* Partial last line */ /* Partial last line */
line = PyString_FromStringAndSize(buffer, nfilled); line = PyBytes_FromStringAndSize(buffer, nfilled);
if (line == NULL) if (line == NULL)
goto error; goto error;
if (sizehint > 0) { if (sizehint > 0) {
/* Need to complete the last line */ /* Need to complete the last line */
PyObject *rest = Util_GetLine(self, 0); PyObject *rest = Util_GetLine(self, 0);
PyObject *new;
if (rest == NULL) { if (rest == NULL) {
Py_DECREF(line); Py_DECREF(line);
goto error; goto error;
} }
PyString_Concat(&line, rest); new = PyBytes_Concat(line, rest);
Py_DECREF(line);
Py_DECREF(rest); Py_DECREF(rest);
line = new;
if (line == NULL) if (line == NULL)
goto error; goto error;
} }
@ -903,14 +923,14 @@ BZ2File_writelines(BZ2FileObject *self, PyObject *seq)
if (j == 0) if (j == 0)
break; break;
/* Check that all entries are indeed strings. If not, /* Check that all entries are indeed byte strings. If not,
apply the same rules as for file.write() and apply the same rules as for file.write() and
convert the rets to strings. This is slow, but convert the rets to strings. This is slow, but
seems to be the only way since all conversion APIs seems to be the only way since all conversion APIs
could potentially execute Python code. */ could potentially execute Python code. */
for (i = 0; i < j; i++) { for (i = 0; i < j; i++) {
PyObject *v = PyList_GET_ITEM(list, i); PyObject *v = PyList_GET_ITEM(list, i);
if (!PyString_Check(v)) { if (!PyBytes_Check(v)) {
const char *buffer; const char *buffer;
Py_ssize_t len; Py_ssize_t len;
if (PyObject_AsCharBuffer(v, &buffer, &len)) { if (PyObject_AsCharBuffer(v, &buffer, &len)) {
@ -918,10 +938,10 @@ BZ2File_writelines(BZ2FileObject *self, PyObject *seq)
"writelines() " "writelines() "
"argument must be " "argument must be "
"a sequence of " "a sequence of "
"strings"); "bytes objects");
goto error; goto error;
} }
line = PyString_FromStringAndSize(buffer, line = PyBytes_FromStringAndSize(buffer,
len); len);
if (line == NULL) if (line == NULL)
goto error; goto error;
@ -935,9 +955,9 @@ BZ2File_writelines(BZ2FileObject *self, PyObject *seq)
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
for (i = 0; i < j; i++) { for (i = 0; i < j; i++) {
line = PyList_GET_ITEM(list, i); line = PyList_GET_ITEM(list, i);
len = PyString_GET_SIZE(line); len = PyBytes_GET_SIZE(line);
BZ2_bzWrite (&bzerror, self->fp, BZ2_bzWrite (&bzerror, self->fp,
PyString_AS_STRING(line), len); PyBytes_AS_STRING(line), len);
if (bzerror != BZ_OK) { if (bzerror != BZ_OK) {
Py_BLOCK_THREADS Py_BLOCK_THREADS
Util_CatchBZ2Error(bzerror); Util_CatchBZ2Error(bzerror);
@ -1206,13 +1226,13 @@ BZ2File_get_newlines(BZ2FileObject *self, void *closure)
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
case NEWLINE_CR: case NEWLINE_CR:
return PyString_FromString("\r"); return PyBytes_FromStringAndSize("\r", 1);
case NEWLINE_LF: case NEWLINE_LF:
return PyString_FromString("\n"); return PyBytes_FromStringAndSize("\n", 1);
case NEWLINE_CR|NEWLINE_LF: case NEWLINE_CR|NEWLINE_LF:
return Py_BuildValue("(ss)", "\r", "\n"); return Py_BuildValue("(ss)", "\r", "\n");
case NEWLINE_CRLF: case NEWLINE_CRLF:
return PyString_FromString("\r\n"); return PyBytes_FromStringAndSize("\r\n", 2);
case NEWLINE_CR|NEWLINE_CRLF: case NEWLINE_CR|NEWLINE_CRLF:
return Py_BuildValue("(ss)", "\r", "\r\n"); return Py_BuildValue("(ss)", "\r", "\r\n");
case NEWLINE_LF|NEWLINE_CRLF: case NEWLINE_LF|NEWLINE_CRLF:
@ -1413,7 +1433,7 @@ BZ2File_getiter(BZ2FileObject *self)
static PyObject * static PyObject *
BZ2File_iternext(BZ2FileObject *self) BZ2File_iternext(BZ2FileObject *self)
{ {
PyStringObject* ret; PyBytesObject* ret;
ACQUIRE_LOCK(self); ACQUIRE_LOCK(self);
if (self->mode == MODE_CLOSED) { if (self->mode == MODE_CLOSED) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
@ -1422,7 +1442,7 @@ BZ2File_iternext(BZ2FileObject *self)
} }
ret = Util_ReadAheadGetLineSkip(self, 0, READAHEAD_BUFSIZE); ret = Util_ReadAheadGetLineSkip(self, 0, READAHEAD_BUFSIZE);
RELEASE_LOCK(self); RELEASE_LOCK(self);
if (ret == NULL || PyString_GET_SIZE(ret) == 0) { if (ret == NULL || PyBytes_GET_SIZE(ret) == 0) {
Py_XDECREF(ret); Py_XDECREF(ret);
return NULL; return NULL;
} }
@ -1525,7 +1545,7 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args)
return NULL; return NULL;
if (datasize == 0) if (datasize == 0)
return PyString_FromString(""); return PyBytes_FromStringAndSize("", 0);
ACQUIRE_LOCK(self); ACQUIRE_LOCK(self);
if (!self->running) { if (!self->running) {
@ -1534,7 +1554,7 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args)
goto error; goto error;
} }
ret = PyString_FromStringAndSize(NULL, bufsize); ret = PyBytes_FromStringAndSize(NULL, bufsize);
if (!ret) if (!ret)
goto error; goto error;
@ -1557,7 +1577,7 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args)
break; /* no more input data */ break; /* no more input data */
if (bzs->avail_out == 0) { if (bzs->avail_out == 0) {
bufsize = Util_NewBufferSize(bufsize); bufsize = Util_NewBufferSize(bufsize);
if (_PyString_Resize(&ret, bufsize) < 0) { if (PyBytes_Resize(ret, bufsize) < 0) {
BZ2_bzCompressEnd(bzs); BZ2_bzCompressEnd(bzs);
goto error; goto error;
} }
@ -1567,7 +1587,9 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args)
} }
} }
_PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); if (PyBytes_Resize(ret,
(Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)) < 0)
goto error;
RELEASE_LOCK(self); RELEASE_LOCK(self);
return ret; return ret;
@ -1602,7 +1624,7 @@ BZ2Comp_flush(BZ2CompObject *self)
} }
self->running = 0; self->running = 0;
ret = PyString_FromStringAndSize(NULL, bufsize); ret = PyBytes_FromStringAndSize(NULL, bufsize);
if (!ret) if (!ret)
goto error; goto error;
@ -1623,7 +1645,7 @@ BZ2Comp_flush(BZ2CompObject *self)
} }
if (bzs->avail_out == 0) { if (bzs->avail_out == 0) {
bufsize = Util_NewBufferSize(bufsize); bufsize = Util_NewBufferSize(bufsize);
if (_PyString_Resize(&ret, bufsize) < 0) if (PyBytes_Resize(ret, bufsize) < 0)
goto error; goto error;
bzs->next_out = BUF(ret); bzs->next_out = BUF(ret);
bzs->next_out = BUF(ret) + (BZS_TOTAL_OUT(bzs) bzs->next_out = BUF(ret) + (BZS_TOTAL_OUT(bzs)
@ -1632,8 +1654,11 @@ BZ2Comp_flush(BZ2CompObject *self)
} }
} }
if (bzs->avail_out != 0) if (bzs->avail_out != 0) {
_PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); if (PyBytes_Resize(ret,
(Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)) < 0)
goto error;
}
RELEASE_LOCK(self); RELEASE_LOCK(self);
return ret; return ret;
@ -1816,7 +1841,7 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args)
goto error; goto error;
} }
ret = PyString_FromStringAndSize(NULL, bufsize); ret = PyBytes_FromStringAndSize(NULL, bufsize);
if (!ret) if (!ret)
goto error; goto error;
@ -1835,7 +1860,7 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args)
if (bzs->avail_in != 0) { if (bzs->avail_in != 0) {
Py_DECREF(self->unused_data); Py_DECREF(self->unused_data);
self->unused_data = self->unused_data =
PyString_FromStringAndSize(bzs->next_in, PyBytes_FromStringAndSize(bzs->next_in,
bzs->avail_in); bzs->avail_in);
} }
self->running = 0; self->running = 0;
@ -1849,7 +1874,7 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args)
break; /* no more input data */ break; /* no more input data */
if (bzs->avail_out == 0) { if (bzs->avail_out == 0) {
bufsize = Util_NewBufferSize(bufsize); bufsize = Util_NewBufferSize(bufsize);
if (_PyString_Resize(&ret, bufsize) < 0) { if (PyBytes_Resize(ret, bufsize) < 0) {
BZ2_bzDecompressEnd(bzs); BZ2_bzDecompressEnd(bzs);
goto error; goto error;
} }
@ -1860,8 +1885,11 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args)
} }
} }
if (bzs->avail_out != 0) if (bzs->avail_out != 0) {
_PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); if (PyBytes_Resize(ret,
(Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)) < 0)
goto error;
}
RELEASE_LOCK(self); RELEASE_LOCK(self);
return ret; return ret;
@ -1897,7 +1925,7 @@ BZ2Decomp_init(BZ2DecompObject *self, PyObject *args, PyObject *kwargs)
} }
#endif #endif
self->unused_data = PyString_FromString(""); self->unused_data = PyBytes_FromStringAndSize("", 0);
if (!self->unused_data) if (!self->unused_data)
goto error; goto error;
@ -2031,7 +2059,7 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs)
* data in one shot. We will check it later anyway. */ * data in one shot. We will check it later anyway. */
bufsize = datasize + (datasize/100+1) + 600; bufsize = datasize + (datasize/100+1) + 600;
ret = PyString_FromStringAndSize(NULL, bufsize); ret = PyBytes_FromStringAndSize(NULL, bufsize);
if (!ret) if (!ret)
return NULL; return NULL;
@ -2063,7 +2091,7 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs)
} }
if (bzs->avail_out == 0) { if (bzs->avail_out == 0) {
bufsize = Util_NewBufferSize(bufsize); bufsize = Util_NewBufferSize(bufsize);
if (_PyString_Resize(&ret, bufsize) < 0) { if (PyBytes_Resize(ret, bufsize) < 0) {
BZ2_bzCompressEnd(bzs); BZ2_bzCompressEnd(bzs);
Py_DECREF(ret); Py_DECREF(ret);
return NULL; return NULL;
@ -2073,8 +2101,12 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs)
} }
} }
if (bzs->avail_out != 0) if (bzs->avail_out != 0) {
_PyString_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)); if (PyBytes_Resize(ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)) < 0) {
Py_DECREF(ret);
ret = NULL;
}
}
BZ2_bzCompressEnd(bzs); BZ2_bzCompressEnd(bzs);
return ret; return ret;
@ -2102,9 +2134,9 @@ bz2_decompress(PyObject *self, PyObject *args)
return NULL; return NULL;
if (datasize == 0) if (datasize == 0)
return PyString_FromString(""); return PyBytes_FromStringAndSize("", 0);
ret = PyString_FromStringAndSize(NULL, bufsize); ret = PyBytes_FromStringAndSize(NULL, bufsize);
if (!ret) if (!ret)
return NULL; return NULL;
@ -2143,7 +2175,7 @@ bz2_decompress(PyObject *self, PyObject *args)
} }
if (bzs->avail_out == 0) { if (bzs->avail_out == 0) {
bufsize = Util_NewBufferSize(bufsize); bufsize = Util_NewBufferSize(bufsize);
if (_PyString_Resize(&ret, bufsize) < 0) { if (PyBytes_Resize(ret, bufsize) < 0) {
BZ2_bzDecompressEnd(bzs); BZ2_bzDecompressEnd(bzs);
Py_DECREF(ret); Py_DECREF(ret);
return NULL; return NULL;
@ -2153,8 +2185,12 @@ bz2_decompress(PyObject *self, PyObject *args)
} }
} }
if (bzs->avail_out != 0) if (bzs->avail_out != 0) {
_PyString_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)); if (PyBytes_Resize(ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)) < 0) {
Py_DECREF(ret);
ret = NULL;
}
}
BZ2_bzDecompressEnd(bzs); BZ2_bzDecompressEnd(bzs);
return ret; return ret;