o
    àý°jÒ®  ã                   @   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
y+   ddl	Z	Y nw ddlZddlZddlZzejdk rCddlZnddlZe ¡ ZW n e
yW   dZY nw 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-ƒZ2dS ).é   )Úmodel)ÚCOMMON_TYPESÚresolve_common_type)ÚFFIErrorÚ	CDefError)Ú
_pycparseré    N)é   c                  C   s   dd l } dd l} d S ©Nr   )Úpycparser.yacctabÚpycparser.lextab)Ú	pycparser© r   ú/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/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   ÚCParserr   r   r   r   Ú_get_parser2   s   r   c                 C   s  g }	 t  | ¡}|sns| | d | ¡ … ¡ | d¡ d}| | ¡ ¡ | ¡ }|  d|¡r7| d¡ |d7 }d}|}|t| ƒk ro| | }|dkrN|d7 }n|dkr\|dkrWn|d8 }n	|dv re|dkren
|d7 }|t| ƒk sA| ||… | | |d …  } q| | ¡ d |¡S )	NTú(ú)Ú*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   s<   


õç

r*   c                 C   s,  g }	 t  | ¡}|sn�| ¡ d }| | d | ¡ … ¡ d| d¡v r)| d¡ n| d¡ | | dkre|  d|¡}|dk rBtd	ƒ‚|  d|d |¡dkrQtd
ƒ‚| | |d |… ¡ | |d d … } n!|  d|¡}|dk rstdƒ‚| | ||d … ¡ | |d d … } | d¡ q| | ¡ d 	|¡S )NTr   Ú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   s6   


â
!
r3   c                 C   sL   d| vrd S |   ¡ D ]}d|v r#| ¡  d¡s#dd l}| d¡  d S q
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"   Úliner8   r   r   r   Ú_warn_for_string_literal”   s   
€ùr;   c                 C   s(   | j sdd l}| d| jf ¡ d S d S )Nr   zrGlobal variable '%s' in cdef(): for consistency with C it should have a storage class specifier (usually 'extern'))Ústorager8   r9   Úname)Údeclr8   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"   rC   r   rA   r   Ú_remove_line_directives§   s   rG   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@   ÚsrA   r   r   rC   µ   s   
z*_put_back_line_directives.<locals>.replacerD   )r"   rB   rC   r   rA   r   Ú_put_back_line_directives´   s   rL   c                 C   s   t | ƒ\} }dd„ }t || ¡} i }t | ¡D ]}| ¡ \}}| dd¡ ¡ }|||< qt d| ¡} tj	dk r;t
| ƒ} t d| ¡} t d| ¡} t d| ¡} t| ƒ} t| ƒ t d	| ¡} tt | ¡ƒ}tt|ƒƒD ]L\}}| ¡ }	| |	 d
kr—|  d|	| ¡ ¡}
|
|	ks…J ‚d| d |	… || |
d d … f } qh| |	|	d … dks£J ‚d| d |	… || |	d d … f } qht 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 rM   z[__dotdotdotarray__]ú=ú...z%s,__dotdotdot%d__ %sr	   z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )rG   Ú
_r_commentrF   Ú	_r_defineÚfinditerÚgroupsrC   Ústripr   Ú__version__r*   Ú_r_stdcall2Ú_r_stdcall1Ú_r_cdeclr3   r;   Ú_r_partial_arrayÚlistÚ_r_partial_enumÚ	enumerateÚreversedr   r0   r   Ú_r_int_dotdotdotÚ_r_float_dotdotdotrL   )r"   rB   rP   Úmacrosr$   Ú	macronameÚ
macrovalueÚmatchesÚnumberÚpÚp2r   r   r   Ú_preprocess½   sF   

ÿÿ
rj   c                 C   sü   t tƒ}| d¡ | d¡ | d¡ | d¡ | d¡ t ƒ }d}d}d}t | ¡D ]P}||v ry|dkrD|rC| |¡ | |¡ d}n5|dkrMd	}d}n,|dkrV|d
7 }n#|dkr_|d
8 }n|dkrt|rs|dkrs| |¡ | |¡ n| |¡ |}q+|S )Nr.   ú,r   r   ÚtypedefFr   r   Tr   )Úsetr   ÚaddÚ_r_wordsÚfindallÚdiscard)r"   Úlook_for_wordsÚ
words_usedÚ
is_typedefÚparenÚprevious_wordÚwordr   r   r   Ú_common_type_namesÿ   sB   






€



€
rx   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 )@ÚParserc                 C   s:   i | _ tƒ | _d| _t ¡ | _i | _i | _g | _	d | _
d S r
   )Ú_declarationsrm   Ú_included_declarationsÚ_anonymous_counterÚweakrefÚWeakKeyDictionaryÚ_structnode2typeÚ_optionsÚ_int_constantsÚ_recompleteÚ_uses_new_feature©Úselfr   r   r   Ú__init__)  s   

zParser.__init__c              
   C   sF  t |ƒ\}}t|ƒ}g }t| jƒD ]}| d¡r(|dd … }| |¡ | |¡ q|t|ƒ7 }g }| d¡ |D ]	}| d| ¡ q8| d¡ | dtf ¡ | |¡ | d¡ d |¡}t	d urft	 
¡  z-ztƒ  |¡}	W n tjjy‰ }
 z|  |
|¡ W Y d }
~
nd }
~
ww W t	d ur“t	 ¡  n
t	d ur�t	 ¡  w w |	||fS )	Nútypedef é   z*# 1 "<cdef automatic initialization code>"ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "%s"r   rN   )rj   rx   Úsortedrz   r   r   rq   ÚCDEF_SOURCE_STRINGr!   ÚlockÚacquirer   Úparser   Úc_parserÚ
ParseErrorÚconvert_pycparser_errorÚrelease)r…   r"   rc   ÚctnÚ	typenamesr=   ÚcsourcelinesÚtypenameÚfullcsourceÚastÚer   r   r   Ú_parse3  sF   


€




€ÿ€€ÿ
ÿ
zParser._parsec                 C   sh   d }t |ƒ}t dtf |¡}|r2t| d¡dƒ}| ¡ }d|  kr)t|ƒkr2n |S ||d  }|S )Nz	%s:(\d+):r   é
   )ÚstrÚrer$   rŠ   rJ   r   r6   r    )r…   r˜   r"   r:   Úmsgr$   Úlinenumr”   r   r   r   Ú_convert_pycparser_errorZ  s   ÿzParser._convert_pycparser_errorc                 C   sB   |   ||¡}t|ƒ}|rd| ¡ |f }t|ƒ‚d|f }t|ƒ‚)Nzcannot parse "%s"
%szparse error
%s)rŸ   r›   rW   r   )r…   r˜   r"   r:   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|r#||d @ r"t d|f ƒ‚nd}| j}z|||dœ| _|  |¡ W || _d S || _w )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)Ú
ValueErrorr€   Ú_internal_parse)r…   r"   r    r¡   Úpackr¢   Úprev_optionsr   r   r   r�   r  s*   ÿÿþzParser.parsec              
   C   s  |   |¡\}}}|  |¡ t|jƒ}|D ]	}|jdkr nqJ ‚d }z¥d| _|D ]œ}|}t|tjj	ƒr9|  
|¡ q(t|tjjƒr¬|jsHtd|ƒ‚d}t|jjtjjƒrc|jjjd  d¡rc|  |¡}n=t|jtjjƒr�t|jjtjjƒr�t|jjjtjjƒr�|jjjjd  d¡r�|  |¡}n| j|j|jdd|jf d	�\}}| jd
|j ||d� q(|jjdkr¼dd l}	|	 d¡ q(td|jj |ƒ‚W d S  tyâ }
 zt|
jƒdkrÝ|
j|f |
_‚ d }
~
w t�y }
 z|  |
|¡}|rý|
jd d|  f|
_‚ d }
~
ww )NÚ__dotdotdot__r   Ú__cffi_extern_python_stopz!typedef does not declare any nameéÿÿÿÿÚ__dotdotdotTz*(%s *)0)r=   Úpartial_length_okÚtypedef_exampler‡   ©ÚqualsÚ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_astÚDeclÚ_parse_declÚTypedefr   ÚtypeÚIdentifierTypeÚnamesr   Ú_get_unknown_typeÚPtrDeclÚTypeDeclÚ_get_unknown_ptr_typeÚ_get_type_and_qualsÚ_declareÚ	__class__Ú__name__r8   r9   r    Úargsr   rŸ   )r…   r"   r—   rc   Úiteratorr>   Úcurrent_declr®   Úrealtyper8   r˜   r�   r   r   r   r¤   Š  s~   


ÿÿÿÿ
ÿþü


þÿþþÞ%€€ü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)r�   r   )r…   ÚkeyÚvalr   r   r   Ú_add_constantsÉ  s   
ÿzParser._add_constantsc                 C   sˆ   |  ¡  d¡}| d¡}|r|dd … }| d¡r*|dkr*| d¡s*d|dd …  }t|dƒ}|r4| }|  ||¡ |  d| |¡ d S )	NÚulú-r   Ú0Ú0xÚ0or   úmacro )ÚlowerÚrstripr   rJ   rÊ   rÁ   )r…   r=   Úint_strÚnegÚpyvaluer   r   r   Ú_add_integer_constantÑ  s   
ÿ
zParser._add_integer_constantc                 C   sb   |  ¡ D ]*\}}| ¡ }t |¡r|  ||¡ q|dkr%|  d| |¡ qtd||||f ƒ‚d S )NrR   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)ÚitemsrW   Ú_r_int_literalr$   rÖ   rÁ   r   )r…   rc   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 Ú__cffi_extern_python_startzextern_python Ú!__cffi_extern_python_plus_c_startzextern_python_plus_c z	function )Ú_get_type_pointerr€   Úgetr³   rÁ   r=   )r…   Útpr®   r>   Útagr   r   r   Ú_declare_functionñ  s   

zParser._declare_functionc                 C   s  |j }t|tjjƒr%| j||jd�\}}t|tjƒsJ ‚|  	|||¡ d S t|tjj
ƒr3|  d|¡ n$t|tjjƒrA|  d|¡ nt|tjjƒrO|  d|¡ n|jsWtd|ƒ‚|jrÿ| j|dd�\}}|jro|  	|||¡ d S | ¡ r�t|dƒr�t|jd	ƒr�t |jj¡r�|  |j|jj¡ d S | ¡ 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 ¡ d S |tju rÐ|j d¡rÐ|j| _d S | jdkrÙtdƒ‚|tj@ rî|jsî| jd|j ||d� d S t |ƒ | jd|j ||d� d S d S )N)r=   ÚstructÚunionÚenumz'construct does not declare any variableT©r«   ÚinitrÙ   rÌ   Ú__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ƒr*t	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—   rc   Úexprnoder   r   r   r÷   3  s   zParser.parse_type_and_qualsr   c                 C   s|   || j v r#| j | \}}||u r||krd S | j d¡s#td|f ƒ‚d| ¡ vs+J ‚||f| j |< |r<| j |¡ d S d S )Nr    zPmultiple declarations of %s (for interactive usage, try cdef(xx, override=True))r§   )rz   r€   rÝ   r   Úsplitr{   rn   )r…   r=   ÚobjÚincludedr®   ÚprevobjÚ	prevqualsr   r   r   rÁ   ;  s   
ÿÿÿzParser._declarec                 C   sZ   d}t |tjjtjjfƒr+d|jv r|tjO }d|jv r!|tjO }d|jv r+|tj	O }|S )Nr   ÚconstÚvolatileÚ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   sP  t |tjjƒr:t |jtjjƒr:t|jjƒdkr:d|jjd  | jv r:| jd|jjd   \}}||  	|¡O }||fS t |tjj
ƒru|jd u rId }n| j|j|d�}|d urb|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ƒ�rj|  	|¡}|j}
t |
tjjƒ�r1t|
jƒ}|d
dgk�ri }|rÖ|d }|dv rÓ| |d¡d ||< |d= nn|s½g }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�r$td|jj ƒ‚t| |ƒ\}}|||B fS t |
tjjƒ�rD|  d|
|¡}||fS t |
tjjƒ�rW|  d|
|¡}||fS t |
tjjƒ�rj|  d|
|¡}||fS t |tjj ƒ�rz|  !||¡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 ƒ‚)Nr   r‡   r   rä   rR   z_cffi_array_len(%s)r   )r«   r¬   )r  ÚsignedÚchar)ÚshortÚlongr  Úunsigned)r  r  r  rJ   r  r  rM   Ú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»   rz   r	  Ú	ArrayDeclÚdimÚ_parse_constantrÀ   r   Ú	ArrayTyper½   rÜ   r]   rÝ   Úranger   r!   ró   r   Úcoordr:   r   ré   rê   rë   rì   rç   Ú_parse_function_type)r…   Útypenoder=   r«   r¬   rÞ   r®   ÚlengthÚitemtypeÚ	itemqualsr¹   r»   ÚprefixesÚnewnamesÚprefixr(   ÚidentÚtp0Úquals0r   r   r   rÀ   ^  s°   ÿ
ÿ

þ


úÿ



ÿ
ÿÿ
ÿÿÿzParser._get_type_and_qualsc              	      s0  t t|jdg ƒƒ}t|ƒD ]\}}t|dƒs'td|pd|d t|ddƒf ƒ‚qt|ƒdkoLt|d	 jt	j
jƒoLt|d	 jjt	j
jƒoL|d	 jjjd
gk}|r]| ¡  |s]td|pZd ƒ‚‡ fdd„|D ƒ}|sp|tjgkrpg }ˆ  |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¹   )Ú.0Úargdeclnoder„   r   r   Ú
<listcomp>Ü  s    ÿz/Parser._parse_function_type.<locals>.<listcomp>r®   éýÿÿÿ)r  r  r  Ú	__stdcall)r]   Ú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   r„   r   r  Ç  sJ   

ÿýÿÿÿþûÿÿ
ÿzParser._parse_function_typec                 C   s2   t |tjƒrt |j|¡S t |tjƒr| ¡ S |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w |}|j}|d u r1|d ur"d| }n|  jd7  _d| j }d }n|}d||f }| j |d¡\}}	|d u r†|dkrSt |d d d ¡}n(|dkr`t |d d d ¡}n|dkrt|d	krlt	d
ƒ‚|  
||j¡}ntd|f ƒ‚|d ur…|  ||¡ n|dkr•|jd ur•td| ƒ‚|js�| |¡ |jr®d|jv r®|  d|j |¡ || j |< |dkr¹|S |jd u rÀ|S |jd urËt	d| ƒ‚g }
g }g }g }|jD ]h}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�r|  ||¡ t|tjƒ�r&|j�r&|  ||¡ |
  |j�p-d¡ |  |¡ |  |¡ |  |¡ qÖt!|
ƒ|_t!|ƒ|_"t!|ƒ|_#t!|ƒ|_$|dgt%|ƒ k�rot|tjƒ�ro|j�rot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   )*r   ÚKeyErrorr=   r|   rz   rÝ   r   Ú
StructTypeÚ	UnionTyper   Ú_build_enum_typeÚvaluesrI   rÁ   r1   r  Úforce_the_nameÚdeclsÚfldnamesr´   r¹   r   rµ   rº   r!   r»   Ú_make_partialÚbitsizer  Ú_partial_lengthrÀ   Úpartialr   r3  ÚfldtypesÚ
fldbitsizeÚfldqualsr    r€   r¡   Ú	completedr‚   )r…   Úkindr¹   r=   r  Ú
force_nameÚexplicit_namerÞ   rÈ   Ú_rA  rF  rG  rH  r>   rC  Úfqualr   r   r   rê   ò  s¨   	ÿ

€ÿÿ






ÿ





ÿz"Parser._get_struct_union_enum_typec                 C   s>   t |tjƒstd|f ƒ‚| ¡ s|std|f ƒ‚d|_d S )Nz%s cannot be partialz%s is partial but has no C nameT)r´   r   ÚStructOrUnionr   Ú
has_c_namer1   rE  )r…   rÞ   r  r   r   r   rB  g  s
   
zParser._make_partialc                 C   sÚ  t |tjjƒr’|j}d|d   krdkrgn nO| d¡}z| d¡r)t|dƒW S t|dƒW S  ty_   t	|ƒdkr]| 
¡ dd… d	krLt|d
ƒ Y S | 
¡ dd… dkr]t|dƒ Y S Y nw td|f ƒ‚|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ƒ�re|  |j¡}|  |j¡}|jdk�r|| S |jdk�r|| S |jdk�r|| S |jdk�r#|  ||¡S |jdk�r3||  ||¡|  S |jdk�r=||> S |jdk�rG||? S |jdk�rQ||@ S |jdk�r[||B S |jd k�re||A S td!|jj ƒ‚)"NrÍ   r   Ú9ÚuUlLrˆ   rš   r   rú   rÎ   é   Ú0bzinvalid constant %rú'r©   r	   é   ú\éþÿÿÿú+rÌ   Ú__dotdotdotarray__TrR   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   rJ   r£   r    rÑ   r   Úordrð   rñ   r  rò   rü   r=   r�   rD  r   r  r:   ÚBinaryOpÚleftÚrightÚ_c_div)r…   rý   r«   rK   rc  rd  r   r   r   r  n  s€   

€û$


þÿzParser._parse_constantc                 C   s0   || }|dk |dk A r|| dkr|d7 }|S )Nr   r   r   )r…   ÚaÚbr7  r   r   r   re  ·  s   zParser._c_divc           	      C   s²   |d urPd}g }g }d}|j D ],}t |j¡rd}q|jd ur%|  |j¡}| |j¡ | |¡ |  |j|¡ |d7 }qt|ƒ}t|ƒ}t	 
|||¡}||_|S t	 
|dd¡}|S )NFr   Tr   r   )ÚenumeratorsÚ_r_enum_dotdotdotr$   r=   rÙ   r  r   rÊ   r3  r   ÚEnumTyperE  )	r…   rL  r@  rE  rh  Ú
enumvaluesÚnextenumvaluerã   rÞ   r   r   r   r=  ½  s,   



ÿzParser._build_enum_typec                 C   sr   |j  ¡ D ]!\}\}}| d¡rq| dd¡d }|dv r&| j||d|d� q|j ¡ D ]
\}}|  ||¡ q,d S )Nzanonymous $enum_$rM   r   r   )rá   râ   rã   Ú	anonymousrl   T)r   r®   )rz   r×   r   rþ   rÁ   r�   rÊ   )r…   Úotherr=   rÞ   r®   rJ  ÚkÚvr   r   r   ÚincludeÕ  s   
€ÿzParser.includec                 C   sˆ   |j j j}|dgkrt |j¡S |dgkr&| jd u r d|j | _t |j¡S |dgkr<| jd u r6d|j | _t |j¡S td|j	j
 ƒ‚)Nr§   Ú__dotdotdotint__z'typedef int... %s'Ú__dotdotdotfloat__z'typedef float... %s'ú*:%d: unsupported usage of "..." in typedef)r¹   r»   r   Úunknown_typer=   rƒ   ÚUnknownIntegerTypeÚUnknownFloatTyper   r  r:   )r…   r>   r“   r   r   r   r¼   ß  s   





ÿzParser._get_unknown_typec                 C   s.   |j j j jdgkrt |j¡S td|jj ƒ‚)Nr§   rt  )r¹   r»   r   Úunknown_ptr_typer=   r   r  r:   )r…   r>   r   r   r   r¿   ò  s
   ÿzParser._get_unknown_ptr_type)FFNF)Fr   r   )NFN)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ê   rB  r  re  r=  rq  r¼   r¿   r   r   r   r   ry   '  s@    
'

ÿ?3

	
ÿ
i#
u
I
ry   )3r   r   Úcommontypesr   r   Úerrorr   r   r   r   ÚImportErrorr}   rœ   ÚsysÚversion_infoÚthreadÚ_threadÚallocate_lockr‹   r   rŠ   ÚcompileÚDOTALLÚ	MULTILINErS   rT   rE   r^   ri  r\   ro   r   Ú
IGNORECASErØ   rZ   rY   r[   r/   r   ra   rb   r   r*   r3   r;   r?   rG   rL   rj   rx   ry   r   r   r   r   Ú<module>   sf    ÿ

ÿ
ÿ
þ







ÿ

*2	B(