o
    w¨Êh<  ã                   @   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„ 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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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ 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„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9d}dodp„Z:dqdr„ Z;g dsfdtdu„Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d|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.
    c                 C   s
   d| _ d S )Né    ©Úindent_level©Úself© r	   úG/var/www/html/env/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_ArrayRef1   ó   zCGenerator.visit_ArrayRefc                 C   s"   |   |j¡}||j |  |j¡ S r   )r0   r(   Útyper   Úfield)r   r$   Úsrefr	   r	   r
   Úvisit_StructRef5   s   zCGenerator.visit_StructRefc                 C   r-   )Nú(ú))r0   r(   r   Úargs)r   r$   Úfrefr	   r	   r
   Úvisit_FuncCall9   r4   zCGenerator.visit_FuncCallc                 C   sX   |   |j¡}|jdkrd| S |jdkrd| S |jdkr%d|  |j¡ S d|j|f S )Nzp++z%s++zp--z%s--Úsizeofz
sizeof(%s)z%s%s)r0   ÚexprÚopr   )r   r$   Úoperandr	   r	   r
   Úvisit_UnaryOp=   s   


zCGenerator.visit_UnaryOpc                    s<   ˆ   |j‡ fdd„¡}ˆ   |j‡ fdd„¡}d||j|f S )Nc                    ó   ˆ   | ¡ S r   ©Ú_is_simple_node©Údr   r	   r
   Ú<lambda>L   ó    z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    rC   r   rD   rF   r   r	   r
   rH   N   rI   ú%s %s %s)Ú_parenthesize_ifÚleftÚrightr@   )r   r$   Úlval_strÚrval_strr	   r   r
   Úvisit_BinaryOpJ   s   
ÿ
ÿzCGenerator.visit_BinaryOpc                 C   s*   |   |jdd„ ¡}d|  |j¡|j|f S )Nc                 S   s   t | tjƒS r   )Ú
isinstancer   Ú
Assignment)r$   r	   r	   r
   rH   T   rI   z-CGenerator.visit_Assignment.<locals>.<lambda>rJ   )rK   Úrvaluer   Úlvaluer@   )r   r$   rO   r	   r	   r
   Úvisit_AssignmentQ   s
   þzCGenerator.visit_Assignmentc                 C   s   d  |j¡S r   )r   Únamesr#   r	   r	   r
   Úvisit_IdentifierTypeW   ó   zCGenerator.visit_IdentifierTypec                 C   sF   t |tjƒrd|  |¡ d S t |tjƒrd|  |¡ d S |  |¡S )NÚ{Ú}r9   r:   )rQ   r   ÚInitListr   ÚExprListr#   r	   r	   r
   Ú_visit_exprZ   s
   
zCGenerator._visit_exprFc                 C   sL   |r|j n|  |¡}|jr|d|  |j¡ 7 }|jr$|d|  |j¡ 7 }|S )Nz : ú = )r(   Ú_generate_declÚbitsizer   Úinitr]   )r   r$   Úno_typeÚsr	   r	   r
   Ú
visit_Declb   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)rb   N)rd   ©r   Údeclr   r	   r
   r   o   s   € ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   ©r   r$   rc   r	   r   r
   Úvisit_DeclListl   s   ÿzCGenerator.visit_DeclListc                 C   s2   d}|j r|d |j ¡d 7 }||  |j¡7 }|S )Nr   r   )Ústorager   Ú_generate_typer5   rj   r	   r	   r
   Úvisit_Typedefs   s   zCGenerator.visit_Typedefc                 C   s,   d| j |jdd� d }|d |  |j¡ S )Nr9   F©Úemit_declnamer:   r   )rm   Úto_typer0   r?   rj   r	   r	   r
   Ú
visit_Casty   s   zCGenerator.visit_Castc                 C   ó*   g }|j D ]
}| |  |¡¡ qd |¡S ©Nre   ©ÚexprsÚappendr]   r   ©r   r$   Úvisited_subexprsr?   r	   r	   r
   Úvisit_ExprList}   ó   

zCGenerator.visit_ExprListc                 C   rs   rt   ru   rx   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   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"   Úformatr   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   rg   r   ÚbodyÚparam_declsr   )r   r$   rg   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†   )ÚextrQ   r   ÚFuncDefr   ÚPragma)r   r$   rc   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ú{
é   r   c                 3   r‡   r   ©Ú_generate_stmt)r   Ústmtr   r	   r
   r   ²   r‰   z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Úblock_itemsr   rj   r	   r   r
   Úvisit_Compound®   s   zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr9   z){rZ   )r   r5   ra   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 )Nre   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   rj   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:   )r]   ÚcondÚiftrueÚiffalserj   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   rj   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«   )ra   r   r¦   Únextr–   r—   rj   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—   rj   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   rj   r	   r	   r
   Úvisit_DoWhileî   s   zCGenerator.visit_DoWhilec                 C   s,   d|   |j¡ d }|| j|jdd�7 }|S )Nzswitch (rª   Tr«   )r   r¦   r–   r—   rj   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$   rc   r—   r	   r	   r
   Ú
visit_Caseû   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_Default  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_Goto
  r‚   zCGenerator.visit_Gotoc                 C   r›   )Nz...r	   r#   r	   r	   r
   Úvisit_EllipsisParam  rž   zCGenerator.visit_EllipsisParamc                 C   ó   |   |d¡S )NÚstructr   r#   r	   r	   r
   Úvisit_Struct  rX   zCGenerator.visit_Structc                 C   s   |   |j¡S r   )rm   r5   r#   r	   r	   r
   Úvisit_Typename  rX   zCGenerator.visit_Typenamec                 C   r¼   )NÚunionr   r#   r	   r	   r
   Úvisit_Union  rX   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/   r^   )r(   rQ   r   ÚIDr   r]   r?   )r   r$   rc   r(   r	   r	   r
   Úvisit_NamedInitializer  s   
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   ©rm   r#   r	   r	   r
   Úvisit_FuncDecl#  r   zCGenerator.visit_FuncDeclc                 C   r}   ©NFro   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_PtrDecl,  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Š   r”   r“   rZ   )rh   Ú_generate_struct_union_bodyÚvaluesÚenumeratorsÚ_generate_enum_bodyr(   r   r   )r   r$   r(   ÚmembersÚbody_functionrc   r	   r	   r
   r€   /  s    z&CGenerator._generate_struct_union_enumc                    s   d  ‡ fdd„|D ƒ¡S )Nr   c                 3   r‡   r   r•   rf   r   r	   r
   r   H  r‰   z9CGenerator._generate_struct_union_body.<locals>.<genexpr>©r   ©r   rÏ   r	   r   r
   rË   G  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   L  r‰   z1CGenerator._generate_enum_body.<locals>.<genexpr>éþÿÿÿrŠ   rÑ   rÒ   r	   r   r
   rÎ   J  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 ||  |¡ 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.
        r”   r†   rŠ   )r5   r   r   r   ÚDeclrR   ÚCastÚUnaryOpÚBinaryOpÚ	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantrÃ   ÚTypedefr\   r   ÚCompound)r   r$   r¬   Útyprƒ   r	   r	   r
   r–   N  s   ü
zCGenerator._generate_stmtc                 C   sH   d}|j rd |j ¡d }|jr|d |j¡d 7 }||  |j¡7 }|S )z& Generation from a Decl node.
        r   r   )Úfuncspecr   rl   rm   r5   rj   r	   r	   r
   r_   j  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%sÚ*ro   )r5   r   ÚTypeDeclÚqualsr   r   ÚdeclnameÚ	enumeraterQ   Ú	ArrayDeclÚPtrDeclÚ	dim_qualsÚdimÚFuncDeclr;   rÔ   r_   ÚTypenamerm   ÚIdentifierTyperV   )	r   r$   Ú	modifiersrp   rß   rc   ÚnstrÚiÚmodifierr	   r	   r
   rm   s  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:   )r]   )r   r$   Ú	conditionrc   r	   r	   r
   rK   ¨  s   
zCGenerator._parenthesize_ifc                    s   ˆ   |‡ fdd„¡S )z. Common use case for _parenthesize_if
        c                    rC   r   rD   rF   r   r	   r
   rH   µ  rI   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rK   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.
        )rQ   r   rÜ   rÃ   rÚ   rÛ   rÙ   r#   r	   r	   r
   rE   ·  s   ÿzCGenerator._is_simple_nodeN)F)@r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r%   r)   r,   r3   r8   r=   rB   rP   rU   rW   r]   rd   rk   rn   rr   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_   rm   rK   r0   rE   r	   r	   r	   r
   r      s|    


	


	5
r   N)r   r   Úobjectr   r	   r	   r	   r
   Ú<module>   s   