Commits

Guido van Rossum  committed 9773d39

When there's no filename, don't make one up.
Added _test() that behaves (a bit) like gzip.
Fix a comment (*sequential* access is okay -- *random* access it out!)

  • Participants
  • Parent commits cdeeff4
  • Branches legacy-trunk

Comments (0)

Files changed (1)

 
 # implements a python function that reads and writes a gzipped file
 # the user of the file doesn't have to worry about the compression,
-# but sequential access is not allowed
+# but random access is not allowed
 
 # based on Andrew Kuchling's minigzip.py distributed with the zlib module
 
 	    fileobj = self.myfileobj = __builtin__.open(filename, mode or 'r')
         if filename is None:
 	    if hasattr(fileobj, 'name'): filename = fileobj.name
-	    else: filename = 'GzippedFile'
+	    else: filename = ''
         if mode is None:
 	    if hasattr(fileobj, 'mode'): mode = fileobj.mode
 	    else: mode = 'r'
     def _write_gzip_header(self):
 	self.fileobj.write('\037\213')             # magic header
 	self.fileobj.write('\010')                 # compression method
-	self.fileobj.write(chr(FNAME))
+	fname = self.filename[:-3]
+	flags = 0
+	if fname:
+	    flags = FNAME
+	self.fileobj.write(chr(flags))
 	write32(self.fileobj, int(time.time()))
 	self.fileobj.write('\002')
 	self.fileobj.write('\377')
-	self.fileobj.write(self.filename[:-3] + '\000')
+	if fname:
+	    self.fileobj.write(fname + '\000')
 
     def _init_read(self):
 	self.crc = zlib.crc32("")
 	    # Read and discard a null-terminated string containing the filename
 	    while (1):
 		s=self.fileobj.read(1)
-		if s=='\000': break
+		if not s or s=='\000': break
 	if flag & FCOMMENT:
 	    # Read and discard a null-terminated string containing a comment
 	    while (1):
 		s=self.fileobj.read(1)
-		if s=='\000': break
+		if not s or s=='\000': break
 	if flag & FHCRC:
 	    self.fileobj.read(2)     # Read & discard the 16-bit header CRC
 
     def writelines(self, L):
 	for line in L:
 	    self.write(line)
+
+
+def _test():
+    # Act like gzip; with -d, act like gunzip.
+    # The input file is not deleted, however, nor are any other gzip
+    # options or features supported.
+    import sys
+    args = sys.argv[1:]
+    decompress = args and args[0] == "-d"
+    if decompress:
+	args = args[1:]
+    if not args:
+	args = ["-"]
+    for arg in args:
+	if decompress:
+	    if arg == "-":
+		f = GzipFile(filename="", mode="rb", fileobj=sys.stdin)
+		g = sys.stdout
+	    else:
+		if arg[-3:] != ".gz":
+		    print "filename doesn't end in .gz:", `arg`
+		    continue
+		f = open(arg, "rb")
+		g = __builtin__.open(arg[:-3], "wb")
+	else:
+	    if arg == "-":
+		f = sys.stdin
+		g = GzipFile(filename="", mode="wb", fileobj=sys.stdout)
+	    else:
+		f = __builtin__.open(arg, "rb")
+		g = open(arg + ".gz", "wb")
+	while 1:
+	    chunk = f.read(1024)
+	    if not chunk:
+		break
+	    g.write(chunk)
+	if g is not sys.stdout:
+	    g.close()
+	if f is not sys.stdin:
+	    f.close()
+
+if __name__ == '__main__':
+    _test()