???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
MZR                 @   s  d dl mZ d dlmZmZ d dlmZmZ yd dl mZ	 W n e
k
rX   ddl	Z	Y nX ddlZddlZddlZy(ejd#k rddlZnddlZej ZW n e
k
r   dZY nX dZejd	ejejB Zejd
ejejB ZejdZejdZejdZejdZdaejdejZejdZ ejdZ!ejdZ"ejdZ#ejdZ$ejdZ%ejdZ&dd Z'dd Z(dd Z)dd Z*dd  Z+G d!d" d"e,Z-dS )$   )model)COMMON_TYPESresolve_common_type)FFIError	CDefError)
_pycparser    N   z<cdef source string>z/\*.*?\*/|//([^\n\\]|\\.)*?$z?^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)\b((?:[^\n\\]|\\.)*?)$z=\s*\.\.\.\s*[,}]|\.\.\.\s*\}z__dotdotdot\d+__$z\[\s*\.\.\.\s*\]z\w+|\Sz-?0?x?[0-9a-f]+[lu]*$z\b(__stdcall|WINAPI)\bz[(]\s*(__stdcall|WINAPI)\bz\b__cdecl\bz9\bextern\s*"(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.z'[*]\s*((const|volatile|restrict)\b\s*)+z3(\b(int|long|short|signed|unsigned|char)\s*)+\.\.\.z\b(double|float)\s*\.\.\.c               C   s   t d krtj a t S )N)_parser_cache	pycparserZCParser r   r   /usr/lib64/python3.6/cparser.py_get_parser*   s    r   c             C   s  g }xt j| }|sP |j| d |j   |jd d}|j|j  |j }| jd|rn|jd |d7 }d}|}x`|t| k r| | }|dkr|d7 }n.|dkr|dkrP |d8 }n|dkr|dkrP |d7 }qxW | || | | |d   } qW |j|  dj|S )N()*r   r   z,;= )	_r_star_const_spacesearchappendstartgroupend
startswithlenjoin)csourcepartsmatchclosingendposlevelicr   r   r   _workaround_for_old_pycparser0   s<    

 
 

 
r$   c             C   s0  g }xt j| }|sP |j d }|j| d |j   d|jdkrT|jd n
|jd | | dkr| jd|}|dk rtd| jd|d |dkrtd	|j| |d |  | |d d  } nB| jd
|}|dk rtd|j| ||d   | |d d  } |jd qW |j|  dj	|S )Nr   Cz(void __cffi_extern_python_plus_c_start; z!void __cffi_extern_python_start; {}r   z!'extern "Python" {': no '}' foundz7cannot use { } inside a block 'extern "Python" { ... }';z'extern "Python": no ';' foundz  void __cffi_extern_python_stop;r   )
_r_extern_pythonr   r   r   r   r   findr   NotImplementedErrorr   )r   r   r   r    r   Z	semicolonr   r   r   _preprocess_extern_pythonZ   s4    


r,   c       	      C   s  t jd| } i }x6tj| D ](}|j \}}|jddj }|||< qW tjd| } tjdk rft	| } t
jd| } tjd| } tjd| } t| } tjd| } ttj| }xtt|D ]\}}|j }| | dkr| jd	||j }||kstd
| d | || |d d  f } q| ||d  d	ks4td| d | || |d d  f } qW tjd| } tjd| } | jd	d|fS )N z\
r   z2.14z volatile volatile const(z volatile volatile const z[__dotdotdotarray__]=z...z%s,__dotdotdot%d__ %sr	   z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )
_r_commentsub	_r_definefinditergroupsreplacestripr   __version__r$   _r_stdcall2_r_stdcall1_r_cdeclr,   _r_partial_arraylist_r_partial_enum	enumeratereversedr   r*   r   AssertionError_r_int_dotdotdot_r_float_dotdotdot)	r   macrosr   Z	macronameZ
macrovalueZmatchesZnumberpZp2r   r   r   _preprocess   s8    
rD   c             C   s   t t}|jd |jd |jd |jd |jd t  }d}d}d}xtj| D ]}||kr|dkr|r|j| |j| d}nj|dkrd	}d}nX|dkr|d
7 }nF|dkr|d
8 }n4|dkr|r|dkr|j| |j| n
|j| |}qXW |S )Nr(   ,r   r   typedefFr   r   Tr   )setr   add_r_wordsfindalldiscard)r   Zlook_for_wordsZ
words_usedZ
is_typedefZparenZprevious_wordZwordr   r   r   _common_type_names   s>    










rL   c               @   s   e Zd Zdd Zdd Zdd Zdd Zd8d
d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d9ddZdd  Zd:d"d#Zd;d$d%Zd<d&d'Zd(d) Zd=d*d+Zd,d- Zd>d.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd!S )?Parserc             C   s:   i | _ t | _d| _tj | _i | _i | _g | _	d | _
d S )Nr   )_declarationsrG   _included_declarations_anonymous_counterweakrefWeakKeyDictionary_structnode2type_options_int_constants_recomplete_uses_new_feature)selfr   r   r   __init__   s    
zParser.__init__c             C   s4  t |\}}t|}g }x<t| jD ].}|jdr$|dd  }|j| |j| q$W |t|7 }g }|jd x|D ]}|jd|  qvW |jd |jdtf  |j| dj|}t	d k	rt	j
  zJyt j|}	W n4 tjjk
r }
 z| j|
| W Y d d }
~
X nX W d t	d k	r(t	j  X |	||fS )Nztypedef    z*# 1 "<cdef automatic initialization code>"ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "%s"
)rD   rL   sortedrN   r   r   rK   CDEF_SOURCE_STRINGr   lockacquirer   parser   Zc_parserZ
ParseErrorconvert_pycparser_errorrelease)rX   r   rB   Zctn	typenamesnamecsourcelinestypenameZfullcsourceaster   r   r   _parse   s4    






"

zParser._parsec             C   sf   d }t |}tjdtf |}|rbt|jdd}|j }d|  koPt|kn  rb||d  }|S )Nz	%s:(\d+):r   
   )strrer   r]   intr   
splitlinesr   )rX   rh   r   linemsgr   Zlinenumre   r   r   r   _convert_pycparser_error  s    zParser._convert_pycparser_errorc             C   s@   | j ||}t|}|r*d|j |f }n
d|f }t|d S )Nzcannot parse "%s"
%szparse error
%s)rq   rk   r5   r   )rX   rh   r   ro   rp   r   r   r   ra   +  s    
zParser.convert_pycparser_errorFc             C   s0   | j }z|||d| _ | j| W d || _ X d S )N)overridepacked	dllexport)rT   _internal_parse)rX   r   rr   rs   rt   Zprev_optionsr   r   r   r`   5  s    
zParser.parsec             C   s$  | j |\}}}| j| t|j}x |D ]}|jdkr*P q*W dsFtd }yBd| _x4|D ]*}|}t|tj	j
r| j| q\t|tj	jrf|jstd|d}t|jjtj	jr|jjjd jdr| j|}nxt|jtj	jr6t|jjtj	jr6t|jjjtj	jr6|jjjjd jdr6| j|}n| j|j|jdd\}}| jd	|j ||d
 q\|jjdkrvq\td|jj |q\W W n tk
r }	 z&t|	jdkr|	j|f |	_ W Y d d }	~	X nN tk
r }	 z0| j|	|}
|
r|	jd d|
  f|	_ W Y d d }	~	X nX d S )N__dotdotdot__r   __cffi_extern_python_stopz!typedef does not declare any namer   Z__dotdotdotT)rd   partial_length_okztypedef )qualsZPragmazBunexpected <%s>: this construct is valid C but not valid in cdef()z
    *** Err: %srz   )ri   _process_macrositerextrd   r?   _inside_extern_python
isinstancer   c_astZDecl_parse_declZTypedefr   typeIdentifierTypenamesr   _get_unknown_typePtrDeclTypeDecl_get_unknown_ptr_type_get_type_and_quals_declare	__class____name__r   argsr   rq   )rX   r   rg   rB   iteratordeclZcurrent_declry   Zrealtyperh   rp   r   r   r   ru   ?  sX    




zParser._internal_parsec             C   s8   || j kr*| j | |krd S td|f || j |< d S )Nz%multiple declarations of constant: %s)rU   r   )rX   keyvalr   r   r   _add_constantsu  s    
zParser._add_constantsc             C   s   |j  jd}|jd}|r(|dd  }|jdrV|dkrV|jd rVd|dd   }t|d}|rj| }| j|| | jd| | d S )	NZul-r   00xZ0or   zmacro )lowerrstripr   rm   r   r   )rX   rd   Zint_strnegZpyvaluer   r   r   _add_integer_constant}  s    

zParser._add_integer_constantc             C   sh   xb|j  D ]V\}}|j }tj|r2| j|| q
|dkrL| jd| | q
td||||f q
W d S )Nz...zmacro zonly supports one of the following syntax:
  #define %s ...     (literally dot-dot-dot)
  #define %s NUMBER  (with NUMBER an integer constant, decimal/hex/octal)
got:
  #define %s %s)itemsr5   _r_int_literalr   r   r   r   )rX   rB   r   valuer   r   r   r{     s    
zParser._process_macrosc             C   sX   | j ||}| jjdrd}n$| jdkr.d}n| jdkr>d}nd}| j||j | d S )Nrt   zdllexport_python Z__cffi_extern_python_startzextern_python Z!__cffi_extern_python_plus_c_startzextern_python_plus_c z	function )_get_type_pointerrT   getr~   r   rd   )rX   tpry   r   tagr   r   r   _declare_function  s    

zParser._declare_functionc             C   s  |j }t|tjjrJ| j||jd\}}t|tjs8t	| j
||| nt|tjjrf| jd| nHt|tjjr| jd| n,t|tjjr| jd| n|jstd||jr
| j|dd\}}|jr| j
||| n*|j r(t|dr(t|jd	r(tj|jjr(| j|j|jj n|j rt|jtjjr|jjd
krt|jjd	rtj|jjjr| j|jd
|jjj  n||tjkr|jjdr|j| _nX| jdkrtd|tj@ r|j r| j d|j ||d n| j d|j ||d d S )N)rd   structunionenumz'construct does not declare any variableT)rx   initr   r   Z__cffi_extern_python_rw   z<cannot declare constants or variables with 'extern "Python"'z	constant )ry   z	variable )!r   r   r   r   FuncDeclr   rd   r   RawFunctionTyper?   r   Struct_get_struct_union_enum_typeUnionEnumr   Zis_raw_functionZis_integer_typehasattrr   r   r   r   r   UnaryOpopexpr	void_typer   r~   Q_CONSTZis_array_typer   )rX   r   Znoder   ry   r   r   r   r     sP    


zParser._parse_declc             C   s   | j |d S )Nr   )parse_type_and_quals)rX   cdeclr   r   r   
parse_type  s    zParser.parse_typec             C   sb   | j d| d d \}}| s$t|jd jjjd }t|tjj	rVt
d|jf | j|jS )Nzvoid __dummy(
%s
);   r   r   zunknown identifier '%s'rz   )ri   r?   r}   r   r   paramsr   r   r   IDr   rd   r   )rX   r   rg   rB   exprnoder   r   r   r     s    
zParser.parse_type_and_qualsr   c             C   sx   || j krF| j | \}}||kr,||kr,d S | jjdsFtd|f d|j ksVt||f| j |< |rt| jj| d S )Nrr   zPmultiple declarations of %s (for interactive usage, try cdef(xx, override=True))rv   )rN   rT   r   r   splitr?   rO   rH   )rX   rd   objincludedry   ZprevobjZ	prevqualsr   r   r   r     s    

zParser._declarec             C   sZ   d}t |tjjtjjfrVd|jkr.|tjO }d|jkrB|tjO }d|jkrV|tj	O }|S )Nr   constvolatileZrestrict)
r   r   r   r   r   ry   r   r   Z
Q_VOLATILEZ
Q_RESTRICT)rX   r   ry   r   r   r   _extract_quals  s    






zParser._extract_qualsNc             C   sj   t |tjr|j S t |tjr^|jjdr^|jdd  j r^|jd kr^|d k	r^tj	|||S tj
||S )N$r   )r   r   r   as_function_pointerZStructOrUnionOrEnumrd   r   isdigit	forcenameZNamedPointerTypePointerType)rX   r   ry   declnamer   r   r   r      s    zParser._get_type_pointerc             C   sH  t |tjjrtt |jtjjrtt|jjdkrtd|jjd  | jkrt| jd|jjd   \}}|| j	|O }||fS t |tjj
r|jd krd }n| j|j|d}| j|j|d\}}tj|||fS t |tjjr| j|j\}}| j|||d}| j	|}||fS t |tjjr| j	|}|j}	t |	tjjrVt|	j}
|
ddgkri }x<|
r|
d }|dkr|j|dd ||< |
d= nP qVW g }x4dD ],}x$t|j|dD ]}|j| qW qW |
sdg}
|
dgkrd|ksd	|krg }
||
 }
dj|
}|dkr"tj|fS |dkr<td|jj t| |\}}|||B fS t |	tjjr|| jd|	|}||fS t |	tjjr| jd|	|}||fS t |	tjjr| jd|	|}||fS t |tjj r| j!||dfS t |tjjr| jd||dddfS t |tjjr4| jd||dddfS td|jj d S )Nr   ztypedef r   )rx   )r   signedcharshortlongunsignedrm   r-   voidrv   z:%d: bad usage of "..."r   r   r   T)nestedz(:%d: bad or unsupported type declaration)r   r   r   r   )r   r   r   )"r   r   r   r   r   r   r   r   rN   r   Z	ArrayDeclZdim_parse_constantr   r   	ArrayTyper   r   r;   r   ranger   r   r   r   coordro   r   r   r   r   r   r   _parse_function_type)rX   typenoderd   rx   r   ry   ZlengthZitemtypeZ	itemqualsr   r   prefixesZnewnamesprefixr"   ZidentZtp0Zquals0r   r   r   r   	  s    











zParser._get_type_and_qualsc          	      s<  t t|jdg }x@t|D ]4\}}t|dstd|p8d|d t|ddf qW t|dkot|d jt	j
jot|d jjt	j
jo|d jjjd	gk}|r|j  |std
|pd  fdd|D }| r|tjgkrg } j|j\}}	d }
t|jdr(|jjdd  dddgkr(d}
tjt||||
S )Nr   r   zt%s arg %d: unknown type '%s' (if you meant to use the old C syntax of giving untyped arguments, it is not supported)zin expressionr   rd   ?r   rv   z=%s: a function with only '(...)' as argument is not correct Cc                s   g | ]} j  j|j qS r   )_as_func_argr   r   ).0Zargdeclnode)rX   r   r   
<listcomp>|  s   z/Parser._parse_function_type.<locals>.<listcomp>ry   r	   r   r   Z	__stdcallrz   rz   rz   )r;   getattrr   r=   r   r   r   r   r   r   r   r   r   r   popr   r   r   ry   r   tuple)rX   r   funcnamer   r"   argZellipsisr   resultry   abir   )rX   r   r   g  s6    


zParser._parse_function_typec             C   s6   t |tjrtj|j|S t |tjr.|j S |S d S )N)r   r   r   r   itemr   r   )rX   r   ry   r   r   r   r     s
    zParser._as_func_argc             C   s,  y
| j | S  tk
r   Y nX |}|j}|d krb|d k	rDd| }n|  jd7  _d| j }d }n"|}d||f }| jj|d\}}	|d kr|dkrtj|d d d }nP|dkrtj|d d d }n6|dkr|dkrt	d	| j
||j}ntd
|f |d k	r2| j|| n"|dkr2|jd k	r2td| |jsD|j| |jrjd|jkrj| jd|j | || j |< |dkr|S |jd kr|S |jd k	rt	d| g }
g }g }g }x|jD ]}t|jtjjrdj|jjdkr| j|| q|jd krd}n| j|j}d| _| j|jdd\}}| jrH| j|| t|tjrj|jrj| j|| |
j |jpxd |j | |j | |j | qW t!|
|_t!||_"t!||_#t!||_$|dgt%| kr t|tjr |jr td|f | j&jd|_'|j(r(d|_(| j)j | |S )Nz$%sr   z$%dz%s %sr   r   r   rv   z!Enums cannot be declared with ...z	kind = %rz^enum %s: the '{}' declaration should appear on the first time the enum is mentioned, not laterr   zanonymous %sz"duplicate declaration of struct %sr   FT)rx   z#%s: using both bitfields and '...;'rs   r   )NNrz   rz   )*rS   KeyErrorrd   rP   rN   r   r   Z
StructTypeZ	UnionTyper   _build_enum_typevaluesr?   r   r+   r   Zforce_the_namedeclsfldnamesr   r   r   r   r   r   r   _make_partialbitsizer   _partial_lengthr   partialr   r   fldtypes
fldbitsizefldqualsr   rT   rs   Z	completedrV   )rX   kindr   rd   r   Z
force_nameexplicit_namer   r   _r   r   r   r   r   r   Zfqualr   r   r   r     s    	















z"Parser._get_struct_union_enum_typec             C   sB   t |tjstd|f |j  r8| r8td|f d|_d S )Nz%s cannot be partialz%s is partial but has no C nameT)r   r   ZStructOrUnionr   Z
has_c_namer+   r   )rX   r   r   r   r   r   r     s
    zParser._make_partialc             C   s  t |tjjr|j}|jdrF|jds2|jdr<t|dS t|dS d|d   ko\dkn  rlt|d	S |d d
kr|d d
krt|dkst|dkr|d dkrt|d S t	d|f t |tjj
r|jdkr| j|jS t |tjj
r|jdkr| j|j S t |tjjr:|j| jkr:| j|j S t |tjjrv|jdkrv|rfd| _dS td|jj t |tjjr|jdkr| j|j| j|j S t |tjjr|jdkr| j|j| j|j S td|jj d S )Nr   r   Z0X   rZ   1r   9rj   'r   r	      \r   zinvalid constant %r+r   Z__dotdotdotarray__Tz...zT:%d: unsupported '[...]' here, cannot derive the actual array length in this contextz?:%d: unsupported expression: expected a simple numeric constantrz   )r   r   r   ZConstantr   r   rm   r   ordr   r   r   r   r   r   rd   rU   r   r   r   ro   ZBinaryOpleftright)rX   r   rx   sr   r   r   r     sL    



$


zParser._parse_constantc       	      C   s   |d k	rd}g }g }d}xb|j D ]X}tj|jr6d}q |jd k	rL| j|j}|j|j |j| | j|j| |d7 }q W t|}t|}t	j
|||}||_nt	j
|f f }|S )NFr   Tr   )enumerators_r_enum_dotdotdotr   rd   r   r   r   r   r   r   ZEnumTyper   )	rX   r   r   r   r   Z
enumvaluesZnextenumvaluer   r   r   r   r   r   B  s*    

zParser._build_enum_typec             C   sz   xP|j j D ]B\}\}}|jdr$q|jddd }|dkr| j||d
|d qW x"|jj D ]\}}| j|| q^W d S )Nzanonymous $enum_$r-   r   r   r   r   r   	anonymousrF   T)r   ry   )r   r   r   r   rF   )rN   r   r   r   r   rU   r   )rX   otherrd   r   ry   r   kvr   r   r   includeZ  s    
zParser.includec             C   s   |j j j}|dgkr tj|jS |dgkrL| jd kr@d|j | _tj|jS |dgkrx| jd krld|j | _tj|jS td|j	j
 d S )Nrv   Z__dotdotdotint__z'typedef int... %s'Z__dotdotdotfloat__z'typedef float... %s'z*:%d: unsupported usage of "..." in typedef)r   r   r   Zunknown_typerd   rW   ZUnknownIntegerTypeZUnknownFloatTyper   r   ro   )rX   r   rc   r   r   r   r   d  s    





zParser._get_unknown_typec             C   s2   |j j j jdgkrtj|jS td|jj d S )Nrv   z*:%d: unsupported usage of "..." in typedef)r   r   r   Zunknown_ptr_typerd   r   r   ro   )rX   r   r   r   r   r   w  s    zParser._get_unknown_ptr_type)FFF)Fr   )N)NF)N)NF)F)r   
__module____qualname__rY   ri   rq   ra   r`   ru   r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   rM      s4   
&


62

	
^
#
v
3
rM   )r	   ).r   r   Zcommontypesr   r   errorr   r   r   r   ImportErrorrQ   rl   sysversion_infoZthread_threadallocate_lockr^   r]   compileDOTALL	MULTILINEr/   r1   r<   r   r:   rI   r
   
IGNORECASEr   r8   r7   r9   r)   r   r@   rA   r   r$   r,   rD   rL   objectrM   r   r   r   r   <module>   sN   












*27(