a
    còflE  ã                   @   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   úR/home/httpd/docs/test/DocsMgr/lib/python3.9/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 u 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>'   ó    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"   Ú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_mapr6   ©Ú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   rL   rQ   rS   r   r	   rT   w   s   
þú%s %s %s)Ú_parenthesize_ifÚleftÚrightr6   )r   r"   Zlval_strÚrval_strr   rS   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   )rN   r   Ú
Assignment)r"   r   r   r	   rT      r   z-CGenerator.visit_Assignment.<locals>.<lambda>rU   )rV   Zrvaluer   Zlvaluer6   )r   r"   rY   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Ú{Ú}r1   r2   )rN   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   Úinitrb   )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)rf   N)rh   ©r   Údeclr   r   r	   r   š   s   ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   ©r   r"   rg   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.   rn   r   r   r	   Úvisit_Typedefž   s    zCGenerator.visit_Typedefc                 C   s,   d| j |jdd� d }|d |  |j¡ S )Nr1   F©Úemit_declnamer2   r   )rq   Zto_typer,   r7   rn   r   r   r	   Ú
visit_Cast¤   s    zCGenerator.visit_Castc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S ©Nri   ©ÚexprsÚappendrb   r   ©r   r"   Zvisited_subexprsr7   r   r   r	   Úvisit_ExprList¨   s    
zCGenerator.visit_ExprListc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S rv   rw   rz   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   Ì   r   z+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)r   rk   r   ÚbodyZparam_declsr   )r   r"   rk   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†   )ÚextrN   r   ZFuncDefr   ZPragma)r   r"   rg   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:   r   c                 3   s   | ]}ˆ   |¡V  qd S r   ©Ú_generate_stmt)r   Ústmtr   r   r	   r   à   r   z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Zblock_itemsr   rn   r   r   r	   Úvisit_CompoundÜ   s    zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr1   z){r`   )r   r.   re   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 )Nri   c                 3   s   | ]}ˆ   |¡V  qd S 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“   )r7   r   rn   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 )Nr1   z) ? z) : r2   )rb   ÚcondÚiftrueÚiffalsern   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   rn   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¡   )re   r   rœ   Únextr�   r�   rn   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�   rn   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   rn   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(ú,r2   )r   rœ   Úmessagern   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�   rn   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   r7   Ústmtsr�   ©r   r"   rg   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   )rq   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+   rc   )r%   rN   r   ÚIDr   rb   r7   )r   r"   rg   r%   r   r   r	   Úvisit_NamedInitializerP  s    
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   ©rq   r!   r   r   r	   Úvisit_FuncDeclZ  s    zCGenerator.visit_FuncDeclc                 C   s   | j |dd�S ©NFrs   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v r|j }| j}n(|dks"J ‚|jdu r0dn|jj}| j}|d |jpLd }|du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ˆ   r:   r�   r`   )rl   Ú_generate_struct_union_bodyÚvaluesZenumeratorsÚ_generate_enum_bodyr%   r   r   )r   r"   r%   ÚmembersZbody_functionrg   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Ž   rj   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   s   | ]}ˆ   |¡V  qd S 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  _|  ¡ }|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v r‚||  |¡ d S |tjfv r˜|  |¡S |tjfv 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.
        r:   r†   rˆ   N)r.   r   r   r   ÚDeclr[   ZCastÚUnaryOprO   Z	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantr»   ZTypedefra   r   ZCompoundÚIf)r   r"   r¢   Útypr„   r   r   r	   r�   …  s     ü
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   rp   Úalignr   rq   r.   rn   r   r   r	   rd   £  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v �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   r1   r2   r*   r+   z* %s%srI   rs   N)r.   r   ZTypeDeclZqualsr   r   ZdeclnameÚ	enumeraterN   Z	ArrayDeclZPtrDeclZ	dim_qualsÚdimZFuncDeclr3   rÊ   rd   ZTypenamerq   ZIdentifierTyper]   )	r   r"   Ú	modifiersrt   rÑ   rg   ZnstrÚiÚmodifierr   r   r	   rq   ­  sR    ÿ
ÿÿ
ÿ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.
        r1   r2   N)rb   )r   r"   Ú	conditionrg   r   r   r	   rV   â  s    
zCGenerator._parenthesize_ifc                    s   ˆ   |‡ fdd„¡S )z. Common use case for _parenthesize_if
        c                    s   ˆ   | ¡ S r   )rM   rQ   r   r   r	   rT   ï  r   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rV   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.
        )rN   r   rÏ   r»   rÍ   rÎ   rÌ   r!   r   r   r	   rM   ñ  s    ÿzCGenerator._is_simple_nodeN)F)F)F)Cr   Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r#   r&   r)   r-   r0   r4   r9   rP   rZ   r\   r^   rb   rh   ro   rr   ru   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�   rd   rq   rV   r,   rM   r   r   r   r	   r      s”   
ô

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