509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
M •ZR™  ã               @   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 rˆd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 }xòt 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r°P |d8 }n|dkrÌ|dkrÌP |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 r†tdƒ‚| jd|d |ƒdkr¤td	ƒ‚|j| |d |… ƒ | |d d … } nB| jd
|ƒ}|dk rèt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| ƒƒ}x¬tt|ƒƒD ]œ\}}|jƒ }| | dk�r| jd	||jƒ ƒ}||ksöt‚d
| d |… || |d d … f } qº| ||d … d	k�s4t‚d| d |… || |d d … f } qºW 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}x®tj| ƒD ] }||krô|dkrŠ|rô|j|ƒ |j|ƒ d}nj|dkrœd	}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	rÊt	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s t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: %séÿÿÿÿrz   )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 z¶only 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
|||ƒ �nÀt|tjjƒrf| jd|ƒ nHt|tjjƒr‚| jd|ƒ n,t|tjjƒrž| jd|ƒ n|js®t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ƒ �rŽt|jtjjƒ�rŽ|jjd
k�rŽt|jjd	ƒ�rŽt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�rÆt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r’d }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|ƒ �q²W �qœW |
�sØdg}
|
dgk�rüd|k�sød	|k�rüg }
||
 }
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oœt|d jt	j
jƒoœt|d jjt	j
jƒoœ|d jjjd	gk}|r¾|jƒ  |s¾td
|p¸d ƒ‚‡ fdd„|D ƒ}| ræ|tjgkræg }ˆ 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r¨tj|d d d ƒ}nP|dkrÂtj|d d d ƒ}n6|dkrê|dkrÚt	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	�rªt	d| ƒ‚g }
g }g }g }xä|jD ]Ú}t|jtjjƒ�rüd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 |ƒ �qÂW 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r´t|ƒdks¨t|ƒdkr´|d dkr´t|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	r¢d}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(