U
     ·…dlE  ã                   @   s    d dl mZ G dd„ deƒZdS )é   )Úc_astc                   @   s6  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dddddddddddd d d!d!d"d"d"d#œZd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zdd,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ Z dFdG„ Z!dHdI„ Z"dJdK„ Z#dLdM„ Z$dNdO„ Z%dPdQ„ Z&dRdS„ Z'dTdU„ Z(dVdW„ Z)dXdY„ Z*dZd[„ Z+d\d]„ Z,d^d_„ Z-d`da„ Z.dbdc„ Z/ddde„ Z0dfdg„ Z1dhdi„ Z2djdk„ Z3dldm„ Z4dndo„ Z5dpdq„ Z6drds„ Z7dtdu„ Z8dvdw„ Z9dxdy„ Z:dzd{„ 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   ú9/tmp/pip-unpacked-wheel-b9rl5t3_/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_ArrayRef5   s    zCGenerator.visit_ArrayRefc                 C   s"   |   |j¡}||j |  |j¡ S r   )r*   r#   Útyper   Úfield)r   r    Zsrefr   r   r	   Úvisit_StructRef9   s    zCGenerator.visit_StructRefc                 C   s$   |   |j¡}|d |  |j¡ d S )Nú(ú))r*   r#   r   Úargs)r   r    Zfrefr   r   r	   Úvisit_FuncCall=   s    zCGenerator.visit_FuncCallc                 C   s\   |j dkrd|  |j¡ S |  |j¡}|j dkr8d| S |j dkrJd| S d|j |f S d S )NÚsizeofz
sizeof(%s)zp++z%s++zp--z%s--z%s%s)Úopr   Úexprr*   )r   r    Zoperandr   r   r	   Úvisit_UnaryOpA   s    


zCGenerator.visit_UnaryOpr   r   é   é   é   é   é   é   é   é	   )z||z&&ú|ú^ú&z==z!=ú>z>=ú<z<=z>>z<<ú+ú-Ú*ú/ú%c                    s@   ˆ  ˆ j‡ ‡fdd„¡}ˆ  ˆ j‡ ‡fdd„¡}d|ˆ j|f S )Nc                    s6   ˆ  | ¡p2ˆjo2t| tjƒo2ˆj| j ˆjˆ j k S r   ©Ú_is_simple_noder   Ú
isinstancer   ÚBinaryOpÚprecedence_mapr4   ©Úd©r    r   r   r	   Ú<lambda>k   s   
þz+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    s6   ˆ  | ¡p2ˆjo2t| tjƒo2ˆj| j ˆjˆ j k S r   rI   rN   rP   r   r	   rQ   w   s   
þú%s %s %s)Ú_parenthesize_ifÚleftÚrightr4   )r   r    Zlval_strÚrval_strr   rP   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   )rK   r   Ú
Assignment)r    r   r   r	   rQ      ó    z-CGenerator.visit_Assignment.<locals>.<lambda>rR   )rS   Zrvaluer   Zlvaluer4   )r   r    rV   r   r   r	   Úvisit_Assignment|   s
    þzCGenerator.visit_Assignmentc                 C   s   d  |j¡S r   )r   Únamesr   r   r   r	   Úvisit_IdentifierType‚   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   )rK   r   ZInitListr   ÚExprListr   r   r   r	   Ú_visit_expr…   s
    zCGenerator._visit_exprc                 C   sL   |r
|j n|  |¡}|jr.|d|  |j¡ 7 }|jrH|d|  |j¡ 7 }|S )Nz : ú = )r#   Ú_generate_declZbitsizer   Úinitr`   )r   r    Úno_typeÚsr   r   r	   Ú
visit_Decl   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)rd   N)rf   ©r   Údeclr   r   r	   r   š   s   ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   ©r   r    re   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_typer,   rl   r   r   r	   Úvisit_Typedefž   s
     zCGenerator.visit_Typedefc                 C   s,   d| j |jdd d }|d |  |j¡ S )Nr/   F©Úemit_declnamer0   r   )ro   Zto_typer*   r5   rl   r   r   r	   Ú
visit_Cast¤   s    zCGenerator.visit_Castc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S ©Nrg   ©ÚexprsÚappendr`   r   ©r   r    Zvisited_subexprsr5   r   r   r	   Úvisit_ExprList¨   s    
zCGenerator.visit_ExprListc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S rt   ru   rx   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   d  |  |j¡¡S )Nz_Alignas({}))Úformatr   Ú	alignmentr   r   r   r	   Úvisit_Alignas·   s    zCGenerator.visit_Alignasc                 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},
)r‚   r#   r   )r   r   r   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   ri   r   ÚbodyZparam_declsr   )r   r    ri   r‡   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   r†   r„   )ÚextrK   r   ZFuncDefr   ZPragma)r   r    re   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ú{
r7   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   rl   r   r   r	   Úvisit_CompoundÜ   s    zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr/   z){r^   )r   r,   rc   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 )Nrg   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   r‘   )r5   r   rl   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   )r`   ÚcondÚiftrueÚiffalserl   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   r   r›   rœ   r   rl   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Ÿ   )rc   r   rš   Únextr   rŽ   rl   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Ž   rl   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   rl   r   r   r	   Úvisit_DoWhile  s     zCGenerator.visit_DoWhilec                 C   s>   d}||   |j¡7 }|jr2|d7 }||   |j¡7 }|d7 }|S )Nz_Static_assert(ú,r0   )r   rš   Úmessagerl   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Ž   rl   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   r5   Ústmtsr   ©r   r    re   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  s    zCGenerator.visit_Gotoc                 C   s   dS )Nz...r   r   r   r   r	   Úvisit_EllipsisParamD  s    zCGenerator.visit_EllipsisParamc                 C   s   |   |d¡S )NÚstructr|   r   r   r   r	   Úvisit_StructG  s    zCGenerator.visit_Structc                 C   s   |   |j¡S r   )ro   r,   r   r   r   r	   Úvisit_TypenameJ  s    zCGenerator.visit_Typenamec                 C   s   |   |d¡S )NÚunionr|   r   r   r   r	   Úvisit_UnionM  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)   ra   )r#   rK   r   ÚIDr   r`   r5   )r   r    re   r#   r   r   r	   Úvisit_NamedInitializerP  s    
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   ©ro   r   r   r   r	   Úvisit_FuncDeclZ  s    zCGenerator.visit_FuncDeclc                 C   s   | j |ddS ©NFrq   r»   r   r   r   r	   Úvisit_ArrayDecl]  s    zCGenerator.visit_ArrayDeclc                 C   s   | j |ddS r½   r»   r   r   r   r	   Úvisit_TypeDecl`  s    zCGenerator.visit_TypeDeclc                 C   s   | j |ddS r½   r»   r   r   r   r	   Úvisit_PtrDeclc  s    zCGenerator.visit_PtrDeclc                 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¶   r{   Nr   r   r†   r7   r‹   r^   )	rj   Ú_generate_struct_union_bodyÚAssertionErrorÚvaluesZenumeratorsÚ_generate_enum_bodyr#   r   r   )r   r    r#   ÚmembersZbody_functionre   r   r   r	   r}   f  s     z&CGenerator._generate_struct_union_enumc                    s   d  ‡ fdd„|D ƒ¡S )Nr   c                 3   s   | ]}ˆ   |¡V  qd S r   rŒ   rh   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   ƒ  s     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  _|  ¡ }|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 |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.
        r7   r„   r†   N)r,   r   r   r   ÚDeclrX   ZCastZUnaryOprL   Z	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantr¹   ZTypedefr_   r   ZCompoundZIf)r   r    r    Útypr‚   r   r   r	   r   …  s6               ü
zCGenerator._generate_stmtc                 C   sf   d}|j rd |j ¡d }|jr4|d |j¡d 7 }|jrR||  |jd ¡d 7 }||  |j¡7 }|S )z& Generation from a Decl node.
        r   r   r   )Zfuncspecr   rn   Zalignr   ro   r,   rl   r   r   r	   rb   £  s       zCGenerator._generate_declTc           	      C   s  t |ƒ}|tjkr€d}|jr2|d |j¡d 7 }||  |j ¡7 }|jrR|rR|jnd}t|ƒD ]\}}t|tj	ƒrÔ|dkrœt||d  tj
ƒrœd| 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¡|rVd| 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krþ| j|j ||g |d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%srF   rq   N)r,   r   ZTypeDeclZqualsr   r   ZdeclnameÚ	enumeraterK   Z	ArrayDeclZPtrDeclZ	dim_qualsZdimZFuncDeclr1   rÉ   rb   ZTypenamero   ZIdentifierTyper[   )	r   r    Ú	modifiersrr   rÎ   re   ZnstrÚiÚmodifierr   r   r	   ro   ­  sV     ÿ
ÿÿ
 ÿ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)r`   )r   r    Ú	conditionre   r   r   r	   rS   â  s    
zCGenerator._parenthesize_ifc                    s   ˆ   |‡ fdd„¡S )z. Common use case for _parenthesize_if
        c                    s   ˆ   | ¡ S r   )rJ   rN   r   r   r	   rQ   ï  rY   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rS   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.
        )rK   r   rÍ   r¹   rË   rÌ   rÊ   r   r   r   r	   rJ   ñ  s     ÿzCGenerator._is_simple_nodeN)F)F)F)Cr   Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r!   r$   r'   r+   r.   r2   r6   rM   rW   rZ   r\   r`   rf   rm   rp   rs   ry   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   rb   ro   rS   r*   rJ   r   r   r   r	   r      s¤   
        ô

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