3
ãdeÇ¬  ã               @   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d	„ Zd
ZejdejejB ƒZejdejejB ƒZejdejƒ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-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   úC/var/www/agendate/envp3/lib/python3.6/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 krtjƒ a t S )N)Ú_parser_cacher
   ZCParserr   r   r   r   Ú_get_parser2   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_pycparser8   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_pythonb   s4    


r-   c             C   sN   d| krd S x<| j ƒ D ]0}d|kr|jƒ jdƒ rdd l}|jdƒ P qW 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   Úliner2   r   r   r   Ú_warn_for_string_literal”   s    
r5   c             C   s$   | j s dd l}|j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storager2   r3   Úname)Údeclr2   r   r   r   Ú/_warn_for_non_extern_non_static_global_variable    s    r8   c                s$   g ‰ ‡ fdd„}t j|| ƒ} | ˆ fS )Nc                s   t ˆ ƒ}ˆ j| jƒ ƒ 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    r>   c                s   ‡ fdd„}t j|| ƒS )Nc                s.   | j ƒ }|jdƒstdƒ‚ˆ t|dd … ƒ S )Nz#line@zBunexpected #line directive (should have been processed and removedé   )r   r   ÚAssertionErrorÚint)r9   Ús)r:   r   r   r;   µ   s    
z*_put_back_line_directives.<locals>.replace)r<   r=   )r   r:   r;   r   )r:   r   Ú_put_back_line_directives´   s    rC   c             C   s®  t | ƒ\} }dd„ }tj|| ƒ} i }x6tj| ƒD ](}|jƒ \}}|jddƒjƒ }|||< q0W tjd| ƒ} tj	dk rzt
| ƒ} tjd| ƒ} tjd| ƒ} tjd| ƒ} t| ƒ} t| ƒ tjd	| ƒ} ttj| ƒƒ}x®tt|ƒƒD ]ž\}}|jƒ }	| |	 d
k�r8| jd|	|jƒ ƒ}
|
|	k�st‚d| d |	… || |
d d … f } qÖ| |	|	d … dk�sRt‚d| d |	… || |	d d … f } qÖW tjd| ƒ} tjd| ƒ} | jddƒ} t| |ƒ} | |fS )Nc             S   s   d| j ƒ jdƒd  S )Nú Ú
)r   Úcount)r9   r   r   r   Úreplace_keeping_newlinesÃ   s    z-_preprocess.<locals>.replace_keeping_newlinesz\
r   z2.14z volatile volatile const(z volatile volatile const rD   z[__dotdotdotarray__]ú=z...z%s,__dotdotdot%d__ %sr	   z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )r>   Ú
_r_commentr=   Ú	_r_defineÚfinditerÚgroupsr;   Ústripr
   Ú__version__r%   Ú_r_stdcall2Ú_r_stdcall1Ú_r_cdeclr-   r5   Ú_r_partial_arrayÚlistÚ_r_partial_enumÚ	enumerateÚreversedr   r+   r   r@   Ú_r_int_dotdotdotÚ_r_float_dotdotdotrC   )r   r:   rG   Úmacrosr   Z	macronameZ
macrovalueÚmatchesÚnumberÚpÚp2r   r   r   Ú_preprocess½   sB    

r^   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_wordÚwordr   r   r   Ú_common_type_namesÿ   s>    










rg   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jƒ | _i | _i | _g | _	d | _
d S )Nr   )Ú_declarationsra   Ú_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"rE   )r^   rg   Úsortedri   r   r   re   ÚCDEF_SOURCE_STRINGr   ÚlockÚacquirer   Úparser
   Zc_parserÚ
ParseErrorÚconvert_pycparser_errorÚrelease)rs   r   rY   ZctnÚ	typenamesr6   ÚcsourcelinesÚtypenameZfullcsourceÚastÚer   r   r   Ú_parse3  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   rw   rA   r   r0   r   )rs   r‚   r   r4   Úmsgr   Úlinenumr   r   r   r   Ú_convert_pycparser_errorY  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)r‰   r…   rM   r   )rs   r‚   r   r4   r‡   r   r   r   r|   g  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œ| _| j|ƒ W d || _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)Ú
ValueErrorro   Ú_internal_parse)rs   r   rŠ   r‹   ÚpackrŒ   Zprev_optionsr   r   r   rz   q  s$    
zParser.parsec             C   s.  | j |ƒ\}}}| j|ƒ t|jƒ}x |D ]}|jdkr*P q*W dsFt‚d }�yLd| _�x>|D �]4}|}t|tj	j
ƒr€| j|ƒ q\t|tj	jƒ�rp|js td|ƒ‚d}t|jjtj	jƒrÖ|jjjd jdƒrÖ| j|ƒ}n‚t|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f d	�\}}| jd
|j ||d� q\|jjdk�r€q\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__dotdotdotTz*(%s *)0)r6   Úpartial_length_okÚtypedef_exampleztypedef )ÚqualsZPragmazBunexpected <%s>: this construct is valid C but not valid in cdef()z
    *** Err: %séÿÿÿÿr•   )rƒ   Ú_process_macrosÚiterÚextr6   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   r‰   )rs   r   r�   rY   Úiteratorr7   Zcurrent_declr”   Zrealtyper‚   r‡   r   r   r   rŽ   ‰  sZ    





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)rp   r   )rs   ÚkeyÚvalr   r   r   Ú_add_constantsÀ  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 )	NÚulú-r   Ú0Ú0xZ0or   zmacro )ÚlowerÚrstripr   rA   r¬   r¥   )rs   r6   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)ÚitemsrM   Ú_r_int_literalr   r´   r¥   r   )rs   rY   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 )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_pointerro   Úgetr™   r¥   r6   )rs   Útpr”   r7   Ú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
|||ƒ �n2|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| _n`| jdk�rÆtdƒ‚|tj@ �rô|j �rô| j d|j ||d� nt!|ƒ | j d|j ||d� d S )N)r6   Ú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¤   r6   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¥   r8   )rs   r7   Únoderº   r”   r   r   r   rœ   ô  sR    


zParser._parse_declc             C   s   | j |ƒd S )Nr   )Úparse_type_and_quals)rs   Ú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'r•   )rƒ   r@   r˜   r�   r¨   Úparamsrš   r
   r›   ÚIDr   r6   r¤   )rs   rÏ   r�   rY   Ú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 )NrŠ   zPmultiple declarations of %s (for interactive usage, try cdef(xx, override=True))r�   )ri   ro   r¹   r   Úsplitr@   rj   rb   )rs   r6   ÚobjÚincludedr”   ZprevobjZ	prevqualsr   r   r   r¥   2  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)rs   r�   r”   r   r   r   Ú_extract_quals@  s    






zParser._extract_qualsc             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StructOrUnionOrEnumr6   r   ÚisdigitÚ	forcenameZNamedPointerTypeÚPointerType)rs   r�   r”   Údeclnamer   r   r   r¸   L  s    zParser._get_type_pointerc             C   sl  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�}|d k	rÄ|dkr¼d|f }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ƒ�rzt|
jƒ}|d
dgk�r(i }x<|�r´|d }|dk�r®|j|dƒd ||< |d= nP �qzW 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�rFt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ƒ�r2| jd||dd�dfS t |tjjƒ�rX| jd||dd�dfS td|jj ƒ‚d S )Nr   ztypedef r   )r’   z...z_cffi_array_len(%s)r   )r’   r“   )rà   ÚsignedÚcharÚshortÚlongÚunsignedrA   rD   Ú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š   r
   r›   r¢   r�   rž   r   rŸ   ri   rÚ   Z	ArrayDeclZdimÚ_parse_constantr¤   r   Ú	ArrayTyper¡   r¸   rS   r¹   Úranger   r   rË   r   Úcoordr4   r   rÃ   rÄ   rÅ   rÆ   rÁ   Ú_parse_function_type)rs   Útypenoder6   r’   r“   rº   r”   ÚlengthZitemtypeZ	itemqualsr�   rŸ   ÚprefixesZnewnamesÚprefixr#   ÚidentZtp0Zquals0r   r   r   r¤   U  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   r6   ú?r   r�   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)rs   r   r   ú
<listcomp>Ó  s   z/Parser._parse_function_type.<locals>.<listcomp>r”   r	   rÙ   rØ   Z	__stdcallr•   r•   r•   éýÿÿÿ)rS   Úgetattrr¨   rU   rÇ   r   r   rš   r�   r
   r›   r¢   rž   rŸ   Úpopr   rË   r¤   r”   rÂ   Útuple)rs   rí   ÚfuncnamerÒ   r#   ÚargZellipsisr¨   Úresultr”   Úabir   )rs   r   rì   ¾  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Ü   )rs   r�   r”   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¿   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   FT)r’   z#%s: using both bitfields and '...;'r‹   r   )NNr•   r•   )*rn   ÚKeyErrorr6   rk   ri   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   ro   r‹   Ú	completedrq   )rs   Úkindr�   r6   rç   Z
force_nameÚexplicit_namerº   rª   Ú_r  r  r	  r
  r7   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  )rs   rº   rç   r   r   r   r  _  s
    zParser._make_partialc             C   sø  t |tjjƒ�r,|j}d|d   ko,dkn  rÌ|jdƒ}y"|jdƒrRt|dƒS t|dƒS W n\ tk
rº   t	|ƒdkr¶|j
ƒ dd… d	kr˜t|d
ƒS |j
ƒ dd… dkr¶t|dƒ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ƒ�rT|jdk�rT| 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ƒ�rä|jdk�rä|�rÔd| _dS td|jj ƒ‚t |tjjƒ�rä| j|jƒ}| j|jƒ}|jdk�r || S |jdk�r4|| S |jdk�rH|| S |jdk�r`| j||ƒS |jdk�r€|| j||ƒ|  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uUlLru   r„   r   rÑ   r°   é   Ú0bzinvalid constant %rú'r	   é   ú\ú+r®   Z__dotdotdotarray__Tz...zT:%d: unsupported '[...]' here, cannot derive the actual array length in this contextr   ú/ú%z<<z>>ú&ú|ú^z?:%d: unsupported expression: expected a simple numeric constantr•   éþÿÿÿ)rš   r
   r›   ÚConstantr·   r²   r   rA   r�   r   r±   r   ÚordrÈ   rÉ   rè   rÊ   rÓ   r6   rp   r  r   rë   r4   ZBinaryOpÚleftÚrightÚ_c_div)rs   rÔ   r’   rB   r  r  r   r   r   rè   f  sx    



*zParser._parse_constantc             C   s0   || }|dk |dk A r,|| dkr,|d7 }|S )Nr   r   r   )rs   ÚaÚbrü   r   r   r   r   ¯  s    zParser._c_divc       	      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   r6   r·   rè   r   r¬   rù   r   ZEnumTyper  )	rs   r  r  r  r#  Z
enumvaluesZnextenumvaluer¿   rº   r   r   r   r   µ  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_$rD   r   r   r½   r¾   r¿   Ú	anonymousr`   T)r×   r”   )r½   r¾   r¿   r%  r`   )ri   rµ   r   rÕ   r¥   rp   r¬   )rs   Úotherr6   rº   r”   r  ÚkÚvr   r   r   ÚincludeÍ  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 )Nr�   Z__dotdotdotint__z'typedef int... %s'Z__dotdotdotfloat__z'typedef float... %s'z*:%d: unsupported usage of "..." in typedef)r�   rŸ   r   Zunknown_typer6   rr   ZUnknownIntegerTypeZUnknownFloatTyper   rë   r4   )rs   r7   r~   r   r   r   r    ×  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 )Nr�   z*:%d: unsupported usage of "..." in typedef)r�   rŸ   r   Zunknown_ptr_typer6   r   rë   r4   )rs   r7   r   r   r   r£   ê  s    zParser._get_unknown_ptr_type)FFNF)Fr   )N)NFN)N)NF)F)r§   Ú
__module__Ú__qualname__rt   rƒ   r‰   r|   rz   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   rh   '  s:   
&
 
73

	 
h
#
v
I
rh   )r	   )4r   r   Zcommontypesr   r   Úerrorr   r   r   r
   ÚImportErrorrl   r†   ÚsysÚversion_infoÚthreadÚ_threadÚallocate_lockrx   r   rw   ÚcompileÚDOTALLÚ	MULTILINErI   rJ   r<   rT   r$  rR   rc   r   Ú
IGNORECASEr¶   rP   rO   rQ   r*   r   rW   rX   r   r%   r-   r5   r8   r>   rC   r^   rg   Úobjectrh   r   r   r   r   Ú<module>   sZ   












*2	B(