a
    zeU                     @   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g dZd\Z	Z
ZZZd\ZZdZdZdZdedddfd	d
Zdd ZG dd dZG dd deZG dd dejZG dd dejZefddddZdd Zdd Zedkre  dS )    N)BadGzipFileGzipFileopencompress
decompress)               )r   r   r      	   rbc                 C   s   d|v r d|v rPt d|f n0|d ur0t d|d ur@t d|d urPt d|dd}t| tttjfr|t| ||}n,t| dst| d	rtd ||| }nt	d
d|v 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_modebinary_file r&   /usr/lib/python3.9/gzip.pyr      s$    r   c                 C   s   |  td| d S )Nz<L)r   structpack)outputvaluer&   r&   r'   write32uE   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__O   s    
z_PaddedFile.__init__c                 C   s~   | j d u r| j|S | j | | jkrJ| j }|  j |7  _ | j|| j  S | j }d | _ | j|d  | j|| j |  S d S N)r4   r3   r   r2   r0   )r5   sizer   r&   r&   r'   r   U   s    
z_PaddedFile.readc                 C   s>   | j d u r|| _n|  j t|8  _ d S t| j| _d| _ d S r/   )r4   r0   r1   r2   )r5   r7   r&   r&   r'   r7   b   s    
z_PaddedFile.prependc                 C   s   d | _ d | _| j|S r9   )r4   r0   r3   seek)r5   Zoffr&   r&   r'   r;   k   s    z_PaddedFile.seekc                 C   s   dS NTr&   r5   r&   r&   r'   seekablep   s    z_PaddedFile.seekableN)r.   )r.   )__name__
__module____qualname__r8   r   r7   r;   r>   r&   r&   r&   r'   r-   J   s
   

	r-   c                   @   s   e Zd ZdS )r   N)r?   r@   rA   r&   r&   r&   r'   r   t   s   r   c                   @   s   e Zd ZdZddeddf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 ).r   Nc           	      C   sV  |r"d|v sd|v r"t d||r6d|vr6|d7 }|d u rTt||pJd }| _|d u r|t|dd}t|ttfsd}n
t	
|}|}|d u rt|dd}|d	rt| _t|}t|| _|| _nl|d
r(|d u rdd l}|dtd t| _| | t|tjtj tjd| _|| _nt d||| _| jtkrR|  | d S )Nr   UzInvalid mode: {!r}r   r   namer   r    r)waxr   zGzipFile was opened for writing, but this will change in future Python releases.  Specify the mode argument for opening it for writing.r   )!r   formatbuiltinsr   	myfileobjgetattrr   r   r   r   fspath
startswithREADr    _GzipReaderr   BufferedReaderr0   rC   warningswarnFutureWarningWRITE_init_writezlibcompressobjDEFLATED	MAX_WBITSDEF_MEM_LEVELr   _write_mtimefileobj_write_gzip_header)	r5   r   r    r!   r\   mtimeZorigmoderawrQ   r&   r&   r'   r8      sN    #


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   .gz)rQ   rR   DeprecationWarningr    rT   rC   )r5   rQ   r&   r&   r'   r      s
    
zGzipFile.filenamec                 C   s
   | j jjS r9   )r0   r_   _last_mtimer=   r&   r&   r'   r^      s    zGzipFile.mtimec                 C   s.   t | j}d|dd  d tt|  d S )Nz<gzip r    >)reprr\   hexid)r5   sr&   r&   r'   __repr__   s    
zGzipFile.__repr__c                 C   s.   || _ td| _d| _g | _d| _d| _d S Nr.   r   )rC   rV   crc32crcr:   Zwritebufbufsizeoffset)r5   r   r&   r&   r'   rU      s    zGzipFile._init_writec                 C   s  | j d | j d z<tj| j}t|ts<|d}|	drR|d d }W n t
yj   d}Y n0 d}|rxt}| j t|d | j}|d u rt }t| j t| |tkrd}n|tkrd	}nd
}| j | | j d |r| j |d
  d S )N      zlatin-1s   .gzr`   r.   r                )r\   r   r   pathbasenamerC   r   r   encodeendswithUnicodeEncodeErrorFNAMEchrr[   timer,   int_COMPRESS_LEVEL_BEST_COMPRESS_LEVEL_FAST)r5   r!   Zfnameflagsr^   Zxflr&   r&   r'   r]      s6    



zGzipFile._write_gzip_headerc                 C   s   |    | jtkr&dd l}t|jd| jd u 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    rT   errnoOSErrorEBADFr\   r   r   r   r1   
memoryviewnbytesr   r   r:   rV   rm   rn   rp   )r5   datar   lengthr&   r&   r'   r     s     



zGzipFile.writerd   c                 C   s2   |    | jtkr&dd l}t|jd| j|S )Nr   z$read() on write-only GzipFile object)r   r    rN   r   r   r   r0   r   r5   r:   r   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)
r   r    rN   r   r   r   r   DEFAULT_BUFFER_SIZEr0   read1r   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)r   r    rN   r   r   r   r0   peek)r5   nr   r&   r&   r'   r   ;  s
    
zGzipFile.peekc                 C   s
   | j d u S r9   r\   r=   r&   r&   r'   closedB  s    zGzipFile.closedc                 C   s   | j }|d u rd S d | _ zh| jtkrR|| j  t|| j t|| jd@  n| jt	krf| j
  W | j}|rd | _|  n| j}|rd | _|  0 d S )N    )r\   r    rT   r   r   flushr,   rn   r:   rN   r0   closerJ   )r5   r\   rJ   r&   r&   r'   r   F  s&    


zGzipFile.closec                 C   s4   |    | jtkr0| j| j| | j  d S r9   )r   r    rT   r\   r   r   r   )r5   Z	zlib_moder&   r&   r'   r   Y  s    
zGzipFile.flushc                 C   s
   | j  S r9   )r\   filenor=   r&   r&   r'   r   `  s    zGzipFile.filenoc                 C   s"   | j tkrtd| jd d S )NzCan't rewind in write moder   )r    rN   r   r0   r;   r=   r&   r&   r'   rewindh  s    
zGzipFile.rewindc                 C   s
   | j tkS r9   )r    rN   r=   r&   r&   r'   readableo  s    zGzipFile.readablec                 C   s
   | j tkS r9   )r    rT   r=   r&   r&   r'   writabler  s    zGzipFile.writablec                 C   s   dS r<   r&   r=   r&   r&   r'   r>   u  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}t|d D ]}| 	| q^| 	d|d   n | j t
kr|   | j||S | jS )NzSeek from end not supportedzNegative seek in write modes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      ru   )r    rT   r   SEEK_SETSEEK_CURrp   r   r   ranger   rN   r   r0   r;   )r5   rp   whencecountchunkir&   r&   r'   r;   x  s     





zGzipFile.seekc                 C   s   |    | j|S r9   )r   r0   readline)r5   r:   r&   r&   r'   r     s    zGzipFile.readline)rd   )rd   )rd   )r?   r@   rA   rJ   r   r8   propertyr   r^   rk   rU   r]   r   r   r   r   r   r   rV   Z_SYNC_FLUSHr   r   r   r   r   r>   r   r   r;   r   r&   r&   r&   r'   r   x   s4   
Q

 


r   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 )rO   c                    s,   t  jt|tjtj d d| _d | _d S )N)ZwbitsT)superr8   r-   rV   decompressobjrY   _new_memberrc   )r5   fp	__class__r&   r'   r8     s
    z_GzipReader.__init__c                 C   s   t d| _d| _d S rl   )rV   rm   _crc_stream_sizer=   r&   r&   r'   
_init_read  s    z_GzipReader._init_readc                 C   sF   | j |}t||k rB| j |t| }|s8td||7 }q|S )NACompressed file ended before the end-of-stream marker was reached)_fpr   r1   EOFError)r5   r   r   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@ r| j d
}|r|dkrqq|t	@ r| j d
}|r|dkrqq|t
@ r| d dS )Nr   r.   Frq   zNot a gzipped file (%r)z<BBIxxr
   zUnknown compression methodz<Hr   ru   T)r   r   r   r(   unpackr   rc   FEXTRAr|   FCOMMENTFHCRC)r5   magicmethodflagZ	extra_lenrj   r&   r&   r'   _read_gzip_header  s0    

z_GzipReader._read_gzip_headerrd   c                 C   s   |dk r|   S |sdS | jjrB|   d| _| jf i | j| _| jrj|   |  sd| 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rq|dkrtdq| | |  j	t|7  _	|S )Nr   r.   TFr   )readall_decompressoreof	_read_eofr   _decomp_factory_decomp_argsr   r   _pos_sizer   r   r   r   r   unconsumed_tailr7   unused_datar   _add_read_datar1   )r5   r:   bufZ
uncompressr&   r&   r'   r     s:    

z_GzipReader.readc                 C   s$   t || j| _| jt| | _d S r9   )rV   rm   r   r   r1   )r5   r   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}|dkrl| jd}qV|r|| j	| d S )Nz<IIr
   zCRC check failed %s != %sr   z!Incorrect length of data producedru   r   )
r(   r   r   r   r   rh   r   r   r   r7   )r5   rm   Zisizecr&   r&   r'   r     s    


z_GzipReader._read_eofc                    s   t    d| _d S r<   )r   _rewindr   r=   r   r&   r'   r     s    
z_GzipReader._rewind)rd   )r?   r@   rA   r8   r   r   r   r   r   r   r   __classcell__r&   r&   r   r'   rO     s   !
3rO   )r^   c                C   sJ   t  }t|d||d}||  W d    n1 s80    Y  | S )Nwb)r\   r    r!   r^   )r   BytesIOr   r   getvalue)r   r!   r^   r   r6   r&   r&   r'   r     s    (r   c                 C   s<   t t| d}| W  d    S 1 s.0    Y  d S )Nr   )r   r   r   r   )r   r6   r&   r&   r'   r   '  s    r   c            	      C   s  ddl m}  | dd}| }|jdddd |jd	dd
d |jddddd |jdddgdd | }t}|jr|t}n
|jrt	}|j
D ]}|jr|dkrtddtjjd}tjj}n>|dd  dkrtd| t|d}t|d d d}nB|dkr"tjj}tddtjj|d}nt|d}t|d d}|d}|sPq^|| q<|tjjurt|  |tjjur|  qd S )Nr   )ArgumentParserzeA simple command line interface for the gzip module: act like gzip, but do not delete the input file.)descriptionz--fast
store_truezcompress faster)actionhelpz--bestzcompress betterz-dz--decompresszact like gunzip instead of gzipargs*-r3   )nargsdefaultmetavarr   r   )r   r    r\   r`   ra   zfilename doesn't end in .gz: r   )r   r    r\   r!   r   )argparser   add_mutually_exclusive_groupadd_argument
parse_args_COMPRESS_LEVEL_TRADEOFFfastr   Zbestr   r   r   r   sysstdinbufferstdoutexitr   rI   r   r   r   )	r   parsergroupr   r!   argr6   gr   r&   r&   r'   main/  sR    





r   __main__) r(   r   r~   r   rV   rI   r   _compression__all__ZFTEXTr   r   r|   r   rN   rT   r   r   r   r   r,   r-   r   r   
BaseStreamr   DecompressReaderrO   r   r   r   r?   r&   r&   r&   r'   <module>   s4    
,*   	0