3
ãdelE  ã               @   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d�d,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   úL/var/www/agendate/envp3/lib/python3.6/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   s    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 krdS dj ‡ fdd„|jƒ D ƒƒS d S )NÚ c             3   s   | ]\}}ˆ j |ƒV  qd S )N)r   )Ú.0Zc_nameÚc)r   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 )N)Úvalue)r   Únr   r   r	   Úvisit_Constant)   s    zCGenerator.visit_Constantc             C   s   |j S )N)Úname)r   r   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 |jƒ}|d | j|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 | j|jƒ S )N)r%   r   Útyper   Úfield)r   r   Zsrefr   r   r	   Úvisit_StructRef9   s    zCGenerator.visit_StructRefc             C   s$   | j |jƒ}|d | j|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|jƒ S | j|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   Úoperandr   r   r	   Úvisit_UnaryOpA   s    


zCGenerator.visit_UnaryOpr   r   é   é   é   é   é   é   é   é	   )z||z&&ú|ú^ú&z==z!=ú>z>=ú<z<=z>>z<<ú+ú-Ú*ú/ú%c                s@   ˆj ˆ j‡ ‡fdd„ƒ}ˆj ˆ j‡ ‡fdd„ƒ}d|ˆ j|f S )Nc                s6   ˆj | ƒp2ˆjo2t| tjƒo2ˆj| j ˆjˆ j k S )N)Ú_is_simple_noder   Ú
isinstancer   ÚBinaryOpÚprecedence_mapr/   )Úd)r   r   r   r	   Ú<lambda>k   s   
z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                s6   ˆj | ƒp2ˆjo2t| tjƒo2ˆj| j ˆjˆ j k S )N)rE   r   rF   r   rG   rH   r/   )rI   )r   r   r   r	   rJ   w   s   
z%s %s %s)Ú_parenthesize_ifÚleftÚrightr/   )r   r   Zlval_strÚrval_strr   )r   r   r	   Úvisit_BinaryOp_   s    

zCGenerator.visit_BinaryOpc             C   s*   | j |jdd„ ƒ}d| j|jƒ|j|f S )Nc             S   s   t | tjƒS )N)rF   r   Ú
Assignment)r   r   r   r	   rJ      s    z-CGenerator.visit_Assignment.<locals>.<lambda>z%s %s %s)rK   Zrvaluer   Zlvaluer/   )r   r   rN   r   r   r	   Úvisit_Assignment|   s    
zCGenerator.visit_Assignmentc             C   s   dj |jƒS )Nr   )r   Únames)r   r   r   r   r	   Úvisit_IdentifierType‚   s    zCGenerator.visit_IdentifierTypec             C   sJ   t |tjƒrd| j|ƒ d S t |tjƒr<d| j|ƒ d S | j|ƒS d S )NÚ{Ú}r*   r+   )rF   r   ZInitListr   ÚExprList)r   r   r   r   r	   Ú_visit_expr…   s
    zCGenerator._visit_exprc             C   sL   |r
|j n| j|ƒ}|jr.|d| j|jƒ 7 }|jrH|d| j|jƒ 7 }|S )Nz : z = )r   Ú_generate_declZbitsizer   ÚinitrW   )r   r   Úno_typeÚsr   r   r	   Ú
visit_Decl�   s     zCGenerator.visit_Declc                sL   ˆ j |jd ƒ}t|jƒdkrH|ddj‡ fdd„|jdd … D ƒƒ 7 }|S )Nr   r   z, c             3   s   | ]}ˆ j |d d�V  qdS )T)rZ   N)r\   )r   Údecl)r   r   r	   r   š   s   z,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   )r   r   r[   r   )r   r	   Úvisit_DeclList—   s
    zCGenerator.visit_DeclListc             C   s2   d}|j r|dj|j ƒd 7 }|| j|jƒ7 }|S )Nr   r   )Ústorager   Ú_generate_typer'   )r   r   r[   r   r   r	   Úvisit_Typedefž   s
     zCGenerator.visit_Typedefc             C   s,   d| j |jdd� d }|d | j|jƒ S )Nr*   F)Úemit_declnamer+   r   )rb   Zto_typer%   r0   )r   r   r[   r   r   r	   Ú
visit_Cast¤   s    zCGenerator.visit_Castc             C   s.   g }x|j D ]}|j| j|ƒƒ qW dj|ƒS )Nz, )ÚexprsÚappendrW   r   )r   r   Úvisited_subexprsr0   r   r   r	   Úvisit_ExprList¨   s    zCGenerator.visit_ExprListc             C   s.   g }x|j D ]}|j| j|ƒƒ qW dj|ƒS )Nz, )rf   rg   rW   r   )r   r   rh   r0   r   r   r	   Úvisit_InitList®   s    zCGenerator.visit_InitListc             C   s   | j |dd�S )NÚenum)r   )Ú_generate_struct_union_enum)r   r   r   r   r	   Ú
visit_Enum´   s    zCGenerator.visit_Enumc             C   s   dj | j|jƒƒS )Nz_Alignas({}))Úformatr   Ú	alignment)r   r   r   r   r	   Úvisit_Alignas·   s    zCGenerator.visit_Alignasc             C   s<   |j sdj| jƒ |jd�S dj| jƒ |j| j|j ƒd�S d S )Nz{indent}{name},
)Úindentr   z{indent}{name} = {value},
)rq   r   r   )r   rn   r   r   r   )r   r   r   r   r	   Úvisit_Enumeratorº   s    
zCGenerator.visit_Enumeratorc                sj   ˆ j |jƒ}dˆ _ˆ j |jƒ}|jrVdj‡ fdd„|jD ƒƒ}|d | d | d S |d | d S d S )Nr   z;
c             3   s   | ]}ˆ j |ƒV  qd S )N)r   )r   Úp)r   r   r	   r   Ì   s    z+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)r   r]   r   ÚbodyZparam_declsr   )r   r   r]   ru   Zknrdeclsr   )r   r	   Úvisit_FuncDefÇ   s    zCGenerator.visit_FuncDefc             C   sf   d}x\|j D ]R}t|tjƒr,|| j|ƒ7 }qt|tjƒrL|| j|ƒd 7 }q|| j|ƒd 7 }qW |S )Nr   rt   z;
)ÚextrF   r   ZFuncDefr   ZPragma)r   r   r[   rw   r   r   r	   Úvisit_FileASTÑ   s    zCGenerator.visit_FileASTc                s`   ˆ j ƒ d }ˆ  jd7  _|jr>|dj‡ fdd„|jD ƒƒ7 }ˆ  jd8  _|ˆ j ƒ d 7 }|S )Nz{
r3   r   c             3   s   | ]}ˆ j |ƒV  qd S )N)Ú_generate_stmt)r   Ústmt)r   r   r	   r   à   s    z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Zblock_itemsr   )r   r   r[   r   )r   r	   Úvisit_CompoundÜ   s    zCGenerator.visit_Compoundc             C   s$   d| j |jƒ d | j |jƒ d S )Nr*   z){rU   )r   r'   rY   )r   r   r   r   r	   Úvisit_CompoundLiteralå   s    z CGenerator.visit_CompoundLiteralc             C   s   dS )Nú;r   )r   r   r   r   r	   Úvisit_EmptyStatementé   s    zCGenerator.visit_EmptyStatementc                s   dj ‡ fdd„|jD ƒƒS )Nz, c             3   s   | ]}ˆ j |ƒV  qd S )N)r   )r   Úparam)r   r   r	   r   í   s    z-CGenerator.visit_ParamList.<locals>.<genexpr>)r   Úparams)r   r   r   )r   r	   Úvisit_ParamListì   s    zCGenerator.visit_ParamListc             C   s&   d}|j r|d| j|j ƒ 7 }|d S )NÚreturnr   r}   )r0   r   )r   r   r[   r   r   r	   Úvisit_Returnï   s     zCGenerator.visit_Returnc             C   s   dS )Nzbreak;r   )r   r   r   r   r	   Úvisit_Breakô   s    zCGenerator.visit_Breakc             C   s   dS )Nz	continue;r   )r   r   r   r   r	   Úvisit_Continue÷   s    zCGenerator.visit_Continuec             C   sH   d| j |jƒ d }|d| j |jƒ d 7 }|d| j |jƒ d 7 }|S )Nr*   z) ? z) : r+   )rW   ÚcondÚiftrueÚiffalse)r   r   r[   r   r   r	   Úvisit_TernaryOpú   s    zCGenerator.visit_TernaryOpc             C   sd   d}|j r|| j|j ƒ7 }|d7 }|| j|jdd�7 }|jr`|| jƒ d 7 }|| j|jdd�7 }|S )Nzif (z)
T)Ú
add_indentzelse
)r†   r   ry   r‡   rˆ   r   )r   r   r[   r   r   r	   Úvisit_If   s     zCGenerator.visit_Ifc             C   s~   d}|j r|| j|j ƒ7 }|d7 }|jr<|d| j|jƒ 7 }|d7 }|jr^|d| j|jƒ 7 }|d7 }|| j|jdd�7 }|S )Nzfor (r}   r   z)
T)rŠ   )rY   r   r†   Únextry   rz   )r   r   r[   r   r   r	   Ú	visit_For
  s       zCGenerator.visit_Forc             C   s:   d}|j r|| j|j ƒ7 }|d7 }|| j|jdd�7 }|S )Nzwhile (z)
T)rŠ   )r†   r   ry   rz   )r   r   r[   r   r   r	   Úvisit_While  s     zCGenerator.visit_Whilec             C   sJ   d}|| j |jdd�7 }|| jƒ d 7 }|jr>|| j|jƒ7 }|d7 }|S )Nzdo
T)rŠ   zwhile (z);)ry   rz   r   r†   r   )r   r   r[   r   r   r	   Úvisit_DoWhile  s     zCGenerator.visit_DoWhilec             C   s>   d}|| j |jƒ7 }|jr2|d7 }|| j |jƒ7 }|d7 }|S )Nz_Static_assert(ú,r+   )r   r†   Úmessage)r   r   r[   r   r   r	   Úvisit_StaticAssert$  s    zCGenerator.visit_StaticAssertc             C   s,   d| j |jƒ d }|| j|jdd�7 }|S )Nzswitch (z)
T)rŠ   )r   r†   ry   rz   )r   r   r[   r   r   r	   Úvisit_Switch-  s    zCGenerator.visit_Switchc             C   s:   d| j |jƒ d }x |jD ]}|| j|dd�7 }qW |S )Nzcase z:
T)rŠ   )r   r0   Ústmtsry   )r   r   r[   rz   r   r   r	   Ú
visit_Case2  s    zCGenerator.visit_Casec             C   s*   d}x |j D ]}|| j|dd�7 }qW |S )Nz	default:
T)rŠ   )r”   ry   )r   r   r[   rz   r   r   r	   Úvisit_Default8  s    zCGenerator.visit_Defaultc             C   s   |j d | j|jƒ S )Nz:
)r   ry   rz   )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   r	   Ú
visit_GotoA  s    zCGenerator.visit_Gotoc             C   s   dS )Nz...r   )r   r   r   r   r	   Úvisit_EllipsisParamD  s    zCGenerator.visit_EllipsisParamc             C   s   | j |dƒS )NÚstruct)rl   )r   r   r   r   r	   Úvisit_StructG  s    zCGenerator.visit_Structc             C   s   | j |jƒS )N)rb   r'   )r   r   r   r   r	   Úvisit_TypenameJ  s    zCGenerator.visit_Typenamec             C   s   | j |dƒS )NÚunion)rl   )r   r   r   r   r	   Úvisit_UnionM  s    zCGenerator.visit_Unionc             C   s^   d}x@|j D ]6}t|tjƒr,|d|j  7 }q|d| j|ƒ d 7 }qW |d| j|jƒ 7 }|S )Nr   Ú.r#   r$   z = )r   rF   r   ÚIDr   rW   r0   )r   r   r[   r   r   r   r	   Úvisit_NamedInitializerP  s    z!CGenerator.visit_NamedInitializerc             C   s
   | j |ƒS )N)rb   )r   r   r   r   r	   Úvisit_FuncDeclZ  s    zCGenerator.visit_FuncDeclc             C   s   | j |dd�S )NF)rd   )rb   )r   r   r   r   r	   Úvisit_ArrayDecl]  s    zCGenerator.visit_ArrayDeclc             C   s   | j |dd�S )NF)rd   )rb   )r   r   r   r   r	   Úvisit_TypeDecl`  s    zCGenerator.visit_TypeDeclc             C   s   | j |dd�S )NF)rd   )rb   )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 }|| jƒ 7 }|  jd7  _|d	7 }|||ƒ7 }|  jd8  _|| jƒ d
 7 }|S )zq Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        rš   r�   rk   Nr   r   rt   r3   z{
rU   )rš   r�   )	r^   Ú_generate_struct_union_bodyÚAssertionErrorÚvaluesZenumeratorsÚ_generate_enum_bodyr   r   r   )r   r   r   ÚmembersZbody_functionr[   r   r   r	   rl   f  s     z&CGenerator._generate_struct_union_enumc                s   dj ‡ fdd„|D ƒƒS )Nr   c             3   s   | ]}ˆ j |ƒV  qd S )N)ry   )r   r]   )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j ‡ fdd„|D ƒƒd d… d S )Nr   c             3   s   | ]}ˆ j |ƒV  qd S )N)r   )r   r   )r   r   r	   r   ƒ  s    z1CGenerator._generate_enum_body.<locals>.<genexpr>r3   rt   éþÿÿÿ)r   )r   rª   r   )r   r	   r©   �  s    zCGenerator._generate_enum_bodyc             C   sÈ   t |ƒ}|r|  jd7  _| jƒ }|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‚|| j|ƒ d S |tjfkr˜| j|ƒS |tjfkr²|| j|ƒ S || j|ƒ 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.
        r3   z;
rt   N)r'   r   r   r   ÚDeclrP   ZCastÚUnaryOprG   Z	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantr    ZTypedefrV   r   ZCompoundÚIf)r   r   rŠ   Útyprq   r   r   r	   ry   …  s"      

zCGenerator._generate_stmtc             C   sf   d}|j rdj|j ƒd }|jr4|dj|jƒd 7 }|jrR|| j|jd ƒd 7 }|| j|jƒ7 }|S )z& Generation from a Decl node.
        r   r   r   )Zfuncspecr   ra   Zalignr   rb   r'   )r   r   r[   r   r   r	   rX   £  s       zCGenerator._generate_declTc       	      C   s  t |ƒ}|tjk�r†d}|jr2|dj|jƒd 7 }|| j|j ƒ7 }|jrR|rR|jnd}�xt|ƒD �]\}}t|tj	ƒrØ|dkr t||d  tj
ƒr d| d }|d7 }|jrÂ|dj|jƒd 7 }|| j|jƒd 7 }qbt|tjƒ�r,|dk�rt||d  tj
ƒ�rd| d }|d| j|jƒ d 7 }qbt|tj
ƒrb|j�rdd	dj|jƒ|�rZd| ndf }qbd
| }qbW |�r‚|d| 7 }|S |tjk�rž| j|j ƒS |tjk�rº| j|j |d�S |tjk�rÖdj|jƒd S |tj	tj
tjfk�r| j|j ||g |d�S | j|ƒ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*   r+   r#   r$   z* %s%srB   )rd   N)r'   r   ZTypeDeclZqualsr   r   ZdeclnameÚ	enumeraterF   Z	ArrayDeclZPtrDeclZ	dim_qualsZdimZFuncDeclr,   r¬   rX   ZTypenamerb   ZIdentifierTyperR   )	r   r   Ú	modifiersrd   r³   r[   ZnstrÚiÚmodifierr   r   r	   rb   ­  sN     
 zCGenerator._generate_typec             C   s&   | j |ƒ}||ƒ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*   r+   N)rW   )r   r   Ú	conditionr[   r   r   r	   rK   â  s    
zCGenerator._parenthesize_ifc                s   ˆ j |‡ fdd„ƒS )z. Common use case for _parenthesize_if
        c                s   ˆ j | ƒ S )N)rE   )rI   )r   r   r	   rJ   ï  s    z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rK   )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.
        )rF   r   r±   r    r¯   r°   r®   )r   r   r   r   r	   rE   ñ  s    zCGenerator._is_simple_nodeN)F)F)F)Cr   Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r"   r&   r)   r-   r2   rH   rO   rQ   rS   rW   r\   r`   rc   re   ri   rj   rm   rp   rr   rv   rx   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¥   rl   r¦   r©   ry   rX   rb   rK   r%   rE   r   r   r   r	   r      s’   


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