o
     JAfYU                     @   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re  dS dS )    N)BadGzipFileGzipFileopencompress
decompress)               )r   r   r      	   rbc                 C   s   	 d|v rd|v rt d|f n|d urt d|d ur!t d|d ur)t d|dd}t| tttjfr?t| ||}nt| dsIt| d	rQtd ||| }nt	d
d|v rft
|}t
||||S |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text_encodingTextIOWrapper)filenamemodecompresslevelencodingerrorsnewlineZgz_modebinary_file r'   /usr/lib/python3.10/gzip.pyr      s*   
r   c                 C   s   |  td| d S )Nz<L)r   structpack)outputvaluer'   r'   r(   write32uF   s   r-   c                   @   s:   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__P   s   

z_PaddedFile.__init__c                 C   sz   | j d u r| j|S | j | | jkr%| j }|  j |7  _ | j|| j  S | j }d | _ | j|d  | j|| j |  S N)r5   r4   r   r3   r1   )r6   sizer   r'   r'   r(   r   V   s   
z_PaddedFile.readc                 C   s>   | j d u r	|| _n|  j t|8  _ d S t| j| _d| _ d S r0   )r5   r1   r2   r3   )r6   r8   r'   r'   r(   r8   c   s   

z_PaddedFile.prependc                 C   s   d | _ d | _| j|S r:   )r5   r1   r4   seek)r6   Zoffr'   r'   r(   r<   l   s   z_PaddedFile.seekc                 C      dS NTr'   r6   r'   r'   r(   seekableq      z_PaddedFile.seekableN)r/   )__name__
__module____qualname__r9   r   r8   r<   r@   r'   r'   r'   r(   r.   K   s    

	r.   c                   @   s   e Zd ZdS )r   N)rB   rC   rD   r'   r'   r'   r(   r   u   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   sX  	 |rd|v sd|v rt d||rd|vr|d7 }|d u r+t||p&d }| _|d u r?t|dd}t|ttfs>d}nt	
|}|}|d u rPt|dd}|d	rft| _t|}t|| _|| _n5|d
r|d u rzdd l}|dtd t| _| | t|tjtj tjd| _|| _nt d||| _| jtkr|  | d S 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   BufferedReaderr1   rF   warningswarnFutureWarningWRITE_init_writezlibcompressobjDEFLATED	MAX_WBITSDEF_MEM_LEVELr   _write_mtimefileobj_write_gzip_header)	r6   r    r!   r"   r_   mtimeZorigmoderawrT   r'   r'   r(   r9      sT   !




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)rT   rU   DeprecationWarningr!   rW   rF   )r6   rT   r'   r'   r(   r       s
   
zGzipFile.filenamec                 C   s   	 | j jjS r:   )r1   rb   _last_mtimer?   r'   r'   r(   ra      s   
zGzipFile.mtimec                 C   s.   t | j}d|dd  d tt|  d S )Nz<gzip r    >)reprr_   hexid)r6   sr'   r'   r(   __repr__   s   
$zGzipFile.__repr__c                 C   s.   || _ td| _d| _g | _d| _d| _d S Nr/   r   )rF   rY   crc32crcr;   Zwritebufbufsizeoffset)r6   r    r'   r'   r(   rX      s   
zGzipFile._init_writec                 C   s  | j d | j d ztj| j}t|ts|d}|	dr)|d d }W n t
y5   d}Y nw d}|r<t}| j t|d | j}|d u rRt }t| j t| |tkrad}n	|tkrhd	}nd
}| j | | j d |r| j |d
  d S d S )N      zlatin-1s   .gzrc   r/   r                )r_   r   r   pathbasenamerF   r   r   encodeendswithUnicodeEncodeErrorFNAMEchrr^   timer-   int_COMPRESS_LEVEL_BEST_COMPRESS_LEVEL_FAST)r6   r"   Zfnameflagsra   Zxflr'   r'   r(   r`      s<   


zGzipFile._write_gzip_headerc                 C   s   |    | jtkrdd l}t|jd| jd u rtdt|t	t
fr(t|}nt|}|j}|dkrS| 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!   rW   errnoOSErrorEBADFr_   r   r   r   	bytearrayr2   
memoryviewnbytesr   r   r;   rY   rp   rq   rs   )r6   datar   lengthr'   r'   r(   r     s    


zGzipFile.writerg   c                 C   2   |    | jtkrdd l}t|jd| j|S )Nr   z$read() on write-only GzipFile object)r   r!   rQ   r   r   r   r1   r   r6   r;   r   r'   r'   r(   r   (  
   
zGzipFile.readc                 C   sB   	 |    | jtkrdd l}t|jd|dk rtj}| j	|S )Nr   z%read1() on write-only GzipFile object)
r   r!   rQ   r   r   r   r   DEFAULT_BUFFER_SIZEr1   read1r   r'   r'   r(   r   /  s   
zGzipFile.read1c                 C   r   )Nr   z$peek() on write-only GzipFile object)r   r!   rQ   r   r   r   r1   peek)r6   nr   r'   r'   r(   r   <  r   zGzipFile.peekc                 C   s
   | j d u S r:   r_   r?   r'   r'   r(   closedC  s   
zGzipFile.closedc                 C   s   | j }|d u r	d S d | _ z7| jtkr)|| j  t|| j t|| jd@  n
| jt	kr3| j
  W | j}|rBd | _|  d S d S | j}|rQd | _|  w w )N    )r_   r!   rW   r   r   flushr-   rq   r;   rQ   r1   closerM   )r6   r_   rM   r'   r'   r(   r   G  s,   



zGzipFile.closec                 C   s8   |    | jtkr| j| j| | j  d S d S r:   )r   r!   rW   r_   r   r   r   )r6   Z	zlib_moder'   r'   r(   r   Z  s
   
zGzipFile.flushc                 C   s   	 | j  S r:   )r_   filenor?   r'   r'   r(   r   a  s   
zGzipFile.filenoc                 C   s$   	 | j tkr
td| jd d S )NzCan't rewind in write moder   )r!   rQ   r   r1   r<   r?   r'   r'   r(   rewindi  s   
zGzipFile.rewindc                 C   
   | j tkS r:   )r!   rQ   r?   r'   r'   r(   readablep     
zGzipFile.readablec                 C   r   r:   )r!   rW   r?   r'   r'   r(   writables  r   zGzipFile.writablec                 C   r=   r>   r'   r?   r'   r'   r(   r@   v  rA   zGzipFile.seekablec                 C   s   | j tkrC|tjkr|tjkr| j| }ntd|| jk r"td|| j }d}t|d D ]}| 	| q/| 	d|d   | jS | j t
krS|   | j||S | jS )NzSeek from end not supportedzNegative seek in write modes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   i   rx   )r!   rW   r   SEEK_SETSEEK_CURrs   r   r   ranger   rQ   r   r1   r<   )r6   rs   whencecountchunkir'   r'   r(   r<   y  s"   





zGzipFile.seekc                 C   s   |    | j|S r:   )r   r1   readline)r6   r;   r'   r'   r(   r     s   zGzipFile.readlinerg   )rB   rC   rD   rM   r   r9   propertyr    ra   rn   rX   r`   r   r   r   r   r   r   rY   Z_SYNC_FLUSHr   r   r   r   r   r@   r   r   r<   r   r'   r'   r'   r(   r   y   s8    

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 )rR   c                    s,   t  jt|tjtj d d| _d | _d S )N)ZwbitsT)superr9   r.   rY   decompressobjr\   _new_memberrf   )r6   fp	__class__r'   r(   r9     s
   
z_GzipReader.__init__c                 C   s   t d| _d| _d S ro   )rY   rp   _crc_stream_sizer?   r'   r'   r(   
_init_read  s   
z_GzipReader._init_readc                 C   sR   	 | j |}t||k r'| j |t| }|std||7 }t||k s|S )NACompressed file ended before the end-of-stream marker was reached)_fpr   r2   EOFError)r6   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r+td|t@ r>td	| d\}| | |t@ rQ	 | j d}|rO|dkrPnqC|t	@ rd	 | j d}|rb|dkrcnqV|t
@ rm| d d
S )Nr   r/   Frt   zNot a gzipped file (%r)z<BBIxxr
   zUnknown compression methodz<HTr   rx   )r   r   r   r)   unpackr   rf   FEXTRAr   FCOMMENTFHCRC)r6   magicmethodflagZ	extra_lenrm   r'   r'   r(   _read_gzip_header  s8   

z_GzipReader._read_gzip_headerrg   c                 C   s   |dk r|   S |sdS 	 | jjr"|   d| _| jdi | j| _| jr6|   |  s3| j	| _
dS d| _| jtj}| j||}| jjdkrS| j| jj n| jjdkra| j| jj |dkrfn	|dkrntdq| | |  j	t|7  _	|S )Nr   r/   TFr   r'   )readall_decompressoreof	_read_eofr   _decomp_factory_decomp_argsr   r   _pos_sizer   r   r   r   r   unconsumed_tailr8   unused_datar   _add_read_datar2   )r6   r;   bufZ
uncompressr'   r'   r(   r     s>   
%z_GzipReader.readc                 C   s$   t || j| _| jt| | _d S r:   )rY   rp   r   r   r2   )r6   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 || jd@ kr(tdd}|dkr8| jd}|dks.|rB| j	| d S d S )Nz<IIr
   zCRC check failed %s != %sr   z!Incorrect length of data producedrx   r   )
r)   r   r   r   r   rk   r   r   r   r8   )r6   rp   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._rewindr   )rB   rC   rD   r9   r   r   r   r   r   r   r   __classcell__r'   r'   r   r(   rR     s    
!3rR   )ra   c                C   sR   	 t  }t|d||d}||  W d    | S 1 s w   Y  | S )Nwb)r_   r!   r"   ra   )r   BytesIOr   r   getvalue)r   r"   ra   r   r7   r'   r'   r(   r     s   
r   c                 C   s>   	 t t| d}| W  d    S 1 sw   Y  d S )Nr   )r   r   r   r   )r   r7   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rCt	}|j
D ]{}|jr}|dkr]tddtjjd}tjj}n@|dd  dkrmtd| 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}	 |tj}|sn|| q|tjjur|  |tjjur|  qFd 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*-r4   )nargsdefaultmetavarr   r   )r    r!   r_   rc   rd   zfilename doesn't end in .gz: 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   rL   r   r   r   r   r   )	r   parsergroupr   r"   argr7   gr   r'   r'   r(   main0  sZ   




r   __main__) r)   r   r   r   rY   rL   r   _compression__all__ZFTEXTr   r   r   r   rQ   rW   r   r   r   r   r-   r.   r   r   
BaseStreamr   DecompressReaderrR   r   r   r   rB   r'   r'   r'   r(   <module>   s:     
-*   	0
