B
    u9arO                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZddddgZd\Z	Z
ZZZd\ZZdd
dZdd ZG dd dZG dd dejZG dd dejZdddZdd Zdd Zedkre  dS )    NGzipFileopencompress
decompress)               )r   r   rb	   c             C   s   d|kr d|krPt d|f n0|d k	r0t d|d k	r@t d|d k	rPt d|dd}t| tttjfr|t| ||}n,t| dst| d	rtd ||| }nt	d
d|krt
||||S |S d S )NtbzInvalid mode: %rz0Argument 'encoding' not supported in binary modez.Argument 'errors' not supported in binary modez/Argument 'newline' not supported in binary mode readwritez1filename must be a str or bytes object, or a file)
ValueErrorreplace
isinstancestrbytesosPathLiker   hasattr	TypeErrorioTextIOWrapper)filenamemodecompresslevelencodingerrorsnewlineZgz_modeZbinary_file r#   /usr/lib/python3.7/gzip.pyr      s$    c             C   s   |  td| d S )Nz<L)r   structpack)outputvaluer#   r#   r$   write32u@   s    r)   c               @   s8   e Zd ZdddZdd ZdddZdd	 Zd
d ZdS )_PaddedFile    c             C   s    || _ t|| _|| _d| _d S )Nr   )_bufferlen_lengthfile_read)selffprependr#   r#   r$   __init__J   s    
z_PaddedFile.__init__c             C   s~   | j d kr| j|S | j | | jkrJ| j }|  j |7  _ | j|| j  S | j }d | _ | j|d  | j|| j |  S d S )N)r0   r/   r   r.   r,   )r1   sizer   r#   r#   r$   r   P   s    
z_PaddedFile.readc             C   s>   | j d kr|| _n|  j t|8  _ d S t| j| _d| _ d S )Nr   )r0   r,   r-   r.   )r1   r3   r#   r#   r$   r3   ]   s    
z_PaddedFile.prependc             C   s   d | _ d | _| j|S )N)r0   r,   r/   seek)r1   Zoffr#   r#   r$   r6   f   s    z_PaddedFile.seekc             C   s   dS )NTr#   )r1   r#   r#   r$   seekablek   s    z_PaddedFile.seekableN)r+   )r+   )__name__
__module____qualname__r4   r   r3   r6   r7   r#   r#   r#   r$   r*   E   s
   

	r*   c               @   s   e Zd ZdZd,ddZedd Zedd Zd	d
 Zdd Z	dd Z
dd Zd-ddZd.ddZdd Zedd Zdd ZejfddZdd Zd d! Zd"d# Zd$d% Zd&d' Zejfd(d)Zd/d*d+ZdS )0r   Nr   c             C   s2  |r"d|ksd|kr"t d||r6d|kr6|d7 }|d krTt||pJd }| _|d kr|t|dd}t|ttfsd}n
t	
|}|d krt|dd}|d	rt| _t|}t|| _|| _nN|d
rt| _| | t|tjtj tjd| _|| _nt d||| _| jtkr.|   d S )Nr   UzInvalid mode: {!r}r   r   namer   r   r)waxr   )r   formatbuiltinsr   	myfileobjgetattrr   r   r   r   fspath
startswithREADr   _GzipReaderr   BufferedReaderr,   r<   WRITE_init_writezlibZcompressobjZDEFLATED	MAX_WBITSZDEF_MEM_LEVELr   _write_mtimefileobj_write_gzip_header)r1   r   r   r   rO   mtimerawr#   r#   r$   r4   {   s>    #


zGzipFile.__init__c             C   sB   dd l }|dtd | jtkr<| jdd  dkr<| jd S | jS )Nr   zuse the name attributer   z.gz)warningswarnDeprecationWarningr   rJ   r<   )r1   rT   r#   r#   r$   r      s
    
zGzipFile.filenamec             C   s
   | j jjS )N)r,   rR   _last_mtime)r1   r#   r#   r$   rQ      s    zGzipFile.mtimec             C   s.   t | j}d|dd  d tt|  d S )Nz<gzip r    >)reprrO   hexid)r1   sr#   r#   r$   __repr__   s    
zGzipFile.__repr__c             C   s.   || _ td| _d| _g | _d| _d| _d S )Nr+   r   )r<   rL   crc32crcr5   Zwritebufbufsizeoffset)r1   r   r#   r#   r$   rK      s    zGzipFile._init_writec             C   s   | j d | j d y<tj| j}t|ts<|d}|	drR|d d }W n t
k
rl   d}Y nX d}|rzt}| j t|d | j}|d krt }t| j t| | j d | j d	 |r| j |d
  d S )Ns      zlatin-1s   .gzrS   r+   r             )rO   r   r   pathbasenamer<   r   r   encodeendswithUnicodeEncodeErrorFNAMEchrrN   timer)   int)r1   ZfnameflagsrQ   r#   r#   r$   rP      s,    



zGzipFile._write_gzip_headerc             C   s   |    | jtkr&dd l}t|jd| jd kr8tdt|t	rLt
|}nt|}|j}|dkr| j| j| |  j|7  _t|| j| _|  j|7  _|S )Nr   z$write() on read-only GzipFile objectz!write() on closed GzipFile object)_check_not_closedr   rJ   errnoOSErrorEBADFrO   r   r   r   r-   
memoryviewnbytesr   r   r5   rL   r`   ra   rc   )r1   datars   lengthr#   r#   r$   r      s     



zGzipFile.writerX   c             C   s2   |    | jtkr&dd l}t|jd| j|S )Nr   z$read() on write-only GzipFile object)rr   r   rG   rs   rt   ru   r,   r   )r1   r5   rs   r#   r#   r$   r     s
    
zGzipFile.readc             C   s@   |    | jtkr&dd l}t|jd|dk r4tj}| j	|S )Nr   z%read1() on write-only GzipFile object)
rr   r   rG   rs   rt   ru   r   DEFAULT_BUFFER_SIZEr,   read1)r1   r5   rs   r#   r#   r$   r{     s    
zGzipFile.read1c             C   s2   |    | jtkr&dd l}t|jd| j|S )Nr   z$peek() on write-only GzipFile object)rr   r   rG   rs   rt   ru   r,   peek)r1   nrs   r#   r#   r$   r|   #  s
    
zGzipFile.peekc             C   s
   | j d kS )N)rO   )r1   r#   r#   r$   closed*  s    zGzipFile.closedc             C   s   | j }|d krd S d | _ zP| jtkrR|| j  t|| j t|| jd@  n| jt	krf| j
  W d | j}|rd | _|  X d S )Nl    )rO   r   rJ   r   r   flushr)   ra   r5   rG   r,   closerC   )r1   rO   rC   r#   r#   r$   r   .  s    

zGzipFile.closec             C   s4   |    | jtkr0| j| j| | j  d S )N)rr   r   rJ   rO   r   r   r   )r1   Z	zlib_moder#   r#   r$   r   A  s    
zGzipFile.flushc             C   s
   | j  S )N)rO   fileno)r1   r#   r#   r$   r   H  s    zGzipFile.filenoc             C   s"   | j tkrtd| jd d S )NzCan't rewind in write moder   )r   rG   rt   r,   r6   )r1   r#   r#   r$   rewindP  s    
zGzipFile.rewindc             C   s
   | j tkS )N)r   rG   )r1   r#   r#   r$   readableW  s    zGzipFile.readablec             C   s
   | j tkS )N)r   rJ   )r1   r#   r#   r$   writableZ  s    zGzipFile.writablec             C   s   dS )NTr#   )r1   r#   r#   r$   r7   ]  s    zGzipFile.seekablec             C   s   | j tkr|tjkr2|tjkr*| j| }ntd|| jk rDtd|| j }d}xt|d D ]}| 	| q`W | 	d|d   n | j t
kr|   | j||S | jS )NzSeek from end not supportedzNegative seek in write modes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   i   rg   )r   rJ   r   SEEK_SETSEEK_CURrc   r   rt   ranger   rG   rr   r,   r6   )r1   rc   whencecountchunkir#   r#   r$   r6   `  s     





zGzipFile.seekc             C   s   |    | j|S )N)rr   r,   readline)r1   r5   r#   r#   r$   r   t  s    zGzipFile.readline)NNr   NN)rX   )rX   )rX   )r8   r9   r:   rC   r4   propertyr   rQ   r_   rK   rP   r   r   r{   r|   r~   r   rL   ZZ_SYNC_FLUSHr   r   r   r   r   r7   r   r   r6   r   r#   r#   r#   r$   r   n   s,    
H

c                   sZ   e Zd Z fddZdd Zdd Zdd Zdd
dZdd Zdd Z	 fddZ
  ZS )rH   c                s,   t  jt|tjtj d d| _d | _d S )N)ZwbitsT)superr4   r*   rL   ZdecompressobjrM   _new_memberrW   )r1   fp)	__class__r#   r$   r4   z  s    z_GzipReader.__init__c             C   s   t d| _d| _d S )Nr+   r   )rL   r`   _crc_stream_size)r1   r#   r#   r$   
_init_read  s    z_GzipReader._init_readc             C   sJ   | j |}x8t||k rD| j |t| }|s:td||7 }qW |S )NzACompressed file ended before the end-of-stream marker was reached)_fpr   r-   EOFError)r1   r}   rx   r   r#   r#   r$   _read_exact  s    z_GzipReader._read_exactc             C   s   | j d}|dkrdS |dkr,td| td| d\}}| _|dkrVtd|t@ r|td	| d\}| | |t@ rx| j d
}|r|dkrP qW |t	@ rx| j d
}|r|dkrP qW |t
@ r| d dS )Nr   r+   Fs   zNot a gzipped file (%r)z<BBIxxr	   zUnknown compression methodz<Hr   rg   T)r   r   rt   r%   unpackr   rW   FEXTRArm   FCOMMENTFHCRC)r1   magicmethodflagZ	extra_lenr^   r#   r#   r$   _read_gzip_header  s0    

z_GzipReader._read_gzip_headerrX   c             C   s   |dk r|   S |sdS x| jjr@|   d| _| jf | j| _| jrh|   |  sb| j	| _
dS d| _| jtj}| j||}| jjdkr| j| jj n| jjdkr| j| jj |dkrP |dkrtdqW | | |  j	t|7  _	|S )Nr   r+   TFzACompressed file ended before the end-of-stream marker was reached)readallZ_decompressoreof	_read_eofr   Z_decomp_factoryZ_decomp_argsr   r   Z_posZ_sizer   r   r   rz   r   Zunconsumed_tailr3   Zunused_datar   _add_read_datar-   )r1   r5   bufZ
uncompressr#   r#   r$   r     s:    

z_GzipReader.readc             C   s$   t || j| _| jt| | _d S )N)rL   r`   r   r   r-   )r1   rx   r#   r#   r$   r     s    z_GzipReader._add_read_datac             C   s   t d| d\}}|| jkr<tdt|t| jf n|| jd@ krRtdd}x|dkrn| jd}qXW |r| j	| d S )Nz<IIr	   zCRC check failed %s != %sl    z!Incorrect length of data producedrg   r   )
r%   r   r   r   rt   r\   r   r   r   r3   )r1   r`   Zisizecr#   r#   r$   r     s    


z_GzipReader._read_eofc                s   t    d| _d S )NT)r   _rewindr   )r1   )r   r#   r$   r     s    
z_GzipReader._rewind)rX   )r8   r9   r:   r4   r   r   r   r   r   r   r   __classcell__r#   r#   )r   r$   rH   y  s   !
3rH   c          	   C   s4   t  }t|d|d}||  W d Q R X | S )Nwb)rO   r   r   )r   BytesIOr   r   getvalue)rx   r   r   r2   r#   r#   r$   r     s    c          	   C   s$   t t| d
}| S Q R X d S )N)rO   )r   r   r   r   )rx   r2   r#   r#   r$   r     s    c              C   s:  t jdd  } | o| d dk}|r.| dd  } | s8dg} x| D ]}|r|dkrjtddt jjd}t jj}q|dd  d	krtd
t| q>t|d}t	|d d d}n>|dkrt jj}tddt jjd}nt	|d}t|d	 d}x|
d}|sP || qW |t jjk	r|  |t jjk	r>|  q>W d S )Nr   r   z-d-r   r   )r   r   rO   rS   z.gzzfilename doesn't end in .gz:r   i   )sysargvr   stdinbufferstdoutprintr[   r   rB   r   r   r   )argsr   argr2   gr   r#   r#   r$   _test  s<    



r   __main__)r   r   NNN)r   )r%   r   ro   r   rL   rB   r   Z_compression__all__ZFTEXTr   r   rm   r   rG   rJ   r   r)   r*   Z
BaseStreamr   ZDecompressReaderrH   r   r   r   r8   r#   r#   r#   r$   <module>   s*     
+)   
	&