a
    BCCfi                     @   st  d g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ddd	d	d
d	d	dddddZdddddddddddddddZi Z	dd  Z
d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZG d9d: d:ZG d;d< d<eZd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL Z dMdN Z!dOdP Z"dQdR Z#G dSdT dTe$Z%dWdVd Z&dS )Xreadsav    Nz>u1z>i2z>i4z>f4z>f8z>c8z|Oz>c16z>u2z>u4z>i8z>u8)                        	   
                  ZSTART_MARKERZCOMMON_VARIABLEVARIABLESYSTEM_VARIABLE
END_MARKER	TIMESTAMPZCOMPILEDZIDENTIFICATIONVERSIONHEAP_HEADER	HEAP_DATAZ	PROMOTE64NOTICEDESCRIPTION)r   r   r   r   r   r   r   r   r   r               c                 C   s.   |   }|d dkr*| |d |d   dS )z+Align to the next 32-bit position in a filer   r   N)tellseek)fpos r#   I/var/www/html/django/DPS/env/lib/python3.9/site-packages/scipy/io/_idl.py	_align_32K   s    r%   c                 C   s   |  | dS )zSkip `n` bytesNreadr!   nr#   r#   r$   _skip_bytesT   s    
r*   c                 C   s
   |  |S )zRead the next `n` bytesr&   r(   r#   r#   r$   _read_bytesZ   s    r+   c                 C   s$   t td| ddd d S )zRead a single bytez>Br   Nr   r   )npZuint8structunpackr'   r!   r#   r#   r$   
_read_byte_   s    r0   c                 C   s   t td| dd S )Read a signed 32-bit integer>lr   r   r,   Zint32r-   r.   r'   r/   r#   r#   r$   
_read_longd   s    r4   c                 C   s$   t td| ddd d S )zRead a signed 16-bit integerz>hr   r   r   )r,   Zint16r-   r.   r'   r/   r#   r#   r$   _read_int16i   s    r5   c                 C   s   t td| dd S )r1   z>ir   r   r3   r/   r#   r#   r$   _read_int32n   s    r6   c                 C   s   t td| dd S )zRead a signed 64-bit integerz>qr
   r   )r,   int64r-   r.   r'   r/   r#   r#   r$   _read_int64s   s    r8   c                 C   s$   t td| ddd d S )zRead an unsigned 16-bit integerz>Hr   r   r   )r,   Zuint16r-   r.   r'   r/   r#   r#   r$   _read_uint16x   s    r9   c                 C   s   t td| dd S )zRead an unsigned 32-bit integer>Ir   r   )r,   Zuint32r-   r.   r'   r/   r#   r#   r$   _read_uint32}   s    r;   c                 C   s   t td| dd S )zRead an unsigned 64-bit integerz>Qr
   r   )r,   Zuint64r-   r.   r'   r/   r#   r#   r$   _read_uint64   s    r<   c                 C   s   t td| dd S )zRead a 32-bit floatz>fr   r   )r,   Zfloat32r-   r.   r'   r/   r#   r#   r$   _read_float32   s    r=   c                 C   s   t td| dd S )zRead a 64-bit floatz>dr
   r   )r,   Zfloat64r-   r.   r'   r/   r#   r#   r$   _read_float64   s    r>   c                   @   s   e Zd ZdZdd ZdS )PointerzClass used to define pointersc                 C   s
   || _ d S N)index)selfrA   r#   r#   r$   __init__   s    zPointer.__init__N)__name__
__module____qualname____doc__rC   r#   r#   r#   r$   r?      s   r?   c                   @   s   e Zd ZdZdS )ObjectPointerz$Class used to define object pointersN)rD   rE   rF   rG   r#   r#   r#   r$   rH      s   rH   c                 C   s2   t | }|dkr*t| |d}t|  nd}|S )zRead a stringr   latin1 )r4   r+   decoder%   )r!   lengthcharsr#   r#   r$   _read_string   s    
rN   c                 C   s4   t | }|dkr,t | }t| |}t|  nd}|S )z.Read a data string (length is specified twice)r   rJ   )r4   r+   r%   )r!   rL   Zstring_datar#   r#   r$   _read_string_data   s    

rO   c                 C   s^  |dkr$t | dkrtdt| S |dkr4t| S |dkrDt | S |dkrTt| S |dkrdt| S |dkrt| }t| }t||d  S |d	krt| S |d
krtdn|dkrt| }t| }t	||d  S |dk rt
t | S |dkrtt | S |dkrt| S |dkr*t| S |dkr<t| S |dkrNt| S td| dS )z*Read a variable with a specified data typer   z*Error occurred while reading byte variabler   r   r   r   r   y              ?r	   r
   z'Should not be here - please report thisr   r   r   r   r   r   r   z)Unknown IDL type: %i - please report thisN)r6   	Exceptionr0   r5   r=   r>   r,   Z	complex64rO   Z
complex128r?   rH   r9   r;   r8   r<   )r!   dtyperealimagr#   r#   r$   
_read_data   sJ    






rT   c           
      C   s  |d }|d }g }|D ]z}|d s,|d rN| |d  |d ftjf q|d tv r| |d  |d ft|d  f qtd|d  qtjj|f|d}t|D ]}|D ]}|d }|d rt	| |d	 |d  |d
 |d  ||d  |< q|d r,t
| ||d	 |d  ||d  |< qt| |||d  |< qq|d dkr~|d dt|d  }	|	  ||	}|S )z
    Read a structure, with the array and structure descriptors given as
    `array_desc` and `structure_desc` respectively.
    	nelementstagtable	structurearraynametypecodez Variable type %i not implementedrQ   arrtablestructtablendimsr   dimsN)appendlowerr,   object_
DTYPE_DICTrP   recrecarrayrange_read_structure_read_arrayrT   intreversereshape)
r!   
array_descstruct_descZnrowscolumnsrQ   colrW   ir_   r#   r#   r$   rg      s@    "


rg   c           	      C   s  |dv rP|dkr2t | }||d kr2tjddd tj| |d t| d}nr|dv rtj| |d d	 t| ddd
d	 }n>g }t|d D ]}|}t| |}|	| qtj
|tjd}|d dkr|d d
t|d  }|  ||}t|  |S )z`
    Read an array of type `typecode`, with the array descriptor given as
    `array_desc`.
    )	r   r   r   r   r   r   r   r   r   r   nbytesz.Not able to verify number of bytes from headerr   
stacklevelr[   )r   r   r   NrU   r^   r_   )r6   warningswarnr,   Z
frombufferr'   rc   rf   rT   r`   rX   rb   ri   rj   rk   r%   )	r!   rZ   rl   rq   rX   rp   rQ   datar_   r#   r#   r$   rh     s8    

rh   c                    s6  dt  i}t }|t tjd 7 }t d |d tvrRtd|d  t|d  |d< |d dv rN|d dkrt |d< nt  |d< t d t	 }|d	 d
kr| 
 krd|d< ntdnvt  }|dkrtd|d rt |d |d |d< n:|d r4t |d	 |d |d< n|d	 }t ||d< n|d dkrt d t |d< t |d< t |d< n|d dkrt  |d< t |d< t |d< t |d< nX|d dkrt |d< t |d < t |d!< n"|d d"kr$t |d#< n|d d$kr@t |d%< n|d d&krzt  |d'<  fd(d)t|d' D |d*< n|d d+krt  |d,< t |d-<  fd.d)t|d, D |d/< nh|d d0krd1|d2< nP|d d3krtjd4d5d6 n2|d d7krtjd8d5d6 ntd9|d  d: | |S );z!Function to read in a full recordrectype        r   zUnknown RECTYPE: %i)r   r   r   varname
heap_indexrZ   r   Nrv   zUnexpected type code: 0r	   zVARSTART is not 7rW   rl   rm   rX   r   i   dateuserhostr   formatarchosreleaseIDENTIFICATONauthortitleidcoder   noticer   descriptionr   Znvaluesc                    s   g | ]}t  qS r#   r4   .0_r/   r#   r$   
<listcomp>      z _read_record.<locals>.<listcomp>indicesZCOMMONBLOCKZnvarsrY   c                    s   g | ]}t  qS r#   rN   r   r/   r#   r$   r     r   varnamesr   TendUNKNOWNzSkipping UNKNOWN recordr   rr   r   zSkipping SYSTEM_VARIABLE recordzrecord['rectype']=z not implemented)r4   r;   astyper,   r7   r*   RECTYPE_DICTrP   rN   _read_typedescr   
ValueErrorrg   rh   rT   rO   rf   rt   ru   r    )r!   recordnextrecZrectypedescZvarstartrQ   r#   r/   r$   _read_record<  s    










  

r   c                 C   s   t | t | d}|d d@ dkr*td|d d@ dk|d< |d d@ dk|d< |d rtt| |d	< t| |d
< n|d rt| |d	< |S )z%Function to read in a type descriptor)rZ   varflagsr   r   z System variables not implementedr   rX       rW   rl   rm   )r4   rP   _read_arraydesc_read_structdesc)r!   Ztypedescr#   r#   r$   r     s    r   c                    s4  dt  i}|d dkr|t d t  |d< t  |d< t  |d< t d t  |d<  fdd	t|d D |d
< n|d dkr tjddd t d t |d< t |d< t  |d< t d d|d< g |d
< t|d D ]0}t  }|dkr
td|d
 t   qntd|d  |S )z'Function to read in an array descriptorZarrstartr
   r   rq   rU   r^   Znmaxc                    s   g | ]}t  qS r#   r   r   r/   r#   r$   r     r   z#_read_arraydesc.<locals>.<listcomp>r_      z$Using experimental 64-bit array readr   rr   r   zExpected a zero in ARRAY_DESCzUnknown ARRSTART: %i)r4   r*   rf   rt   ru   r<   rP   r`   )r!   Z	arraydescdvr#   r/   r$   r     s2    

 


r   c                    s|  i }t  }|dkrtdt |d< t  }t  |d< t  |d< |d@ |d< |d@ |d	< |d
@ |d< |d sV fddt|d D |d< |d D ]}t |d< q fdd|d D |d<  fdd|d D |d< |d	 s|d rHt |d< t  |d<  fddt|d D |d<  fddt|d D |d< |t|d < n"|d tvrltdt|d  }|S )z*Function to read in a structure descriptorr   zSTRUCTSTART should be 9rY   Zntagsrq   r   predefr   Zinheritsr   Zis_superc                    s   g | ]}t  qS r#   )_read_tagdescr   r/   r#   r$   r     s   z$_read_structdesc.<locals>.<listcomp>rV   c                    s"   i | ]}|d  r|d t  qS )rX   rY   )r   r   tagr/   r#   r$   
<dictcomp>  s   z$_read_structdesc.<locals>.<dictcomp>r\   c                    s"   i | ]}|d  r|d t  qS )rW   rY   r   r   r/   r#   r$   r   	  s   r]   	classnameZnsupclassesc                    s   g | ]}t  qS r#   r   r   r/   r#   r$   r     s   Zsupclassnamesc                    s   g | ]}t  qS r#   r   r   r/   r#   r$   r     s   Zsupclasstablez"PREDEF=1 but can't find definition)r4   rP   rN   rf   STRUCT_DICT)r!   Z
structdescZstructstartr   r   r#   r/   r$   r     sJ    













r   c                 C   sl   dt | i}|d dkr$t| |d< t | |d< t | }|d@ dk|d< |d@ dk|d< |d tv |d< |S )	z$Function to read in a tag descriptoroffsetrZ   r   rX   r   rW   Zscalar)r4   r<   rc   )r!   ZtagdescZtagflagsr#   r#   r$   r   !  s    r   c                 C   sZ  t | trlt | trN| jdkr$d } q
| j|v r:|| j } q
tjddd d } q
t| |\}}|rd|} d| fS t | tjjrt	| D ]"\}}t||\}}|r|| |< qd| fS t | tj
rt	| D ]"\}}t||\}}|r|| |< qd| fS t | tjrN| jjtju rFt| jD ].}t| ||\}}|r|| d|< qd| fS d| fS d S )Nr   zNVariable referenced by pointer not found in heap: variable will be set to Noner   rr   TFr   )
isinstancer?   rA   rt   ru   _replace_heapr,   rd   re   	enumerater   ZndarrayrQ   typerb   rf   sizeitemrk   )variableheapreplacenewZirr   Zivvaluer#   r#   r$   r   4  sD    





r   c                       sH   e Zd ZdZi fddZ fddZ fddZdd	 ZeZeZ	  Z
S )
AttrDicta]  
    A case-insensitive dictionary with access via item, attribute, and call
    notations:

        >>> from scipy.io._idl import AttrDict
        >>> d = AttrDict()
        >>> d['Variable'] = 123
        >>> d['Variable']
        123
        >>> d.Variable
        123
        >>> d.variable
        123
        >>> d('VARIABLE')
        123
        >>> d['missing']
        Traceback (most recent error last):
        ...
        KeyError: 'missing'
        >>> d.missing
        Traceback (most recent error last):
        ...
        AttributeError: 'AttrDict' object has no attribute 'missing'
    c                 C   s   t | | d S r@   )dictrC   )rB   initr#   r#   r$   rC     s    zAttrDict.__init__c                    s   t  | S r@   )super__getitem__ra   rB   rY   	__class__r#   r$   r     s    zAttrDict.__getitem__c                    s   t  | |S r@   )r   __setitem__ra   )rB   keyr   r   r#   r$   r     s    zAttrDict.__setitem__c              	   C   s@   z|  |W S  ty:   tdt|  d| dd Y n0 d S )N'z' object has no attribute ')r   KeyErrorAttributeErrorr   r   r#   r#   r$   __getattr__  s    zAttrDict.__getattr__)rD   rE   rF   rG   rC   r   r   r   __setattr____call____classcell__r#   r#   r   r$   r   w  s   r   Fc              	   C   s  g }|s|ri }nt  }t| d}t|d}|dkr@td| t|d}	|	dkrVn|	dkr|rltd |r|t|d}
ntjd	d
}
|rtd|
j  |
d t	|}|
t
dt| t|}|t|tjd 7 }|d}t| dkrNtd}|
t
dt||  |
t
dt|||  |  |
| q| }t||| }|
 t| d }|
t
dt|d  |
t
dt||d  d  |
| |
| q|  |
}|d ntd|	 t|}|| d|v r|d rq"q|  i }|D ]$}|d dkr2|d ||d < q2|D ]H}|d dkr\t|d |\}}|r||d< |d ||d  < q\|r|D ]R}|d dkrtd td|d   td|d    td!|d"    qq|D ]b}|d d#krtd td$|d%   td&|d'   td(|d)   td*|d+    qlq|D ]R}|d d,krptd td-|d.   td/|d0   td1|d2    qĐqp|D ]2}|d d3krtd td4|d5    qqtd td6t|  d7d8 |D }t|D ]&}|dkr*td9|||f  q*td d|v rtd: |D ]$}td;| d<t||  d= qptd |r|D ]}|| ||< q|S |S d>S )?a	  
    Read an IDL .sav file.

    Parameters
    ----------
    file_name : str
        Name of the IDL save file.
    idict : dict, optional
        Dictionary in which to insert .sav file variables.
    python_dict : bool, optional
        By default, the object return is not a Python dictionary, but a
        case-insensitive dictionary with item, attribute, and call access
        to variables. To get a standard Python dictionary, set this option
        to True.
    uncompressed_file_name : str, optional
        This option only has an effect for .sav files written with the
        /compress option. If a file name is specified, compressed .sav
        files are uncompressed to this file. Otherwise, readsav will use
        the `tempfile` module to determine a temporary filename
        automatically, and will remove the temporary file upon successfully
        reading it in.
    verbose : bool, optional
        Whether to print out information about the save file, including
        the records read, and available variables.

    Returns
    -------
    idl_dict : AttrDict or dict
        If `python_dict` is set to False (default), this function returns a
        case-insensitive dictionary with item, attribute, and call access
        to variables. If `python_dict` is set to True, this function
        returns a Python dictionary with all variable names in lowercase.
        If `idict` was specified, then variables are written to the
        dictionary specified, and the updated dictionary is returned.

    Examples
    --------
    >>> from os.path import dirname, join as pjoin
    >>> import scipy.io as sio
    >>> from scipy.io import readsav

    Get the filename for an example .sav file from the tests/data directory.

    >>> data_dir = pjoin(dirname(sio.__file__), 'tests', 'data')
    >>> sav_fname = pjoin(data_dir, 'array_float32_1d.sav')

    Load the .sav file contents.

    >>> sav_data = readsav(sav_fname)

    Get keys of the .sav file contents.

    >>> print(sav_data.keys())
    dict_keys(['array1d'])

    Access a content with a key.

    >>> print(sav_data['array1d'])
    [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0.]

    rbr   s   SRzInvalid SIGNATURE: %ss    s    zIDL Save file is compressedzw+bz.sav)suffixz -> expanding to %ss   SR r2   rx   r   r   r:   r   zInvalid RECFMT: %sr   rw   r   rv   rz   r   ry   r   z2--------------------------------------------------zDate: %sr{   zUser: %sr|   zHost: %sr}   r   z
Format: %sr~   zArchitecture: %sr   zOperating System: %sr   zIDL Version: %sr   r   z
Author: %sr   z	Title: %sr   zID Code: %sr   r   zDescription: %sr   z&Successfully read %i records of which:c                 S   s   g | ]}|d  qS )rw   r#   )r   rr#   r#   r$   r     r   zreadsav.<locals>.<listcomp>z - %i are of type %szAvailable variables:z - z []N) r   openr+   rP   printtempfileNamedTemporaryFilerY   writer4   r-   packri   r;   r   r,   r7   r'   r   r   zlib
decompresslencloser    r   r`   r   ra   setcountr   )	file_nameZidictZpython_dictZuncompressed_file_nameverboserecords	variablesr!   	signatureZrecfmtZfoutrw   r   unknownZmodvalr"   Z
rec_stringr   r   r   r   r   Zrectypesrtvarr#   r#   r$   r     s    F







"









")NFNF)'__all__r-   numpyr,   r   r   rt   rc   r   r   r%   r*   r+   r0   r4   r5   r6   r8   r9   r;   r<   r=   r>   r?   rH   rN   rO   rT   rg   rh   r   r   r   r   r   r   r   r   r   r#   r#   r#   r$   <module>   s   	*-0l/6C.  