B
    µ…†\\ž  ã               @   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 ¡ 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-G d%d&„ d&e.ƒZ/d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   ú+lib/python3.7/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 }xòt  | ¡}|sP | | d | ¡ … ¡ | d¡ d}| | ¡ ¡ | ¡ }|  d|¡rn| 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 | | ¡ 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   s0  g }xt  | ¡}|sP | ¡ d }| | d | ¡ … ¡ d| d¡krT| 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W | | ¡ 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   s4    


r-   c             C   s   d| krdd l }| d¡ 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.)ÚwarningsÚwarn)r   r/   r   r   r   Ú_warn_for_string_literal“   s    r1   c       	      C   sŠ  t  d| ¡} i }x6t | ¡D ](}| ¡ \}}| dd¡ ¡ }|||< qW t d| ¡} tjdk rft	| ƒ} t
 d| ¡} t d| ¡} t d| ¡} t| ƒ} t| ƒ t d| ¡} tt | ¡ƒ}x¬tt|ƒƒD ]œ\}}| ¡ }| | dkr"|  d	|| ¡ ¡}||ksþt‚d
| d |… || |d d … f } qÂ| ||d … d	ks<t‚d| d |… || |d d … f } qÂW t d| ¡} t d| ¡} |  d	d¡|fS )Nú z\
r   z2.14z volatile volatile const(z volatile volatile const z[__dotdotdotarray__]ú=z...z%s,__dotdotdot%d__ %sr	   z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )Ú
_r_commentÚsubÚ	_r_defineÚfinditerÚgroupsÚreplaceÚstripr
   Ú__version__r%   Ú_r_stdcall2Ú_r_stdcall1Ú_r_cdeclr-   r1   Ú_r_partial_arrayÚlistÚ_r_partial_enumÚ	enumerateÚreversedr   r+   r   ÚAssertionErrorÚ_r_int_dotdotdotÚ_r_float_dotdotdot)	r   Úmacrosr   Z	macronameZ
macrovalueZmatchesZnumberÚpZp2r   r   r   Ú_preprocess›   s:    
rI   c             C   s   t tƒ}| d¡ | d¡ | d¡ | d¡ | d¡ t ƒ }d}d}d}x®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
| |¡ |}qXW |S )Nr)   ú,r   r   ÚtypedefFr   r   Tr   )Úsetr   ÚaddÚ_r_wordsÚfindallÚdiscard)r   Zlook_for_wordsZ
words_usedZ
is_typedefZparenZprevious_wordZwordr   r   r   Ú_common_type_namesÕ   s>    










rQ   c               @   sê   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd8dd„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd9dd„Zd d!„ Zd:d"d#„Zd;d$d%„Zd<d&d'„Zd(d)„ Zd=d*d+„Zd,d-„ Zd>d.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd
S )?ÚParserc             C   s:   i | _ tƒ | _d| _t ¡ | _i | _i | _g | _	d | _
d S )Nr   )Ú_declarationsrL   Ú_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 ].}| d¡r$|dd … }| |¡ | |¡ q$W |t|ƒ7 }g }| d¡ x|D ]}| d| ¡ qvW | d¡ | dtf ¡ | |¡ d |¡}t	d k	rÊt	 
¡  zJytƒ  |¡}	W n4 tjjk
r }
 z|  |
|¡ W d d }
~
X Y nX W d t	d k	r(t	 ¡  X |	||fS )Nztypedef é   z*# 1 "<cdef automatic initialization code>"ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "%s"Ú
)rI   rQ   ÚsortedrS   r   r   rP   ÚCDEF_SOURCE_STRINGr   ÚlockÚacquirer   Úparser
   Zc_parserZ
ParseErrorÚconvert_pycparser_errorÚrelease)r]   r   rG   ZctnÚ	typenamesÚnameÚ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   rb   Úintr   Ú
splitlinesr   )r]   rm   r   ÚlineÚmsgr   Zlinenumrj   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)rv   rp   r:   r   )r]   rm   r   rt   ru   r   r   r   rf   =  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 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)Ú
ValueErrorrY   Ú_internal_parse)r]   r   rw   rx   Zpackry   Zprev_optionsr   r   r   re   G  s$    
zParser.parsec          
   C   s$  |   |¡\}}}|  |¡ t|jƒ}x |D ]}|jdkr*P q*W dsFt‚d }yBd| _x4|D ]*}|}t|tj	j
ƒr€|  |¡ q\t|tj	jƒrf|js td|ƒ‚d}t|jjtj	jƒrÖ|jjjd  d¡rÖ|  |¡}nxt|jtj	jƒr6t|jjtj	jƒr6t|jjjtj	jƒr6|jjjjd  d¡r6|  |¡}n| j|j|jdd\}}| jd	|j ||d
 q\|jjdkrvq\td|jj |ƒ‚q\W W n tk
rÒ }	 z$t|	jƒdkrÀ|	j|f |	_‚ W d d }	~	X Y nN tk
r }	 z.|  |	|¡}
|
r|	jd d|
  f|	_‚ W d d }	~	X Y nX d S )NÚ__dotdotdot__r   Ú__cffi_extern_python_stopz!typedef does not declare any nameéÿÿÿÿZ__dotdotdotT)ri   Úpartial_length_okztypedef )ÚqualsZPragmazBunexpected <%s>: this construct is valid C but not valid in cdef()r   z
    *** Err: %s)rn   Ú_process_macrosÚiterÚextri   rD   Ú_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   rv   )r]   r   rl   rG   ÚiteratorÚdeclZcurrent_declr€   Zrealtyperm   ru   r   r   r   r{   _  sX    




zParser._internal_parsec             C   s8   || j kr*| j | |krd S td|f ƒ‚|| j |< d S )Nz%multiple declarations of constant: %s)rZ   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 )	NZulú-r   Ú0Ú0xZ0or   zmacro )ÚlowerÚrstripr   rr   r˜   r   )r]   ri   Zint_strÚnegZpyvaluer   r   r   Ú_add_integer_constant  s    


zParser._add_integer_constantc             C   sh   xb|  ¡ D ]V\}}| ¡ }t |¡r2|  ||¡ q
|dkrL|  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)Úitemsr:   Ú_r_int_literalr   rŸ   r   r   )r]   rG   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 )Nry   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_pointerrY   Úgetr„   r   ri   )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ƒ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à|  
|||¡ n(| ¡ 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 ¡ nz|tjkr²|j d¡r²|j| _nV| jdkrÆtdƒ‚|tj@ rò|jsò| j d|j ||d n| j d|j ||d d S )N)ri   Ú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   ri   r   ÚRawFunctionTyperD   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]   r•   Znoder¥   r€   r   r   r   r‡   É  sP    


zParser._parse_declc             C   s   |   |¡d S )Nr   )Úparse_type_and_quals)r]   Ú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')rn   rD   rƒ   rˆ   r“   Úparamsr…   r
   r†   ÚIDr   ri   r   )r]   r¹   rl   rG   Ú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 )Nrw   zPmultiple declarations of %s (for interactive usage, try cdef(xx, override=True))r|   )rS   rY   r¤   r   ÚsplitrD   rT   rM   )r]   ri   Ú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)r]   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StructOrUnionOrEnumri   r   ÚisdigitÚ	forcenameZNamedPointerTypeÚPointerType)r]   rˆ   r€   Údeclnamer   r   r   r£      s    zParser._get_type_pointerc             C   sH  t |tjjƒrtt |jtjjƒrtt|jjƒdkrtd|jjd  | jkrt| jd|jjd   \}}||  	|¡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ƒrVt|	jƒ}
|
ddgkri }x<|
r|
d }|dkrŠ| |d¡d ||< |
d= nP qVW g }x4d	D ],}x$t| |d¡ƒD ]}| |¡ q²W qœW |
sØd
g}
|
d
gkrüd|ksød|k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ƒ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ƒr4| jd||dddfS td|jj ƒ‚d S )Nr   ztypedef r   )r   )rÊ   ÚsignedÚchar)ÚshortÚlongrË   Úunsigned)rÏ   rÍ   rÎ   rr   rÍ   rÎ   r2   Z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Š   rS   rÄ   Z	ArrayDeclZdimÚ_parse_constantr   r   Ú	ArrayTyperŒ   r£   r@   r¤   Úranger   r   r¶   r   Úcoordrt   r   r®   r¯   r°   r±   r¬   Ú_parse_function_type)r]   Útypenoderi   r   r¥   r€   ÚlengthZitemtypeZ	itemqualsrˆ   rŠ   ÚprefixesZnewnamesÚprefixr#   ZidentZtp0Zquals0r   r   r   r   )  sŒ    











zParser._get_type_and_qualsc          	      s:  t t|jdg ƒƒ}x@t|ƒD ]4\}}t|dƒstd|p8d|d t|ddƒf ƒ‚qW t|ƒdkoœt|d	 jt	j
jƒoœt|d	 jjt	j
jƒoœ|d	 jjjd
gk}|r¾| ¡  |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   ri   ú?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argdeclnode)r]   r   r   ú
<listcomp>œ  s   z/Parser._parse_function_type.<locals>.<listcomp>r€   éýÿÿÿrÃ   rÂ   Z	__stdcall)r@   Úgetattrr“   rB   r²   r   r   r…   rˆ   r
   r†   r   r‰   rŠ   Úpopr   r¶   r   r€   r­   Útuple)r]   rÖ   Úfuncnamer¼   r#   ÚargZellipsisr“   Úresultr€   Zabir   )r]   r   rÕ   ‡  s6    


zParser._parse_function_typec             C   s6   t |tjƒrt |j|¡S t |tjƒr.| ¡ S |S d S )N)r…   r   rÒ   rÉ   Úitemr­   rÆ   )r]   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 |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	r2|  ||¡ n"|dkr2|jd k	r2td| ƒ‚|jsD| |¡ |jrjd|jkrj|  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¡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ÂW 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~   FT)r   z#%s: using both bitfields and '...;'rx   r   )*rX   ÚKeyErrorri   rU   rS   r¤   r   Z
StructTypeZ	UnionTyper   Ú_build_enum_typeÚvaluesrD   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   rY   rx   Z	completedr[   )r]   Úkindrˆ   ri   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   ZStructOrUnionr   Z
has_c_namer,   rî   )r]   r¥   rÐ   r   r   r   rë   (  s
    zParser._make_partialc             C   sò  t |tjjƒrÂ|j}| d¡rF| d¡s2| d¡r<t|dƒS t|dƒS d|d   kr^dkrln n
t|d	ƒS |d d
kr´|d d
kr´t|ƒdks¨t|ƒdkr´|d dkr´t|d ƒS t	d|f ƒ‚t |tjj
ƒræ|jdkræ|  |j¡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ƒrv|jdkrv|rfd| _dS td|jj ƒ‚t |tjjƒrª|jdkrª|  |j¡|  |j¡ S t |tjjƒrÞ|jdkrÞ|  |j¡|  |j¡ S td|jj ƒ‚d S )Nrš   r›   Z0Xé   r_   Ú1r   Ú9ro   ú'r~   r	   é   r   ú\éþÿÿÿzinvalid constant %rú+r™   Z__dotdotdotarray__Tz...zT:%d: unsupported '[...]' here, cannot derive the actual array length in this contextz?:%d: unsupported expression: expected a simple numeric constant)r…   r
   r†   ZConstantr¢   r   rr   r   Úordr   r³   r´   rÑ   rµ   r½   ri   rZ   rí   r   rÔ   rt   ZBinaryOpÚleftÚright)r]   r¾   r   Úsr   r   r   rÑ   /  sL    



$


zParser._parse_constantc       	      C   s´   |d k	r¢d}g }g }d}xb|j D ]X}t |j¡r6d}q |jd k	rL|  |j¡}| |j¡ | |¡ |  |j|¡ |d7 }q W t|ƒ}t|ƒ}t	 
|||¡}||_nt	 
|dd¡}|S )NFr   Tr   r   )ÚenumeratorsÚ_r_enum_dotdotdotr   ri   r¢   rÑ   r   r˜   rá   r   ZEnumTyperî   )	r]   ró   ré   rî   r  Z
enumvaluesZnextenumvaluerª   r¥   r   r   r   rç   b  s*    

zParser._build_enum_typec             C   sz   xP|j  ¡ D ]B\}\}}| d¡r$q| dd¡d }|dkr| j||d|d qW x"|j ¡ D ]\}}|  ||¡ q^W d S )Nzanonymous $enum_$r2   r   r   )r¨   r©   rª   Z	anonymousrK   T)rÁ   r€   )rS   r    r   r¿   r   rZ   r˜   )r]   Úotherri   r¥   r€   rò   ÚkÚvr   r   r   Úincludez  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'z*:%d: unsupported usage of "..." in typedef)rˆ   rŠ   r   Zunknown_typeri   r\   ZUnknownIntegerTypeZUnknownFloatTyper   rÔ   rt   )r]   r•   rh   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|   z*:%d: unsupported usage of "..." in typedef)rˆ   rŠ   r   Zunknown_ptr_typeri   r   rÔ   rt   )r]   r•   r   r   r   rŽ   —  s    zParser._get_unknown_ptr_type)FFNF)Fr   )N)NF)N)NF)F)r’   Ú
__module__Ú__qualname__r^   rn   rv   rf   re   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   rR   ý   s6   
&
 
62

	
^
#
v
3
rR   )0r   r   Zcommontypesr   r   Úerrorr   r   r   r
   ÚImportErrorrV   rq   ÚsysÚversion_infoZthreadÚ_threadÚallocate_lockrc   r   rb   ÚcompileÚDOTALLÚ	MULTILINEr4   r6   rA   r  r?   rN   r   Ú
IGNORECASEr¡   r=   r<   r>   r*   r   rE   rF   r   r%   r-   r1   rI   rQ   ÚobjectrR   r   r   r   r   Ú<module>   sR   












*2:(