
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    Ù„=^W¤  ã                   @   s´  d dl mZ d dlmZmZ d dlmZmZ z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z(ejdk rˆddlZnddlZe ¡ ZW n e
k
r²   dZY nX dd	„ Zd
Ze dejejB ¡Ze dejejB ¡Ze d¡Ze d¡Ze d¡Ze d¡Zdae dej¡Z e d¡Z!e d¡Z"e d¡Z#e d¡Z$e d¡Z%e d¡Z&e d¡Z'dd„ Z(dd„ Z)dd„ Z*dd „ Z+d!d"„ Z,d#d$„ Z-d%d&„ Z.G d'd(„ d(e/ƒZ0dS ))é   )Úmodel)ÚCOMMON_TYPESÚresolve_common_type)ÚFFIErrorÚ	CDefError)Ú
_pycparseré    N)é   c                  C   s   dd l } dd l} d S ©Nr   )Zpycparser.yacctabZpycparser.lextab)Ú	pycparser© r   ú?/opt/alt/python38/lib64/python3.8/site-packages/cffi/cparser.pyÚ%_workaround_for_static_import_finders   s    r   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 ¡ a t S ©N)Ú_parser_cacher   ZCParserr   r   r   r   Ú_get_parser1   s    r   c                 C   s  g }t  | ¡}|sqð| | d | ¡ … ¡ | d¡ d}| | ¡ ¡ | ¡ }|  d|¡rl| d¡ |d7 }d}|}|t| ƒk rÒ| | }|dkrš|d7 }n.|dkr¶|dkr¬qÒ|d8 }n|dkrÈ|dkrÈqÒ|d7 }qt| ||… | | |d …  } q| | ¡ d |¡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_pycparser7   s:    

 
 



r'   c                 C   s,  g }t  | ¡}|s�q| ¡ d }| | d | ¡ … ¡ d| d¡krR| d¡ n
| d¡ | | dkrÊ|  d|¡}|dk r„tdƒ‚|  d|d |¡dkr¢td	ƒ‚| | |d |… ¡ | |d d … } nB|  d
|¡}|dk rætdƒ‚| | ||d … ¡ | |d d … } | d¡ q| | ¡ d 	|¡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_pythona   s2    


r/   c                 C   sJ   d| krd S |   ¡ D ]0}d|kr| ¡  d¡sdd l}| d¡  qFqd S )Nú"ú#r   z¨String literal found in cdef() or type source. String literals are ignored here, but you should remove them anyway because some character sequences confuse pre-parsing.)Ú
splitlinesÚlstripr   ÚwarningsÚwarn)r   Úliner4   r   r   r   Ú_warn_for_string_literal“   s    
r7   c                 C   s$   | j s dd l}| d| jf ¡ d S )Nr   zrGlobal variable '%s' in cdef(): for consistency with C it should have a storage class specifier (usually 'extern'))Zstorager4   r5   Úname)Údeclr4   r   r   r   Ú/_warn_for_non_extern_non_static_global_variableŸ   s
    þr:   c           	      C   s‚  t  d| ¡} i }t | ¡D ](}| ¡ \}}| dd¡ ¡ }|||< qt d| ¡} tjdk rbt	| ƒ} t
 d| ¡} t d| ¡} t d| ¡} t| ƒ} t| ƒ t d| ¡} tt | ¡ƒ}tt|ƒƒD ]œ\}}| ¡ }| | dk�r|  d	|| ¡ ¡}||ksøt‚d
| d |… || |d d … f } q¼| ||d … d	k�s6t‚d| d |… || |d d … f } q¼t d| ¡} t d| ¡} |  d	d¡|fS )Nú z\
r   z2.14z volatile volatile const(z volatile volatile const z[__dotdotdotarray__]ú=ú...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/   r7   Ú_r_partial_arrayÚlistÚ_r_partial_enumÚ	enumerateÚreversedr   r-   r   ÚAssertionErrorÚ_r_int_dotdotdotÚ_r_float_dotdotdot)	r   Úmacrosr!   Z	macronameZ
macrovalueÚmatchesÚnumberÚpÚp2r   r   r   Ú_preprocess¦   s>    

ÿÿrV   c                 C   sü   t tƒ}| d¡ | d¡ | d¡ | d¡ | d¡ t ƒ }d}d}d}t | ¡D ] }||krò|dkrˆ|rò| |¡ | |¡ 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ò| |¡ | |¡ n
| |¡ |}qV|S )Nr+   ú,r   r   ÚtypedefFr   r   Tr   )Úsetr   ÚaddÚ_r_wordsÚfindallÚdiscard)r   Zlook_for_wordsZ
words_usedZ
is_typedefZparenZprevious_wordÚwordr   r   r   Ú_common_type_namesà   s>    










r_   c                   @   sò   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd: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d„ Zd;d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d8d9„ Zd
S )AÚParserc                 C   s:   i | _ tƒ | _d| _t ¡ | _i | _i | _g | _	d | _
d S r
   )Ú_declarationsrY   Ú_included_declarationsÚ_anonymous_counterÚweakrefÚWeakKeyDictionaryÚ_structnode2typeÚ_optionsÚ_int_constantsÚ_recompleteÚ_uses_new_feature©Úselfr   r   r   Ú__init__
  s    
zParser.__init__c              
   C   s,  t |ƒ\}}t|ƒ}g }t| jƒD ].}| d¡r"|dd … }| |¡ | |¡ q"|t|ƒ7 }g }| d¡ |D ]}| d| ¡ qp| d¡ | dtf ¡ | |¡ d |¡}t	d k	rÂt	 
¡  zJztƒ  |¡}	W n4 tjjk
�r }
 z|  |
|¡ W 5 d }
~
X Y nX W 5 t	d k	�r t	 ¡  X |	||fS )Nútypedef é   z*# 1 "<cdef automatic initialization code>"ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "%s"Ú
)rV   r_   Úsortedra   r   r   r]   ÚCDEF_SOURCE_STRINGr   ÚlockÚacquireÚreleaser   Úparser   Zc_parserZ
ParseErrorÚconvert_pycparser_error)rl   r   rQ   ZctnÚ	typenamesr8   ÚcsourcelinesÚtypenameZfullcsourceÚastÚer   r   r   Ú_parse  s4    





"

zParser._parsec                 C   sf   d }t |ƒ}t dtf |¡}|rbt| d¡dƒ}| ¡ }d|  krRt|ƒkrbn n||d  }|S )Nz	%s:(\d+):r   é
   )ÚstrÚrer!   rr   Úintr   r2   r   )rl   r|   r   r6   Úmsgr!   Zlinenumry   r   r   r   Ú_convert_pycparser_error:  s    zParser._convert_pycparser_errorc                 C   s@   |   ||¡}t|ƒ}|r*d| ¡ |f }n
d|f }t|ƒ‚d S )Nzcannot parse "%s"
%szparse error
%s)rƒ   r   rD   r   )rl   r|   r   r6   r‚   r   r   r   rw   H  s    
zParser.convert_pycparser_errorFNc                 C   sz   |r&|dkrt dƒ‚|r t dƒ‚d}n$|rF||d @ rJt d|f ƒ‚nd}| j}z|||dœ| _|  |¡ W 5 || _X d S )NTzB'packed' should be False or True; use 'pack' to give another valuez$cannot give both 'pack' and 'packed'r   z%'pack' must be a power of two, not %rr   )ÚoverrideÚpackedÚ	dllexport)Ú
ValueErrorrg   Ú_internal_parse)rl   r   r„   r…   Úpackr†   Zprev_optionsr   r   r   rv   R  s(    ÿþzParser.parsec              
   C   s  |   |¡\}}}|  |¡ t|jƒ}|D ]}|jdkr( qDq(dsDt‚d }�z<d| _|D �]*}|}t|tj	j
ƒrz|  |¡ qVt|tj	jƒ�r`|jsštd|ƒ‚d}t|jjtj	jƒrÐ|jjjd  d¡rÐ|  |¡}nxt|jtj	jƒ�r0t|jjtj	jƒ�r0t|jjjtj	jƒ�r0|jjjjd  d¡�r0|  |¡}n| j|j|jdd�\}}| jd	|j ||d
� qV|jjdk�rpqVtd|jj |ƒ‚qVW n� tk
�rÊ }	 z$t|	jƒdk�r¸|	j|f |	_‚ W 5 d }	~	X Y nN tk
�r }	 z.|  |	|¡}
|
�r|	jd d|
  f|	_‚ W 5 d }	~	X Y nX d S )NÚ__dotdotdot__r   Ú__cffi_extern_python_stopz!typedef does not declare any nameéÿÿÿÿZ__dotdotdotT)r8   Úpartial_length_okrn   ©ÚqualsZPragmazBunexpected <%s>: this construct is valid C but not valid in cdef()r   z
    *** Err: %s)r}   Ú_process_macrosÚiterÚextr8   rN   Ú_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   rƒ   )rl   r   r{   rQ   Úiteratorr9   Zcurrent_declr�   Zrealtyper|   r‚   r   r   r   rˆ   j  sp    



ÿÿÿ
ÿþü  ÿ
þþ
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)rh   r   )rl   ÚkeyÚvalr   r   r   Ú_add_constants   s    
ÿzParser._add_constantsc                 C   sˆ   |  ¡  d¡}| d¡}|r(|dd … }| d¡rT|dkrT| d¡sTd|dd …  }t|dƒ}|rh| }|  ||¡ |  d| |¡ d S )	NZulú-r   Ú0Ú0xZ0or   úmacro )ÚlowerÚrstripr   r�   r¦   rŸ   )rl   r8   Zint_strÚnegZpyvaluer   r   r   Ú_add_integer_constant¨  s    
ÿ
zParser._add_integer_constantc                 C   sd   |  ¡ D ]V\}}| ¡ }t |¡r0|  ||¡ q|dkrJ|  d| |¡ qtd||||f ƒ‚qd S )Nr=   rª   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)ÚitemsrD   Ú_r_int_literalr!   r®   rŸ   r   )rl   rQ   r¤   Úvaluer   r   r   r�   ·  s    

úÿzParser._process_macrosc                 C   sX   |   ||¡}| j d¡rd}n$| jdkr.d}n| jdkr>d}nd}|  ||j |¡ d S )Nr†   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_pointerrg   Úgetr“   rŸ   r8   )rl   Útpr�   r9   Ú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	‚|  
|||¡ �nÆt|tjjƒrf|  d|¡ nHt|tjjƒr‚|  d|¡ n,t|tjjƒrž|  d|¡ n|js®td|ƒ‚|j�r| j|dd�\}}|jrà|  
|||¡ �n0| ¡ �r(t|dƒ�r(t|jd	ƒ�r(t |jj¡�r(|  |j|jj¡ nè| ¡ �rŽt|jtjjƒ�rŽ|jjd
k�rŽt|jjd	ƒ�rŽt |jjj¡�rŽ|  |jd
|jjj ¡ n‚|tjk�r²|j d¡�r²|j| _n^| jdk�rÆtdƒ‚|tj@ �rò|j�sò| j d|j ||d� nt!|ƒ | j d|j ||d� d S )N)r8   ÚstructÚunionÚenumz'construct does not declare any variableT©r�   Úinitr±   r§   Z__cffi_extern_python_r‹   z<cannot declare constants or variables with 'extern "Python"'z	constant rŽ   z	variable )"r—   r”   r   r•   ÚFuncDeclrž   r8   r   ÚRawFunctionTyperN   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Ÿ   r:   )rl   r9   Únoder´   r�   r   r   r   r–   Ô  sj    ÿÿ

ÿ
þý
ÿ
þýüÿ
ÿ
ÿzParser._parse_declc                 C   s   |   |¡d S r
   )Úparse_type_and_quals)rl   Úcdeclr   r   r   Ú
parse_type  s    zParser.parse_typec                 C   s`   |   d| ¡d d… \}}|r"t‚|jd jjjd }t|tjj	ƒrTt
d|jf ƒ‚|  |j¡S )Nzvoid __dummy(
%s
);é   rŒ   r   zunknown identifier '%s')r}   rN   r’   r—   r¢   Úparamsr”   r   r•   ÚIDr   r8   rž   )rl   rÊ   r{   rQ   Ú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 d¡sFtd|f ƒ‚d| ¡ ksVt‚||f| j |< |rt| j |¡ d S )Nr„   zPmultiple declarations of %s (for interactive usage, try cdef(xx, override=True))rŠ   )ra   rg   r³   r   ÚsplitrN   rb   rZ   )rl   r8   ÚobjÚincludedr�   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›   r�   r   rÇ   Z
Q_VOLATILEZ
Q_RESTRICT©rl   r—   r�   r   r   r   Ú_extract_quals   s    
ÿ





zParser._extract_qualsc                 C   sj   t |tjƒr| ¡ S t |tjƒr^|j d¡r^|jdd …  ¡ r^|jd kr^|d k	r^t 	|||¡S t 
||¡S )Nú$r   )r”   r   r½   Úas_function_pointerZStructOrUnionOrEnumr8   r   ÚisdigitÚ	forcenameZNamedPointerTypeÚPointerType)rl   r—   r�   Údeclnamer   r   r   r²   ,  s    
ÿÿþþzParser._get_type_pointerc                 C   s>  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   \}}||  	|¡O }||fS t |tjj
ƒrÆ|jd kr’d }n| j|j|d�}| j|j|d�\}}t ||¡|fS t |tjjƒ�r|  |j¡\}}| j|||d�}|  	|¡}||fS t |tjjƒ�r¾|  	|¡}|j}	t |	tjjƒ�rLt|	jƒ}
|
ddgk�rúi }|
�r�|
d }|dk�r�| |d¡d ||< |
d= n�q��qTg }d	D ](}t| |d¡ƒD ]}| |¡ �q¬�q˜|
�sÎd
g}
|
d
gk�ròd|k�sîd|k�ròg }
||
 }
d |
¡}|dk�rtj|fS |dk�r2td|jj ƒ‚t| |ƒ\}}|||B fS t |	tjjƒ�rr|  d|	|¡}||fS t |	tjjƒ�r˜|  d|	|¡}||fS t |	tjjƒ�r¾|  d|	|¡}||fS t |tjj ƒ�rÞ|  !||¡dfS t |tjjƒ�r| jd||dd�dfS t |tjjƒ�r*| jd||dd�dfS td|jj ƒ‚d S )Nr   rn   r   rº   )rÜ   ÚsignedÚchar)ÚshortÚlongrÝ   Úunsigned)rá   rß   rà   r�   rß   rà   r;   ÚvoidrŠ   z:%d: bad usage of "..."r·   r¸   r¹   T)Únestedz(:%d: bad or unsupported type declaration)"r”   r   r•   rœ   r—   r˜   r   r™   ra   rÖ   Z	ArrayDeclZdimÚ_parse_constantrž   r   Ú	ArrayTyper›   r²   rJ   r³   Úranger   r   rÆ   r   Úcoordr6   r   r¾   r¿   rÀ   rÁ   r¼   Ú_parse_function_type)rl   Útypenoder8   r�   r´   r�   ÚlengthZitemtypeZ	itemqualsr—   r™   ÚprefixesZnewnamesÚprefixr%   ÚidentZtp0Zquals0r   r   r   rž   5  s¨    ÿþý
 ÿÿ








ÿ
ÿÿ
ÿÿÿzParser._get_type_and_qualsc              	      s6  t t|jdg ƒƒ}t|ƒD ]4\}}t|dƒstd|p6d|d t|ddƒf ƒ‚q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º| ¡  |sºtd|p´d ƒ‚‡ fdd„|D ƒ}|sà|tjgkràg }ˆ  |j¡\}}	d }
t|jdƒ�r"|jjdd … dddgk�r"d}
t 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   r8   ú?r   rŒ   rŠ   z=%s: a function with only '(...)' as argument is not correct Cc                    s   g | ]}ˆ j ˆ  |j¡Ž ‘qS r   )Ú_as_func_argrž   r—   )Ú.0Zargdeclnoderk   r   r   Ú
<listcomp>¨  s   ÿz/Parser._parse_function_type.<locals>.<listcomp>r�   éýÿÿÿrÔ   rÓ   Z	__stdcall)rJ   Úgetattrr¢   rL   rÂ   r   r   r”   r—   r   r•   rœ   r˜   r™   Úpopr   rÆ   rž   r�   r½   Útuple)rl   ré   ÚfuncnamerÍ   r%   ÚargZellipsisr¢   Úresultr�   Úabir   rk   r   rè   “  sH    

ÿýÿÿþûÿÿ
ÿzParser._parse_function_typec                 C   s6   t |tjƒrt |j|¡S t |tjƒr.| ¡ S |S d S r   )r”   r   rå   rÛ   Úitemr½   rØ   rÕ   r   r   r   rï   ¶  s
    zParser._as_func_argc                 C   s*  z| j | W S  tk
r    Y nX |}|j}|d krd|d k	rFd| }n|  jd7  _d| j }d }n"|}d||f }| j |d¡\}}	|d k�r|dkrªt |d d d ¡}nP|dkrÄt |d d d ¡}n6|dkrì|d	krÜt	d
ƒ‚|  
||j¡}ntd|f ƒ‚|d k	�r4|  ||¡ n"|dk�r4|jd k	�r4td| ƒ‚|j�sF| |¡ |j�rld|jk�rl|  d|j |¡ || j |< |dk�r„|S |jd k�r”|S |jd k	�r¬t	d| ƒ‚g }
g }g }g }|jD ]Ú}t|jtjjƒ�rüd |jj¡d	k�rü|  ||¡ �qÂ|jd k�rd}n|  |j¡}d| _| j|jdd�\}}| j�rH|  ||¡ t|tjƒ�rj|j�rj|  ||¡ |
  |j�pxd¡ |  |¡ |  |¡ |  |¡ �qÂt!|
ƒ|_t!|ƒ|_"t!|ƒ|_#t!|ƒ|_$|dgt%|ƒ k�rþt|tjƒ�rþ|j�rþtd|f ƒ‚| j& d¡|_'|j(�r&d|_(| j)  |¡ |S )Nz$%sr   z$%dz%s %s)NNr·   r¸   r¹   rŠ   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   rŒ   FTrº   z#%s: using both bitfields and '...;'r…   r   )*rf   ÚKeyErrorr8   rc   ra   r³   r   Z
StructTypeZ	UnionTyper   Ú_build_enum_typeÚvaluesrN   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   rg   r…   Z	completedri   )rl   Úkindr—   r8   rã   Z
force_nameÚexplicit_namer´   r¤   Ú_rÿ   r  r  r  r9   r  Zfqualr   r   r   r¿   ¾  s¦    	




ÿÿ



ÿÿ






ÿz"Parser._get_struct_union_enum_typec                 C   s>   t |tjƒstd|f ƒ‚| ¡ s4|s4t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  )rl   r´   rã   r   r   r   r   4  s
    zParser._make_partialc                 C   s  t |tjjƒ�r8|j}d|d   kr.dkrØn n¦| d¡}z&| d¡rTt|dƒW S t|dƒW S W nd tk
rÆ   t	|ƒdkrÂ| 
¡ dd… d	kr t|d
ƒ Y S | 
¡ dd… dkrÂt|dƒ Y S Y nX td|f ƒ‚n`|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¡S t |tjjƒ�rŠ|jdk�rŠ|  |j¡ S t |tjjƒ�r´|j| jk�r´| j|j S t |tjjƒ�rð|jdk�rð|�ràd| _dS td|jj ƒ‚t |tjjƒ�rð|  |j¡}|  |j¡}|jdk�r,|| S |jdk�r@|| S |jdk�rT|| S |jdk�rl|  ||¡S |jdk�rŒ||  ||¡|  S |jdk�r ||> S |jdk�r´||? S |jdk�rÈ||@ S |jdk�rÜ||B S |jd k�rð||A S td!|jj ƒ‚d S )"Nr¨   r   Ú9ZuUlLro   r~   r   rÌ   r©   é   Z0bzinvalid constant %rú'rŒ   r	   é   ú\éþÿÿÿú+r§   Z__dotdotdotarray__Tr=   zT:%d: unsupported '[...]' here, cannot derive the actual array length in this contextr   ú/ú%z<<z>>ú&ú|ú^z?:%d: unsupported expression: expected a simple numeric constant)r”   r   r•   ÚConstantr±   r¬   r   r�   r‡   r   r«   r   ÚordrÃ   rÄ   rä   rÅ   rÎ   r8   rh   r  r   rç   r6   ZBinaryOpÚleftÚrightÚ_c_div)rl   rÏ   r�   Úsr  r  r   r   r   rä   ;  sŽ    


ÿ
ÿ
ÿÿÿ
ÿÿþÿzParser._parse_constantc                 C   s0   || }|dk |dk A r,|| dkr,|d7 }|S )Nr   r   r   )rl   ÚaÚbrø   r   r   r   r  „  s    zParser._c_divc           	      C   s°   |d k	ržd}g }g }d}|j D ]X}t |j¡r4d}q|jd k	rJ|  |j¡}| |j¡ | |¡ |  |j|¡ |d7 }qt|ƒ}t|ƒ}t	 
|||¡}||_nt	 
|dd¡}|S )NFr   Tr   r   )ÚenumeratorsÚ_r_enum_dotdotdotr!   r8   r±   rä   r   r¦   rõ   r   ZEnumTyper  )	rl   r  rþ   r  r  Z
enumvaluesZnextenumvaluer¹   r´   r   r   r   rü   Š  s*    



zParser._build_enum_typec                 C   sr   |j  ¡ D ]B\}\}}| d¡r"q
| dd¡d }|dkr
| j||d|d� q
|j ¡ D ]\}}|  ||¡ qXd S )Nzanonymous $enum_$r;   r   r   )r·   r¸   r¹   Z	anonymousrX   T)rÒ   r�   )ra   r¯   r   rÐ   rŸ   rh   r¦   )rl   Úotherr8   r´   r�   r  ÚkÚvr   r   r   Úinclude¢  s    
zParser.includec                 C   sŒ   |j j j}|dgkr t |j¡S |dgkrL| jd kr@d|j | _t |j¡S |dgkrx| jd krld|j | _t |j¡S td|j	j
 ƒ‚d S )NrŠ   Z__dotdotdotint__z'typedef int... %s'Z__dotdotdotfloat__z'typedef float... %s'ú*:%d: unsupported usage of "..." in typedef)r—   r™   r   Zunknown_typer8   rj   ZUnknownIntegerTypeZUnknownFloatTyper   rç   r6   )rl   r9   rx   r   r   r   rš   ¬  s    





ÿzParser._get_unknown_typec                 C   s2   |j j j jdgkrt |j¡S td|jj ƒ‚d S )NrŠ   r$  )r—   r™   r   Zunknown_ptr_typer8   r   rç   r6   )rl   r9   r   r   r   r�   ¿  s
    ÿzParser._get_unknown_ptr_type)FFNF)Fr   )N)NF)N)NF)F)r¡   Ú
__module__Ú__qualname__rm   r}   rƒ   rw   rv   rˆ   r¦   r®   r�   r¶   r–   rË   rÉ   rŸ   rÖ   r²   rž   rè   rï   r¿   r   rä   r  rü   r#  rš   r�   r   r   r   r   r`     s:   
&
  ÿ
63

	
^
#
v
I
r`   )1r   r   Zcommontypesr   r   Úerrorr   r   r   r   ÚImportErrorrd   r€   ÚsysÚversion_infoÚthreadÚ_threadÚallocate_lockrs   r   rr   ÚcompileÚDOTALLÚ	MULTILINEr>   r@   rK   r  rI   r[   r   Ú
IGNORECASEr°   rG   rF   rH   r,   r   rO   rP   r   r'   r/   r7   r:   rV   r_   Úobjectr`   r   r   r   r   Ú<module>   sZ   



ÿ
þ







ÿ

*2:(