o
    
cǬ                     @   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-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   )pycparser.yacctabpycparser.lextab)	pycparser r   9/opt/certbot/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   zString 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sJ d| d |	 || |
d d  f } qh| |	|	d  dksJ 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   s<  t |\}}t|}g }t| jD ]}|dr(|dd  }|| || q|t|7 }g }|d |D ]	}|d|  q8|d |dtf  || d|}t	d urat	
  z-zt |}	W n tjjy }
 z| |
| W Y d }
~
nd }
~
ww W t	d urt	  n
t	d urt	  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"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  sD   








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_errorY  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   g  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   q  s*   zParser.parsec              
   C   s  |  |\}}}| | t|j}|D ]	}|jdkr nqJ d }zd| _|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rt|jjtjjrt|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rq(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PragmazBunexpected <%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__r    argsr   r   )r   r"   r   rc   iteratorr>   current_declr   realtyper   r   r   r   r   r     sx   






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   zonly 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 | rt|drt|jd	rt|jjr| |j|jj d S | rt|jtjjr|jjd
krt|jjd	rt|jjjr| |jd
|jjj  d S |tju r|jdr|j| _d S | jdkrt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     sl   





zParser._parse_declc                 C   s   |  |d S r
   )parse_type_and_quals)r   cdeclr   r   r   
parse_type'  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   *  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   2  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_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 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   L  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|sg }dD ]}t||dD ]}|| qq|sd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   U  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rd}
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rtd| |js|| |jrd|jv r| d|j | || j |< |dkr|S |jd u r|S |jd urt	d| g }
g }g }g }|jD ]h}t|jtjjrd|jjd	kr| || q|jd u rd}n| |j}d| _| j|jdd\}}| jr| || t|tjr&|jr&| || |
 |jp-d | | | | | | qt!|
|_t!||_"t!||_#t!||_$|dgt%| krot|tjro|jrotd|f | j&d|_'|j(rd|_(| 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  _  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rt	|dkst	|dkr|d dkrt|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|rd| _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  f  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@    
&

73

	

i#
v
I
ry   )4r   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   objectry   r   r   r   r   <module>   sf    













*2	B(