a
    ¥Q•hõ®  ã                   @   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
yV   ddl	Z	Y n0 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
y®   dZY n0 dd	„ Zd
Ze dejejB ¡Ze dejejB ¡Ze dej¡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/d(d)„ Z0d*d+„ Z1G d,d-„ d-e2ƒZ3d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   úE/var/www/sistema_ama/venv/lib/python3.9/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^[ \t]*#[ \t]*(?:line|\d+)\b.*$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 u rt ¡ a t S ©N)Ú_parser_cacher   ZCParserr   r   r   r   Ú_get_parser2   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v 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_pycparser8   s6    




r'   c                 C   s,  g }t  | ¡}|s�q| ¡ d }| | d | ¡ … ¡ d| d¡v 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"   Ú	semicolonr   r   r   Ú_preprocess_extern_pythonb   s2    


r0   c                 C   sJ   d| vrd S |   ¡ D ]0}d|v 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   Úliner5   r   r   r   Ú_warn_for_string_literal”   s    
r8   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'))Ústorager5   r6   Úname)Údeclr5   r   r   r   Ú/_warn_for_non_extern_non_static_global_variable    s
    þr<   c                    s$   g ‰ ‡ fdd„}t  || ¡} | ˆ fS )Nc                    s   t ˆ ƒ}ˆ  |  ¡ ¡ d| S )Nz#line@%d)r   r   r   )Úmr%   ©Úline_directivesr   r   Úreplace­   s    z(_remove_line_directives.<locals>.replace©Ú_r_line_directiveÚsub)r   r@   r   r>   r   Ú_remove_line_directives§   s    rD   c                    s   ‡ fdd„}t  || ¡S )Nc                    s.   |   ¡ }| d¡stdƒ‚ˆ t|dd … ƒ S )Nz#line@zBunexpected #line directive (should have been processed and removedé   )r   r   ÚAssertionErrorÚint)r=   Úsr>   r   r   r@   µ   s    
z*_put_back_line_directives.<locals>.replacerA   )r   r?   r@   r   r>   r   Ú_put_back_line_directives´   s    rI   c                 C   s¦  t | ƒ\} }dd„ }t || ¡} i }t | ¡D ](}| ¡ \}}| dd¡ ¡ }|||< q.t d| ¡} tj	dk rvt
| ƒ} t d| ¡} t d| ¡} t d| ¡} t| ƒ} t| ƒ t d	| ¡} tt | ¡ƒ}tt|ƒƒD ]ž\}}| ¡ }	| |	 d
k�r2|  d|	| ¡ ¡}
|
|	k�sJ ‚d| d |	… || |
d d … f } qÐ| |	|	d … dk�sLJ ‚d| d |	… || |	d d … f } qÐt d| ¡} t d| ¡} |  dd¡} t| |ƒ} | |fS )Nc                 S   s   d|   ¡  d¡d  S )Nú Ú
)r   Úcount)r=   r   r   r   Úreplace_keeping_newlinesÃ   s    z-_preprocess.<locals>.replace_keeping_newlinesz\
r   z2.14z volatile volatile const(z volatile volatile const rJ   z[__dotdotdotarray__]ú=ú...z%s,__dotdotdot%d__ %sr	   z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )rD   Ú
_r_commentrC   Ú	_r_defineÚfinditerÚgroupsr@   Ústripr   Ú__version__r'   Ú_r_stdcall2Ú_r_stdcall1Ú_r_cdeclr0   r8   Ú_r_partial_arrayÚlistÚ_r_partial_enumÚ	enumerateÚreversedr   r-   r   Ú_r_int_dotdotdotÚ_r_float_dotdotdotrI   )r   r?   rM   Úmacrosr!   Z	macronameZ
macrovalueÚmatchesÚnumberÚpÚp2r   r   r   Ú_preprocess½   sF    

ÿÿ
re   c                 C   sü   t tƒ}| d¡ | d¡ | d¡ | d¡ | d¡ t ƒ }d}d}d}t | ¡D ] }||v 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>    










rn   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
   )Ú_declarationsrh   Ú_included_declarationsÚ_anonymous_counterÚweakrefÚWeakKeyDictionaryÚ_structnode2typeÚ_optionsÚ_int_constantsÚ_recompleteÚ_uses_new_feature©Úselfr   r   r   Ú__init__)  s    
zParser.__init__c              
   C   sJ  t |ƒ\}}t|ƒ}g }t| jƒD ].}| d¡r"|dd … }| |¡ | |¡ q"|t|ƒ7 }g }| d¡ |D ]}| d| ¡ qp| d¡ | dtf ¡ | |¡ | d¡ d |¡}t	d urÌt	 
¡  z^ztƒ  |¡}	W n6 tjj�y }
 z|  |
|¡ W Y d }
~
n
d }
~
0 0 W t	d u�r@t	 ¡  nt	d u�r>t	 ¡  0 |	||fS )	Nútypedef é   z*# 1 "<cdef automatic initialization code>"ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "%s"r   rK   )re   rn   Úsortedrp   r   r   rl   ÚCDEF_SOURCE_STRINGr   ÚlockÚacquirer   Úparser   Zc_parserÚ
ParseErrorÚconvert_pycparser_errorÚrelease)r{   r   r`   ZctnÚ	typenamesr:   ÚcsourcelinesÚtypenameZfullcsourceÚastÚer   r   r   Ú_parse3  s:    






$

ÿ

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!   r€   rG   r   r3   r   )r{   r‹   r   r7   Úmsgr!   Úlinenumrˆ   r   r   r   Ú_convert_pycparser_errorZ  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Ž   rT   r   )r{   r‹   r   r7   r�   r   r   r   r…   h  s    
zParser.convert_pycparser_errorFNc                 C   s€   |r&|dkrt dƒ‚|r t dƒ‚d}n$|rF||d @ rJt d|f ƒ‚nd}| j}z"|||dœ| _|  |¡ W || _n|| _0 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)Ú
ValueErrorrv   Ú_internal_parse)r{   r   r“   r”   Úpackr•   Zprev_optionsr   r   r   rƒ   r  s(    ÿþzParser.parsec              
   C   s<  |   |¡\}}}|  |¡ t|jƒ}|D ]}|jdkr( qDq(dsDJ ‚d }�zXd| _|D �]F}|}t|tjj	ƒrz|  
|¡ qVt|tjjƒ�rj|jsštd|ƒ‚d}t|jjtjjƒrÐ|jjjd  d¡rÐ|  |¡}n‚t|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f d	�\}}| jd
|j ||d� qV|jjdk�rŒdd l}	|	 d¡ qVtd|jj |ƒ‚qVW n” t�yè }
 z,t|
jƒdk�rÒ|
j|f |
_‚ W Y d }
~
nXd }
~
0  t�y6 }
 z6|  |
|¡}|�r |
jd d|  f|
_‚ W Y d }
~
n
d }
~
0 0 d S )NÚ__dotdotdot__r   Ú__cffi_extern_python_stopz!typedef does not declare any nameéÿÿÿÿZ__dotdotdotTz*(%s *)0)r:   Úpartial_length_okÚtypedef_exampler}   ©ÚqualsZPragmaa  #pragma in cdef() are entirely ignored. They should be removed for now, otherwise your code might behave differently in a future version of CFFI if #pragma support gets added. Note that '#pragma pack' needs to be replaced with the 'packed' keyword argument to cdef().zBunexpected <%s>: this construct is valid C but not valid in cdef()r   z
    *** Err: %s)rŒ   Ú_process_macrosÚiterÚextr:   Ú_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__r5   r6   r   Úargsr   r’   )r{   r   rŠ   r`   Úiteratorr;   Úcurrent_declrŸ   Zrealtyper5   r‹   r�   r   r   r   r—   Š  st    



ÿÿÿ
ÿþü

þ
ÿþþ
zParser._internal_parsec                 C   s8   || j v r*| j | |krd S td|f ƒ‚|| j |< d S )Nz%multiple declarations of constant: %s)rw   r   )r{   Ú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 )	NÚulú-r   Ú0Ú0xZ0or   úmacro )ÚlowerÚrstripr   rG   r·   r¯   )r{   r:   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 )NrO   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)ÚitemsrT   Ú_r_int_literalr!   rÀ   r¯   r   )r{   r`   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_pointerrv   Úgetr£   r¯   r:   )r{   ÚtprŸ   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ƒs8J ‚|  	|||¡ �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u �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)r:   Ú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®   r:   r   ÚRawFunctionTyperÈ   ÚStructÚ_get_struct_union_enum_typeÚUnionÚEnumr   Úis_raw_functionÚis_integer_typeÚhasattrrÍ   rÂ   r!   rÃ   rÀ   ÚUnaryOpÚopÚexprÚ	void_typer   r£   ÚQ_CONSTÚis_array_typer¯   r<   )r{   r;   ÚnoderÆ   rŸ   r   r   r   r¦   ý  sj    ÿÿ

ÿ
þý
ÿ
þýüÿ
ÿ
ÿzParser._parse_declc                 C   s   |   |¡d S r
   )Úparse_type_and_quals)r{   Úcdeclr   r   r   Ú
parse_type0  s    zParser.parse_typec                 C   s`   |   d| ¡d d… \}}|r"J ‚|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Œ   r¢   r§   r²   Úparamsr¤   r   r¥   ÚIDr   r:   r®   )r{   rß   rŠ   r`   Úexprnoder   r   r   rÞ   3  s    zParser.parse_type_and_qualsr   c                 C   sx   || j v rF| j | \}}||u r,||kr,d S | j d¡sFtd|f ƒ‚d| ¡ vsVJ ‚||f| j |< |rt| j |¡ d S )Nr“   zPmultiple declarations of %s (for interactive usage, try cdef(xx, override=True))r™   )rp   rv   rÅ   r   Úsplitrq   ri   )r{   r:   Ú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v r.|tjO }d|jv rB|tjO }d|jv rV|tj	O }|S )Nr   ÚconstÚvolatileZrestrict)
r¤   r   r¥   r¬   r«   rŸ   r   rÛ   Ú
Q_VOLATILEÚ
Q_RESTRICT©r{   r§   rŸ   r   r   r   Ú_extract_qualsI  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 u r^|d ur^t 	|||¡S t 
||¡S )Nú$r   )r¤   r   rÏ   Úas_function_pointerÚStructOrUnionOrEnumr:   r   ÚisdigitÚ	forcenameÚNamedPointerTypeÚPointerType)r{   r§   rŸ   Údeclnamer   r   r   rÄ   U  s    
ÿÿþþzParser._get_type_pointerc                 C   sb  t |tjjƒrtt |jtjjƒrtt|jjƒdkrtd|jjd  | jv rt| jd|jjd   \}}||  	|¡O }||fS t |tjj
ƒrê|jd u r’d }n| j|j|d�}|d urÄ|dkr¼d|f }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ƒ�rpt|
jƒ}|d
dgk�ri }|�r´|d }|dv �r´| |d¡d ||< |d= n�q´�qxg }dD ](}t| |d¡ƒD ]}| |¡ �qÐ�q¼|�sòdg}|dgk�rd|v �sd|v �rg }|| }d |¡}|dk�r<tj|fS |dk�rVtd|jj ƒ‚t| |ƒ\}}|||B 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|  !||¡dfS t |tjjƒ�r(| jd||dd�dfS t |tjjƒ�rN| jd||dd�dfS td|jj ƒ‚d S )Nr   r}   r   rÌ   rO   z_cffi_array_len(%s)r   )rœ   r�   )rõ   ÚsignedÚchar)ÚshortÚlongrö   Úunsigned)rú   rø   rù   rG   rø   rù   rJ   Ú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©   rp   rí   Z	ArrayDeclZdimÚ_parse_constantr®   r   Ú	ArrayTyper«   rÄ   rZ   rÅ   Úranger   r   rÚ   r   Úcoordr7   r   rÐ   rÑ   rÒ   rÓ   rÎ   Ú_parse_function_type)r{   Útypenoder:   rœ   r�   rÆ   rŸ   ÚlengthZitemtypeZ	itemqualsr§   r©   ÚprefixesZnewnamesÚprefixr%   ÚidentZtp0Zquals0r   r   r   r®   ^  s°    ÿþý
ÿ
þ








ÿ
ÿÿ
ÿÿÿzParser._get_type_and_qualsc              	      s4  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 … g d¢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   r:   ú?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argdeclnoderz   r   r   Ú
<listcomp>Ü  s   ÿz/Parser._parse_function_type.<locals>.<listcomp>rŸ   éýÿÿÿ)ré   ré   rè   Ú	__stdcall)rZ   Úgetattrr²   r\   rÖ   r   r   r¤   r§   r   r¥   r¬   r¨   r©   Úpopr   rÚ   r®   rŸ   rÏ   Útuple)r{   r  Úfuncnamerâ   r%   ÚargÚellipsisr²   ÚresultrŸ   Úabir   rz   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y   Y n0 |}|j}|d u rb|d urDd| }n|  jd7  _d| j }d }n"|}d||f }| j |d¡\}}	|d u �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 u�r2|  ||¡ n"|dk�r2|jd u�r2td| ƒ‚|j�sD| |¡ |j�rjd|jv �rj|  d|j |¡ || j |< |dk�r‚|S |jd u �r’|S |jd u�rªt	d| ƒ‚g }
g }g }g }|jD ]Ú}t|jtjjƒ�rúd |jj¡d	k�rú|  ||¡ �qÀ|jd u �rd}n|  |j¡}d| _| j|jdd�\}}| j�rF|  ||¡ t|tjƒ�rh|j�rh|  ||¡ |
  |j�pvd¡ |  |¡ |  |¡ |  |¡ �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   )*ru   ÚKeyErrorr:   rr   rp   rÅ   r   Ú
StructTypeÚ	UnionTyper   Ú_build_enum_typeÚvaluesrF   r¯   r.   rò   Úforce_the_nameÚdeclsÚfldnamesr¤   r§   r   r¥   r¨   r   r©   Ú_make_partialÚbitsizerý   Ú_partial_lengthr®   Úpartialr   r  ÚfldtypesÚ
fldbitsizeÚfldqualsr   rv   r”   Ú	completedrx   )r{   Úkindr§   r:   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   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   ÚStructOrUnionr   Ú
has_c_namer.   r!  )r{   rÆ   rü   r   r   r   r  h  s
    zParser._make_partialc                 C   s  t |tjjƒ�r6|j}d|d   kr.dkrÖn n¤| d¡}z&| d¡rTt|dƒW S t|dƒW S W nb tyÄ   t	|ƒdkrÀ| 
¡ dd… d	kržt|d
ƒ Y S | 
¡ dd… dkrÀt|dƒ Y S Y n0 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v �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�rR|| S |jdk�rj|  ||¡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uUlLr~   r�   r   rá   r»   é   Ú0bzinvalid constant %rú'r›   r	   é   ú\éþÿÿÿú+r¹   Z__dotdotdotarray__TrO   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   rG   r–   r   r½   r   Úordr×   rØ   rý   rÙ   rã   r:   rw   r   r   r   r7   ZBinaryOpÚleftÚrightÚ_c_div)r{   rä   rœ   rH   r:  r;  r   r   r   rý   o  sŽ    


ÿ
ÿ
ÿÿÿ
ÿÿþÿzParser._parse_constantc                 C   s0   || }|dk |dk A r,|| dkr,|d7 }|S )Nr   r   r   )r{   ÚaÚbr  r   r   r   r<  ¸  s    zParser._c_divc           	      C   s°   |d uržd}g }g }d}|j D ]X}t |j¡r4d}q|jd urJ|  |j¡}| |j¡ | |¡ |  |j|¡ |d7 }qt|ƒ}t|ƒ}t	 
|||¡}||_nt	 
|dd¡}|S )NFr   Tr   r   )ÚenumeratorsÚ_r_enum_dotdotdotr!   r:   rÃ   rý   r   r·   r  r   ÚEnumTyper!  )	r{   r'  r  r!  r?  Ú
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v r
| j||d|d� q
|j ¡ D ]\}}|  ||¡ qXd S )Nzanonymous $enum_$rJ   r   r   )rÉ   rÊ   rË   Ú	anonymousrg   T)rç   rŸ   )rp   rÁ   r   rå   r¯   rw   r·   )r{   Úotherr:   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 u r@d|j | _t |j¡S |dgkrx| jd u 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   Úunknown_typer:   ry   ÚUnknownIntegerTypeÚUnknownFloatTyper   r   r7   )r{   r;   r‡   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™   rH  )r§   r©   r   Úunknown_ptr_typer:   r   r   r7   )r{   r;   r   r   r   r­   ó  s
    ÿzParser._get_unknown_ptr_type)FFNF)Fr   )N)NFN)N)NF)F)r±   Ú
__module__Ú__qualname__r|   rŒ   r’   r…   rƒ   r—   r·   rÀ   r    rÈ   r¦   rà   rÞ   r¯   rí   rÄ   r®   r  r  rÑ   r  rý   r<  r  rG  rª   r­   r   r   r   r   ro   '  s>   
'
  ÿ
?3

	  ÿ
i
#
v
I
ro   )4r   r   Zcommontypesr   r   Úerrorr   r   r   r   ÚImportErrorrs   r�   ÚsysÚversion_infoÚthreadÚ_threadÚallocate_lockr�   r   r€   ÚcompileÚDOTALLÚ	MULTILINErP   rQ   rB   r[   r@  rY   rj   r   Ú
IGNORECASErÂ   rW   rV   rX   r,   r   r^   r_   r   r'   r0   r8   r<   rD   rI   re   rn   Úobjectro   r   r   r   r   Ú<module>   s`   



ÿ
þ







ÿ

*2	B(