o
    "“i~E  ã                   @   s    d dl mZ G dd„ deƒZdS )é   )Úc_astc                   @   s~  e Zd Z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„ Zdd„ Zi dd“dd“dd“dd “d!d"“d#d$“d%d$“d&d'“d(d'“d)d'“d*d'“d+d,“d-d,“d.d/“d0d/“d1d2“d3d2“d4d2i¥Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd�d=d>„Zd?d@„ ZdAdB„ ZdCdD„ ZdEdF„ ZdGdH„ ZdIdJ„ ZdKdL„ ZdMdN„ ZdOdP„ ZdQdR„ ZdSdT„ ZdUdV„ Z dWdX„ Z!dYdZ„ Z"d[d\„ Z#d]d^„ Z$d_d`„ Z%dadb„ Z&dcdd„ Z'dedf„ Z(dgdh„ Z)didj„ Z*dkdl„ Z+dmdn„ Z,dodp„ Z-dqdr„ Z.dsdt„ Z/dudv„ Z0dwdx„ Z1dydz„ Z2d{d|„ Z3d}d~„ Z4dd€„ Z5d�d‚„ Z6dƒd„„ Z7d…d†„ Z8d‡dˆ„ Z9d‰dŠ„ Z:d‹dŒ„ Z;d�dŽ„ Z<d�d�d�„Z=d‘d’„ Z>g d“fd”d•„Z?d–d—„ Z@d˜d™„ ZAdšd›„ ZBdœS )žÚ
CGeneratorz¬ Uses the same visitor pattern as c_ast.NodeVisitor, but modified to
        return a value from each visit method, using string accumulation in
        generic_visit.
    Fc                 C   s   d| _ || _dS )z“ Constructs C-code generator

            reduce_parentheses:
                if True, eliminates needless parentheses on binary operators
        é    N)Úindent_levelÚreduce_parentheses)Úselfr   © r   úU/var/www/html/premium_crap/venv/lib/python3.10/site-packages/pycparser/c_generator.pyÚ__init__   s   
zCGenerator.__init__c                 C   s
   d| j  S ©Nú )r   ©r   r   r   r	   Ú_make_indent   ó   
zCGenerator._make_indentc                 C   s   d|j j }t| || jƒ|ƒS )NÚvisit_)Ú	__class__Ú__name__ÚgetattrÚgeneric_visit)r   ÚnodeÚmethodr   r   r	   Úvisit   s   zCGenerator.visitc                    s(   |d u rdS d  ‡ fdd„| ¡ D ƒ¡S )NÚ c                 3   s   � | ]
\}}ˆ   |¡V  qd S ©N©r   )Ú.0Úc_nameÚcr   r   r	   Ú	<genexpr>'   s   € z+CGenerator.generic_visit.<locals>.<genexpr>)ÚjoinÚchildren)r   r   r   r   r	   r   #   s   zCGenerator.generic_visitc                 C   ó   |j S r   )Úvalue©r   Únr   r   r	   Úvisit_Constant)   ó   zCGenerator.visit_Constantc                 C   r!   r   ©Únamer#   r   r   r	   Úvisit_ID,   r&   zCGenerator.visit_IDc                 C   s   d}|j r|d|j  7 }|S )Nz#pragmar   )Ústring)r   r$   Úretr   r   r	   Úvisit_Pragma/   s   zCGenerator.visit_Pragmac                 C   ó$   |   |j¡}|d |  |j¡ d S )Nú[ú])Ú_parenthesize_unless_simpler(   r   Ú	subscript)r   r$   Úarrrefr   r   r	   Úvisit_ArrayRef5   ó   zCGenerator.visit_ArrayRefc                 C   s"   |   |j¡}||j |  |j¡ S r   )r0   r(   Útyper   Úfield)r   r$   Úsrefr   r   r	   Úvisit_StructRef9   s   zCGenerator.visit_StructRefc                 C   r-   )Nú(ú))r0   r(   r   Úargs)r   r$   Úfrefr   r   r	   Úvisit_FuncCall=   r4   zCGenerator.visit_FuncCallc                 C   sX   |j dkrd|  |j¡ S |  |j¡}|j dkrd| S |j dkr%d| S d|j |f S )NÚsizeofz
sizeof(%s)zp++z%s++zp--z%s--z%s%s)Úopr   Úexprr0   )r   r$   Úoperandr   r   r	   Úvisit_UnaryOpA   s   


zCGenerator.visit_UnaryOpz||r   z&&r   ú|é   ú^é   ú&é   z==é   z!=ú>é   z>=ú<z<=z>>é   z<<ú+é   ú-Ú*é	   ú/ú%c                    s@   ˆ  ˆ j‡ ‡fdd„¡}ˆ  ˆ j‡ ‡fdd„¡}d|ˆ j|f S )Nc                    s6   ˆ  | ¡pˆjot| tjƒoˆj| j ˆjˆ j k S r   ©Ú_is_simple_noder   Ú
isinstancer   ÚBinaryOpÚprecedence_mapr?   ©Úd©r$   r   r   r	   Ú<lambda>k   ó   
 þz+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    s6   ˆ  | ¡pˆjot| tjƒoˆj| j ˆjˆ j k S r   rU   rZ   r\   r   r	   r]   w   r^   ú%s %s %s)Ú_parenthesize_ifÚleftÚrightr?   )r   r$   Úlval_strÚrval_strr   r\   r	   Úvisit_BinaryOp_   s   
þþzCGenerator.visit_BinaryOpc                 C   s*   |   |jdd„ ¡}d|  |j¡|j|f S )Nc                 S   s   t | tjƒS r   )rW   r   Ú
Assignment)r$   r   r   r	   r]      ó    z-CGenerator.visit_Assignment.<locals>.<lambda>r_   )r`   Úrvaluer   Úlvaluer?   )r   r$   rd   r   r   r	   Úvisit_Assignment|   s
   þzCGenerator.visit_Assignmentc                 C   s   d  |j¡S r   )r   Únamesr#   r   r   r	   Úvisit_IdentifierType‚   ó   zCGenerator.visit_IdentifierTypec                 C   sL   t |tjƒrd|  |¡ d S t |tjtjfƒr!d|  |¡ d S |  |¡S )NÚ{Ú}r9   r:   )rW   r   ÚInitListr   ÚExprListÚCompoundr#   r   r   r	   Ú_visit_expr…   s
   
zCGenerator._visit_exprc                 C   sL   |r|j n|  |¡}|jr|d|  |j¡ 7 }|jr$|d|  |j¡ 7 }|S )Nz : ú = )r(   Ú_generate_declÚbitsizer   Úinitrs   )r   r$   Úno_typeÚsr   r   r	   Ú
visit_Decl�   s
   zCGenerator.visit_Declc                    sL   ˆ   |jd ¡}t|jƒdkr$|dd ‡ fdd„|jdd … D ƒ¡ 7 }|S )Nr   r   ú, c                 3   s   � | ]
}ˆ j |d d�V  qdS )T)rx   N)rz   ©r   Údeclr   r   r	   r   š   s   € ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   ©r   r$   ry   r   r   r	   Úvisit_DeclList—   s   ÿzCGenerator.visit_DeclListc                 C   s2   d}|j r|d |j ¡d 7 }||  |j¡7 }|S )Nr   r   )Ústorager   Ú_generate_typer5   r€   r   r   r	   Úvisit_Typedefž   s   zCGenerator.visit_Typedefc                 C   s,   d| j |jdd� d }|d |  |j¡ S )Nr9   F©Úemit_declnamer:   r   )rƒ   Úto_typer0   r@   r€   r   r   r	   Ú
visit_Cast¤   s   zCGenerator.visit_Castc                 C   ó*   g }|j D ]
}| |  |¡¡ qd |¡S ©Nr{   ©ÚexprsÚappendrs   r   ©r   r$   Úvisited_subexprsr@   r   r   r	   Úvisit_ExprList¨   ó   

zCGenerator.visit_ExprListc                 C   r‰   rŠ   r‹   rŽ   r   r   r	   Úvisit_InitList®   r‘   zCGenerator.visit_InitListc                 C   ó   | j |dd�S )NÚenumr'   ©Ú_generate_struct_union_enumr#   r   r   r	   Ú
visit_Enum´   ó   zCGenerator.visit_Enumc                 C   s   d  |  |j¡¡S )Nz_Alignas({}))Úformatr   Ú	alignmentr#   r   r   r	   Úvisit_Alignas·   s   zCGenerator.visit_Alignasc                 C   s8   |j sdj|  ¡ |jd�S dj|  ¡ |j|  |j ¡d�S )Nz{indent}{name},
)Úindentr(   z{indent}{name} = {value},
)rœ   r(   r"   )r"   r™   r   r(   r   r#   r   r   r	   Úvisit_Enumeratorº   s   þ
ýzCGenerator.visit_Enumeratorc                    sf   ˆ   |j¡}dˆ _ˆ   |j¡}|jr+d ‡ fdd„|jD ƒ¡}|d | d | d S |d | d S )Nr   ú;
c                 3   ó   � | ]}ˆ   |¡V  qd S r   r   )r   Úpr   r   r	   r   Ì   ó   € z+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)r   r}   r   ÚbodyÚparam_declsr   )r   r$   r}   r£   Úknrdeclsr   r   r	   Úvisit_FuncDefÇ   s   zCGenerator.visit_FuncDefc                 C   sb   d}|j D ])}t|tjƒr||  |¡7 }qt|tjƒr%||  |¡d 7 }q||  |¡d 7 }q|S )Nr   r¢   rž   )ÚextrW   r   ÚFuncDefr   ÚPragma)r   r$   ry   r§   r   r   r	   Úvisit_FileASTÑ   s   
zCGenerator.visit_FileASTc                    s`   ˆ   ¡ d }ˆ  jd7  _|jr|d ‡ fdd„|jD ƒ¡7 }ˆ  jd8  _|ˆ   ¡ d 7 }|S )Nú{
rD   r   c                 3   rŸ   r   ©Ú_generate_stmt)r   Ústmtr   r   r	   r   à   r¡   z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Úblock_itemsr   r€   r   r   r	   Úvisit_CompoundÜ   s   zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr9   z){ro   )r   r5   rw   r#   r   r   r	   Úvisit_CompoundLiteralå   s   $z CGenerator.visit_CompoundLiteralc                 C   ó   dS )Nú;r   r#   r   r   r	   Úvisit_EmptyStatementé   ó   zCGenerator.visit_EmptyStatementc                    s   d  ‡ fdd„|jD ƒ¡S )Nr{   c                 3   rŸ   r   r   )r   Úparamr   r   r	   r   í   r¡   z-CGenerator.visit_ParamList.<locals>.<genexpr>)r   Úparamsr#   r   r   r	   Úvisit_ParamListì   s   zCGenerator.visit_ParamListc                 C   s&   d}|j r|d|  |j ¡ 7 }|d S )NÚreturnr   r³   )r@   r   r€   r   r   r	   Úvisit_Returnï   s   zCGenerator.visit_Returnc                 C   r²   )Nzbreak;r   r#   r   r   r	   Úvisit_Breakô   rµ   zCGenerator.visit_Breakc                 C   r²   )Nz	continue;r   r#   r   r   r	   Úvisit_Continue÷   rµ   zCGenerator.visit_Continuec                 C   sH   d|   |j¡ d }|d|   |j¡ d 7 }|d|   |j¡ d 7 }|S )Nr9   z) ? z) : r:   )rs   ÚcondÚiftrueÚiffalser€   r   r   r	   Úvisit_TernaryOpú   s   zCGenerator.visit_TernaryOpc                 C   sd   d}|j r||  |j ¡7 }|d7 }|| j|jdd�7 }|jr0||  ¡ d 7 }|| j|jdd�7 }|S )Nzif (ú)
T©Ú
add_indentzelse
)r½   r   r­   r¾   r¿   r   r€   r   r   r	   Úvisit_If   s   zCGenerator.visit_Ifc                 C   s~   d}|j r||  |j ¡7 }|d7 }|jr|d|  |j¡ 7 }|d7 }|jr/|d|  |j¡ 7 }|d7 }|| j|jdd�7 }|S )Nzfor (r³   r   rÁ   TrÂ   )rw   r   r½   Únextr­   r®   r€   r   r   r	   Ú	visit_For
  s   zCGenerator.visit_Forc                 C   s:   d}|j r||  |j ¡7 }|d7 }|| j|jdd�7 }|S )Núwhile (rÁ   TrÂ   )r½   r   r­   r®   r€   r   r   r	   Úvisit_While  s
   zCGenerator.visit_Whilec                 C   sJ   d}|| j |jdd�7 }||  ¡ d 7 }|jr||  |j¡7 }|d7 }|S )Nzdo
TrÂ   rÇ   z);)r­   r®   r   r½   r   r€   r   r   r	   Úvisit_DoWhile  s   zCGenerator.visit_DoWhilec                 C   s>   d}||   |j¡7 }|jr|d7 }||   |j¡7 }|d7 }|S )Nz_Static_assert(ú,r:   )r   r½   Úmessager€   r   r   r	   Úvisit_StaticAssert$  s   zCGenerator.visit_StaticAssertc                 C   s,   d|   |j¡ d }|| j|jdd�7 }|S )Nzswitch (rÁ   TrÂ   )r   r½   r­   r®   r€   r   r   r	   Úvisit_Switch-  s   zCGenerator.visit_Switchc                 C   s6   d|   |j¡ d }|jD ]}|| j|dd�7 }q|S )Nzcase ú:
TrÂ   )r   r@   Ústmtsr­   ©r   r$   ry   r®   r   r   r	   Ú
visit_Case2  s   
zCGenerator.visit_Casec                 C   s&   d}|j D ]}|| j|dd�7 }q|S )Nz	default:
TrÂ   )rÏ   r­   rÐ   r   r   r	   Úvisit_Default8  s   
zCGenerator.visit_Defaultc                 C   s   |j d |  |j¡ S )NrÎ   )r(   r­   r®   r#   r   r   r	   Úvisit_Label>  s   zCGenerator.visit_Labelc                 C   s   d|j  d S )Nzgoto r³   r'   r#   r   r   r	   Ú
visit_GotoA  r˜   zCGenerator.visit_Gotoc                 C   r²   )Nz...r   r#   r   r   r	   Úvisit_EllipsisParamD  rµ   zCGenerator.visit_EllipsisParamc                 C   ó   |   |d¡S )NÚstructr•   r#   r   r   r	   Úvisit_StructG  rm   zCGenerator.visit_Structc                 C   s   |   |j¡S r   )rƒ   r5   r#   r   r   r	   Úvisit_TypenameJ  rm   zCGenerator.visit_Typenamec                 C   rÖ   )NÚunionr•   r#   r   r   r	   Úvisit_UnionM  rm   zCGenerator.visit_Unionc                 C   sZ   d}|j D ]}t|tjƒr|d|j  7 }q|d|  |¡ d 7 }q|d|  |j¡ 7 }|S )Nr   Ú.r.   r/   rt   )r(   rW   r   ÚIDr   rs   r@   )r   r$   ry   r(   r   r   r	   Úvisit_NamedInitializerP  s   
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   ©rƒ   r#   r   r   r	   Úvisit_FuncDeclZ  r   zCGenerator.visit_FuncDeclc                 C   r“   ©NFr…   rß   r#   r   r   r	   Úvisit_ArrayDecl]  r˜   zCGenerator.visit_ArrayDeclc                 C   r“   rá   rß   r#   r   r   r	   Úvisit_TypeDecl`  r˜   zCGenerator.visit_TypeDeclc                 C   r“   rá   rß   r#   r   r   r	   Úvisit_PtrDeclc  r˜   zCGenerator.visit_PtrDeclc                 C   s°   |dv r|j }| j}n|dksJ ‚|jdu rdn|jj}| j}|d |jp&d }|durV|d7 }||  ¡ 7 }|  jd7  _|d7 }|||ƒ7 }|  jd8  _||  ¡ d	 7 }|S )
zq Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        )r×   rÚ   r”   Nr   r   r¢   rD   r«   ro   )r~   Ú_generate_struct_union_bodyÚvaluesÚenumeratorsÚ_generate_enum_bodyr(   r   r   )r   r$   r(   ÚmembersÚbody_functionry   r   r   r	   r–   f  s    z&CGenerator._generate_struct_union_enumc                    s   d  ‡ fdd„|D ƒ¡S )Nr   c                 3   rŸ   r   r¬   r|   r   r   r	   r     r¡   z9CGenerator._generate_struct_union_body.<locals>.<genexpr>©r   ©r   ré   r   r   r	   rå   ~  s   z&CGenerator._generate_struct_union_bodyc                    s$   d  ‡ fdd„|D ƒ¡d d… d S )Nr   c                 3   rŸ   r   r   )r   r"   r   r   r	   r   ƒ  r¡   z1CGenerator._generate_enum_body.<locals>.<genexpr>éþÿÿÿr¢   rë   rì   r   r   r	   rè   �  s   $zCGenerator._generate_enum_bodyc                 C   sÄ   t |ƒ}|r|  jd7  _|  ¡ }|r|  jd8  _|tjtjtjtjtjtj	tj
tjtjtjtjtjtjfv rA||  |¡ d S |tjfv rL|  |¡S |tjfv rY||  |¡ S ||  |¡ d S )zÄ Generation from a statement node. This method exists as a wrapper
            for individual visit_* methods to handle different treatment of
            some statements in this context.
        rD   rž   r¢   )r5   r   r   r   ÚDeclrf   ÚCastÚUnaryOprX   Ú	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantrÝ   ÚTypedefrq   r   rr   ÚIf)r   r$   rÃ   Útyprœ   r   r   r	   r­   …  s    ü
zCGenerator._generate_stmtc                 C   sf   d}|j rd |j ¡d }|jr|d |j¡d 7 }|jr)||  |jd ¡d 7 }||  |j¡7 }|S )z& Generation from a Decl node.
        r   r   r   )Úfuncspecr   r‚   Úalignr   rƒ   r5   r€   r   r   r	   ru   £  s   zCGenerator._generate_declTc           	      C   sð  t |ƒ}|tjkr¸d}|jr|d |j¡d 7 }||  |j ¡7 }|jr(|r(|jnd}t|ƒD ]\}}t|tj	ƒrh|dkrLt||d  tj
ƒrLd| d }|d7 }|jr]|d |j¡d 7 }||  |j¡d 7 }q.t|tjƒr�|dkr‚t||d  tj
ƒr‚d| d }|d|  |j¡ d 7 }q.t|tj
ƒr­|jr©d	d |j¡|r¤d| ndf }q.d
| }q.|r¶|d| 7 }|S |tjkrÃ|  |j ¡S |tjkrÐ| j|j |d�S |tjkrÝd |j¡d S |tj	tj
tjfv ró| j|j ||g |d�S |  |¡S )zø Recursive generation from a type node. n is the type node.
            modifiers collects the PtrDecl, ArrayDecl and FuncDecl modifiers
            encountered on the way down to a TypeDecl, to allow proper
            generation from it.
        r   r   r   r   r9   r:   r.   r/   z* %s%srQ   r…   )r5   r   ÚTypeDeclÚqualsr   r   ÚdeclnameÚ	enumeraterW   Ú	ArrayDeclÚPtrDeclÚ	dim_qualsÚdimÚFuncDeclr;   rî   ru   ÚTypenamerƒ   ÚIdentifierTyperk   )	r   r$   Ú	modifiersr†   rø   ry   ÚnstrÚiÚmodifierr   r   r	   rƒ   ­  sT   
ÿÿÿ€


ÿ
zCGenerator._generate_typec                 C   s"   |   |¡}||ƒrd| d S |S )z‘ Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r9   r:   )rs   )r   r$   Ú	conditionry   r   r   r	   r`   â  s   
zCGenerator._parenthesize_ifc                    s   ˆ   |‡ fdd„¡S )z. Common use case for _parenthesize_if
        c                    s   ˆ   | ¡ S r   )rV   rZ   r   r   r	   r]   ï  rg   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)r`   r#   r   r   r	   r0   ì  s   z&CGenerator._parenthesize_unless_simplec                 C   s   t |tjtjtjtjtjfƒS )z~ Returns True for nodes that are "simple" - i.e. nodes that always
            have higher precedence than operators.
        )rW   r   rõ   rÝ   ró   rô   rò   r#   r   r   r	   rV   ñ  s   ÿzCGenerator._is_simple_nodeN)F)Cr   Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r%   r)   r,   r3   r8   r=   rB   rY   re   rj   rl   rs   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Ò   rÓ   rÔ   rÕ   rØ   rÙ   rÛ   rÞ   rà   râ   rã   rä   r–   rå   rè   r­   ru   rƒ   r`   r0   rV   r   r   r   r	   r      sÊ    
ýüûúùøø	÷	÷	÷	÷
ö
öõõôôô


	
	


5
r   N)r   r   Úobjectr   r   r   r   r	   Ú<module>   s   