U
    ú¸^L9  ã                   @   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dvd!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„ Z6dwdidj„Z7dkdl„ Z8g fdmdn„Z9dodp„ Z:dqdr„ Z;dsdt„ Z<duS )xÚ
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	   ú</tmp/pip-install-v5gamh74/pycparser/pycparser/c_generator.pyÚ__init__   s    zCGenerator.__init__c                 C   s
   d| j  S ©Nú r   r   r	   r	   r
   Ú_make_indent   s    zCGenerator._make_indentc                 C   s   d|j j }t| || jƒ|ƒS )NZvisit_)Ú	__class__Ú__name__ÚgetattrÚgeneric_visit)r   ÚnodeÚmethodr	   r	   r
   Úvisit   s    zCGenerator.visitc                    s,   |d krdS d  ‡ fdd„| ¡ D ƒ¡S d S )NÚ c                 3   s   | ]\}}ˆ   |¡V  qd S ©N©r   )Ú.0Z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   s   |j S r   )Úvalue©r   Únr	   r	   r
   Úvisit_Constant%   s    zCGenerator.visit_Constantc                 C   s   |j S r   ©Únamer   r	   r	   r
   Úvisit_ID(   s    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   s$   |   |j¡}|d |  |j¡ d S )Nú[ú])Ú_parenthesize_unless_simpler#   r   Z	subscript)r   r    Zarrrefr	   r	   r
   Úvisit_ArrayRef1   s    zCGenerator.visit_ArrayRefc                 C   s"   |   |j¡}||j |  |j¡ S r   )r*   r#   Útyper   Úfield)r   r    Zsrefr	   r	   r
   Úvisit_StructRef5   s    zCGenerator.visit_StructRefc                 C   s$   |   |j¡}|d |  |j¡ d S )Nú(ú))r*   r#   r   Úargs)r   r    Zfrefr	   r	   r
   Úvisit_FuncCall9   s    zCGenerator.visit_FuncCallc                 C   s\   |   |j¡}|jdkrd| S |jdkr0d| S |jdkrJd|  |j¡ S d|j|f S d S )Nzp++z%s++zp--z%s--Úsizeofz
sizeof(%s)z%s%s)r*   ÚexprÚopr   )r   r    Z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   ˆ   | ¡ S r   ©Ú_is_simple_node©Údr   r	   r
   Ú<lambda>L   ó    z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    s   ˆ   | ¡ S r   r7   r9   r   r	   r
   r;   N   r<   ú%s %s %s)Ú_parenthesize_ifÚleftÚrightr5   )r   r    Z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
   r;   T   r<   z-CGenerator.visit_Assignment.<locals>.<lambda>r=   )r>   Zrvaluer   Zlvaluer5   )r   r    rA   r	   r	   r
   Úvisit_AssignmentQ   s
    þzCGenerator.visit_Assignmentc                 C   s   d  |j¡S r   )r   Únamesr   r	   r	   r
   Úvisit_IdentifierTypeW   s    zCGenerator.visit_IdentifierTypec                 C   sJ   t |tjƒrd|  |¡ d S t |tjƒr<d|  |¡ d S |  |¡S d S )NÚ{Ú}r/   r0   )rC   r   ZInitListr   ÚExprListr   r	   r	   r
   Ú_visit_exprZ   s
    zCGenerator._visit_exprFc                 C   sL   |r
|j n|  |¡}|jr.|d|  |j¡ 7 }|jrH|d|  |j¡ 7 }|S )Nz : ú = )r#   Ú_generate_declZbitsizer   ÚinitrK   )r   r    Úno_typeÚsr	   r	   r
   Ú
visit_Declb   s     zCGenerator.visit_Declc                    sL   ˆ   |jd ¡}t|jƒdkrH|dd ‡ fdd„|jdd … D ƒ¡ 7 }|S )Nr   r   ú, c                 3   s   | ]}ˆ j |d dV  qdS )T)rO   N)rQ   ©r   Údeclr   r	   r
   r   o   s   ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   ©r   r    rP   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_typer,   rW   r	   r	   r
   Úvisit_Typedefs   s
     zCGenerator.visit_Typedefc                 C   s(   d|   |j¡ d }|d |  |j¡ S )Nr/   r0   r   )rZ   Zto_typer*   r4   rW   r	   r	   r
   Ú
visit_Casty   s    zCGenerator.visit_Castc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S ©NrR   ©ÚexprsÚappendrK   r   ©r   r    Zvisited_subexprsr4   r	   r	   r
   Úvisit_ExprList}   s    
zCGenerator.visit_ExprListc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S r]   r^   ra   r	   r	   r
   Úvisit_InitListƒ   s    
zCGenerator.visit_InitListc                 C   s   | j |ddS )NÚenumr"   ©Ú_generate_struct_union_enumr   r	   r	   r
   Ú
visit_Enum‰   s    zCGenerator.visit_Enumc                 C   s<   |j sdj|  ¡ |jdS dj|  ¡ |j|  |j ¡dS d S )Nz{indent}{name},
)Úindentr#   z{indent}{name} = {value},
)rh   r#   r   )r   Úformatr   r#   r   r   r	   r	   r
   Úvisit_EnumeratorŒ   s    þ
ýzCGenerator.visit_Enumeratorc                    sj   ˆ   |j¡}dˆ _ˆ   |j¡}|jrVd ‡ fdd„|jD ƒ¡}|d | d | d S |d | d S d S )Nr   ú;
c                 3   s   | ]}ˆ   |¡V  qd S r   r   )r   Úpr   r	   r
   r   ž   s     z+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)r   rT   r   ÚbodyZparam_declsr   )r   r    rT   rn   Zknrdeclsr	   r   r
   Úvisit_FuncDef™   s    zCGenerator.visit_FuncDefc                 C   sb   d}|j D ]R}t|tjƒr*||  |¡7 }q
t|tjƒrJ||  |¡d 7 }q
||  |¡d 7 }q
|S )Nr   rm   rk   )ÚextrC   r   ZFuncDefr   ZPragma)r   r    rP   rp   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   s   | ]}ˆ   |¡V  qd S r   ©Ú_generate_stmt)r   Ústmtr   r	   r
   r   ²   s     z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Zblock_itemsr   rW   r	   r   r
   Úvisit_Compound®   s    zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr/   z){rI   )r   r,   rN   r   r	   r	   r
   Úvisit_CompoundLiteral·   s    z CGenerator.visit_CompoundLiteralc                 C   s   dS )Nú;r	   r   r	   r	   r
   Úvisit_EmptyStatement»   s    zCGenerator.visit_EmptyStatementc                    s   d  ‡ fdd„|jD ƒ¡S )NrR   c                 3   s   | ]}ˆ   |¡V  qd S r   r   )r   Úparamr   r	   r
   r   ¿   s     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   ry   )r4   r   rW   r	   r	   r
   Úvisit_ReturnÁ   s     zCGenerator.visit_Returnc                 C   s   dS )Nzbreak;r	   r   r	   r	   r
   Úvisit_BreakÆ   s    zCGenerator.visit_Breakc                 C   s   dS )Nz	continue;r	   r   r	   r	   r
   Úvisit_ContinueÉ   s    zCGenerator.visit_Continuec                 C   sH   d|   |j¡ d }|d|   |j¡ d 7 }|d|   |j¡ d 7 }|S )Nr/   z) ? z) : r0   )rK   ÚcondÚiftrueÚiffalserW   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r`||  ¡ d 7 }|| j|jdd7 }|S )Nzif (ú)
T©Ú
add_indentzelse
)r‚   r   ru   rƒ   r„   r   rW   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 (ry   r   r†   Tr‡   )rN   r   r‚   Únextru   rv   rW   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   ru   rv   rW   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);)ru   rv   r   r‚   r   rW   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‚   ru   rv   rW   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   r4   Ústmtsru   ©r   r    rP   rv   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‘   ru   r’   r	   r	   r
   Úvisit_Default  s    
zCGenerator.visit_Defaultc                 C   s   |j d |  |j¡ S )Nr   )r#   ru   rv   r   r	   r	   r
   Úvisit_Label  s    zCGenerator.visit_Labelc                 C   s   d|j  d S )Nzgoto ry   r"   r   r	   r	   r
   Ú
visit_Goto
  s    zCGenerator.visit_Gotoc                 C   s   dS )Nz...r	   r   r	   r	   r
   Úvisit_EllipsisParam  s    zCGenerator.visit_EllipsisParamc                 C   s   |   |d¡S )NÚstructre   r   r	   r	   r
   Úvisit_Struct  s    zCGenerator.visit_Structc                 C   s   |   |j¡S r   )rZ   r,   r   r	   r	   r
   Úvisit_Typename  s    zCGenerator.visit_Typenamec                 C   s   |   |d¡S )NÚunionre   r   r	   r	   r
   Úvisit_Union  s    zCGenerator.visit_Unionc                 C   sZ   d}|j D ]6}t|tjƒr*|d|j  7 }q
|d|  |¡ d 7 }q
|d|  |j¡ 7 }|S )Nr   Ú.r(   r)   rL   )r#   rC   r   ÚIDr   rK   r4   )r   r    rP   r#   r	   r	   r
   Úvisit_NamedInitializer  s    
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   )rZ   r   r	   r	   r
   Úvisit_FuncDecl#  s    zCGenerator.visit_FuncDeclc                 C   s°   |dkr|j }| j}n(|dks"t‚|jdkr0dn|jj}| j}|d |jpLd }|dk	r¬|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›   rd   Nr   r   rm   rs   rr   rI   )	rU   Ú_generate_struct_union_bodyÚAssertionErrorÚvaluesZenumeratorsÚ_generate_enum_bodyr#   r   r   )r   r    r#   ÚmembersZbody_functionrP   r	   r	   r
   rf   &  s     z&CGenerator._generate_struct_union_enumc                    s   d  ‡ fdd„|D ƒ¡S )Nr   c                 3   s   | ]}ˆ   |¡V  qd S r   rt   rS   r   r	   r
   r   ?  s     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   s   | ]}ˆ   |¡V  qd S r   r   )r   r   r   r	   r
   r   C  s     z1CGenerator._generate_enum_body.<locals>.<genexpr>éþÿÿÿrm   r¦   r§   r	   r   r
   r¤   A  s    zCGenerator._generate_enum_bodyc                 C   s®   t |ƒ}|r|  jd7  _|  ¡ }|r4|  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kr‚||  |¡ d S |tjfkr˜|  |¡S ||  |¡ d 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.
        rs   rk   rm   N)r,   r   r   r   ÚDeclrD   ZCastZUnaryOpZBinaryOpZ	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantrž   ZTypedefrJ   r   ZCompound)r   r    rˆ   Útyprh   r	   r	   r
   ru   E  s2               ü
zCGenerator._generate_stmtc                 C   sH   d}|j rd |j ¡d }|jr4|d |j¡d 7 }||  |j¡7 }|S )z& Generation from a Decl node.
        r   r   )Zfuncspecr   rY   rZ   r,   rW   r	   r	   r
   rM   a  s      zCGenerator._generate_declc                 C   sÌ  t |ƒ}|tjkrHd}|jr2|d |j¡d 7 }||  |j ¡7 }|jrN|jnd}t|ƒD ]Ö\}}t|tj	ƒr°|dkr–t||d  tj
ƒr–d| d }|d|  |j¡ d 7 }qZt|tjƒrþ|dkrät||d  tj
ƒräd| d }|d|  |j¡ d 7 }qZt|tj
ƒrZ|jr(d	d |j¡|f }qZd
| }qZ|rD|d| 7 }|S |tjkr`|  |j ¡S |tjkrx|  |j ¡S |tjkr”d |j¡d S |tj	tj
tjfkr¾|  |j ||g ¡S |  |¡S d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   r/   r0   r(   r)   z* %s %sÚ*N)r,   r   ZTypeDeclZqualsr   r   ZdeclnameÚ	enumeraterC   Z	ArrayDeclZPtrDeclZdimZFuncDeclr1   r©   rM   ZTypenamerZ   ZIdentifierTyperF   )r   r    Ú	modifiersr®   rP   ZnstrÚiÚmodifierr	   r	   r
   rZ   j  s@     
 zCGenerator._generate_typec                 C   s&   |   |¡}||ƒrd| d S |S dS )z‘ Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r/   r0   N)rK   )r   r    Ú	conditionrP   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   r7   r9   r   r	   r
   r;   ¥  r<   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)r>   r   r	   r   r
   r*   ¢  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.
        )rC   r   r­   rž   r«   r¬   rª   r   r	   r	   r
   r8   §  s     ÿzCGenerator._is_simple_nodeN)F)F)=r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r!   r$   r'   r+   r.   r2   r6   rB   rE   rG   rK   rQ   rX   r[   r\   rb   rc   rg   rj   ro   rq   rw   rx   rz   r}   r   r€   r   r…   r‰   r‹   r   rŽ   r   r“   r”   r•   r–   r—   r™   rš   rœ   rŸ   r    rf   r¡   r¤   ru   rM   rZ   r>   r*   r8   r	   r	   r	   r
   r      st   


	


	.
r   N)r   r   Úobjectr   r	   r	   r	   r
   Ú<module>	   s   