509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    Ó—_5  ã                   @   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dldd „Z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^„ Z1dmd_d`„Z2dadb„ Z3g fdcdd„Z4dedf„ Z5dgdh„ Z6didj„ Z7dkS )nÚ
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	   úF/opt/alt/python38/lib/python3.8/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 )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$   |   |j¡}|d |  |j¡ d S )Nú[ú])Ú_parenthesize_unless_simpler#   r   Z	subscript)r   r    Zarrrefr	   r	   r
   Úvisit_ArrayRef+   s    zCGenerator.visit_ArrayRefc                 C   s"   |   |j¡}||j |  |j¡ S r   )r'   r#   Útyper   Úfield)r   r    Zsrefr	   r	   r
   Úvisit_StructRef/   s    zCGenerator.visit_StructRefc                 C   s$   |   |j¡}|d |  |j¡ d S )Nú(ú))r'   r#   r   Úargs)r   r    Zfrefr	   r	   r
   Úvisit_FuncCall3   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_UnaryOp7   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>F   ó    z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    s   ˆ   | ¡ S r   r4   r6   r   r	   r
   r8   H   r9   ú%s %s %s)Ú_parenthesize_ifÚleftÚrightr2   )r   r    Zlval_strÚrval_strr	   r   r
   Úvisit_BinaryOpD   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
   r8   N   r9   z-CGenerator.visit_Assignment.<locals>.<lambda>r:   )r;   Zrvaluer   Zlvaluer2   )r   r    r>   r	   r	   r
   Úvisit_AssignmentK   s
    þzCGenerator.visit_Assignmentc                 C   s   d  |j¡S r   )r   Únamesr   r	   r	   r
   Úvisit_IdentifierTypeQ   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,   r-   )r@   r   ZInitListr   ÚExprListr   r	   r	   r
   Ú_visit_exprT   s
    zCGenerator._visit_exprFc                 C   sL   |r
|j n|  |¡}|jr.|d|  |j¡ 7 }|jrH|d|  |j¡ 7 }|S )Nú : ú = )r#   Ú_generate_declZbitsizer   ÚinitrH   )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)rM   N)rO   )r   Údeclr   r	   r
   r   i   s   ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   ©r   r    rN   r	   r   r
   Úvisit_DeclListf   s    ÿzCGenerator.visit_DeclListc                 C   s2   d}|j r|d |j ¡d 7 }||  |j¡7 }|S )Nr   r   )Ústorager   Ú_generate_typer)   rT   r	   r	   r
   Úvisit_Typedefm   s
     zCGenerator.visit_Typedefc                 C   s(   d|   |j¡ d }|d |  |j¡ S )Nr,   r-   r   )rW   Zto_typer'   r1   rT   r	   r	   r
   Ú
visit_Casts   s    zCGenerator.visit_Castc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S ©NrP   ©ÚexprsÚappendrH   r   ©r   r    Zvisited_subexprsr1   r	   r	   r
   Úvisit_ExprListw   s    
zCGenerator.visit_ExprListc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S rZ   r[   r^   r	   r	   r
   Úvisit_InitList}   s    
zCGenerator.visit_InitListc                 C   sˆ   d}|j r|d|j  7 }|jr„|d7 }t|jjƒD ]H\}}||j 7 }|jr^|d|  |j¡ 7 }|t|jjƒd kr2|d7 }q2|d7 }|S )NÚenumr   z {rJ   r   rP   rF   )r#   ÚvaluesÚ	enumerateZenumeratorsr   r   rS   )r   r    rN   ÚiZ
enumeratorr	   r	   r
   Ú
visit_Enumƒ   s     

zCGenerator.visit_Enumc                    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   rQ   r   ÚbodyZparam_declsr   )r   r    rQ   ri   Zknrdeclsr	   r   r
   Úvisit_FuncDef‘   s    zCGenerator.visit_FuncDefc                 C   sB   d}|j D ]2}t|tjƒr*||  |¡7 }q
||  |¡d 7 }q
|S )Nr   rf   )Úextr@   r   ZFuncDefr   )r   r    rN   rk   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   rT   r	   r   r
   Úvisit_Compound¤   s    zCGenerator.visit_Compoundc                 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 )NrP   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   rr   )r1   r   rT   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   s8   |   |j¡d }||   |j¡d 7 }||   |j¡7 }|S )Nz ? rI   )rH   ÚcondÚiftrueÚiffalserT   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   ro   r|   r}   r   rT   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 (rr   r   r   Tr€   )rL   r   r{   Únextro   rp   rT   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   ro   rp   rT   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);)ro   rp   r   r{   r   rT   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{   ro   rp   rT   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   r1   Ústmtsro   ©r   r    rN   rp   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Š   ro   r‹   r	   r	   r
   Úvisit_Defaultó   s    
zCGenerator.visit_Defaultc                 C   s   |j d |  |j¡ S )Nr‰   )r#   ro   rp   r   r	   r	   r
   Úvisit_Labelù   s    zCGenerator.visit_Labelc                 C   s   d|j  d S )Nzgoto rr   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Ústruct©Ú_generate_struct_unionr   r	   r	   r
   Úvisit_Struct  s    zCGenerator.visit_Structc                 C   s   |   |j¡S r   )rW   r)   r   r	   r	   r
   Úvisit_Typename  s    zCGenerator.visit_Typenamec                 C   s   |   |d¡S )NÚunionr’   r   r	   r	   r
   Úvisit_Union  s    zCGenerator.visit_Unionc                 C   sb   d}|j D ]>}t|tjƒr*|d|j  7 }q
t|tjƒr
|d|j d 7 }q
|d|  |j¡ 7 }|S )Nr   Ú.r%   r&   rJ   )r#   r@   r   ÚIDÚConstantr   r   r1   )r   r    rN   r#   r	   r	   r
   Úvisit_NamedInitializer  s    
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   )rW   r   r	   r	   r
   Úvisit_FuncDecl  s    zCGenerator.visit_FuncDeclc                 C   s~   |d |j pd }|jrz|d7 }||  ¡ 7 }|  jd7  _|d7 }|jD ]}||  |¡7 }qH|  jd8  _||  ¡ d 7 }|S )ze Generates code for structs and unions. name should be either
            'struct' or union.
        r   r   rh   rn   rm   rF   )r#   rR   r   r   ro   )r   r    r#   rN   rQ   r	   r	   r
   r“     s    
z!CGenerator._generate_struct_unionc                 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.
        rn   rf   rh   N)r)   r   r   r   ÚDeclrA   ZCastZUnaryOpZBinaryOpZ	TernaryOpÚFuncCallÚArrayRefÚ	StructRefrš   r™   ZTypedefrG   r   ZCompound)r   r    r�   ÚtypÚindentr	   r	   r
   ro   (  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   rV   rW   r)   rT   r	   r	   r
   rK   D  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,   r-   r%   r&   z* %s %sÚ*N)r)   r   ZTypeDeclZqualsr   r   Zdeclnamerc   r@   Z	ArrayDeclZPtrDeclZdimZFuncDeclr.   r�   rK   ZTypenamerW   ZIdentifierTyperC   )r   r    Ú	modifiersr¡   rN   Znstrrd   Úmodifierr	   r	   r
   rW   M  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,   r-   N)rH   )r   r    Z	conditionrN   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   r4   r6   r   r	   r
   r8   ˆ  r9   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.
        )r@   r   rš   r™   rŸ   r    rž   r   r	   r	   r
   r5   Š  s     ÿzCGenerator._is_simple_nodeN)F)F)8r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r!   r$   r(   r+   r/   r3   r?   rB   rD   rH   rO   rU   rX   rY   r_   r`   re   rj   rl   rq   rs   rv   rx   ry   rz   r~   r‚   r„   r†   r‡   rˆ   rŒ   r�   rŽ   r�   r�   r”   r•   r—   r›   rœ   r“   ro   rK   rW   r;   r'   r5   r	   r	   r	   r
   r      sj   

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