o
    ߺ]<                     @   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d}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^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7dkdl Z8dmdn Z9d}dodpZ:dqdr Z;g dsfdtduZ<dvdw Z=dxdy Z>dzd{ Z?d|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.
    c                 C   s
   d| _ d S )N    indent_levelself r	   khome/ych/rk3568/buildroot/output/rockchip_rk3568/host/lib/python3.10/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      
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 )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      |j S r   )valuer   nr	   r	   r
   visit_Constant%      zCGenerator.visit_Constantc                 C   r    r   namer"   r	   r	   r
   visit_ID(   r%   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   $   |  |j}|d | |j d S )N[])_parenthesize_unless_simpler'   r   Z	subscript)r   r#   Zarrrefr	   r	   r
   visit_ArrayRef1      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   r,   )N())r/   r'   r   args)r   r#   Zfrefr	   r	   r
   visit_FuncCall9   r1   zCGenerator.visit_FuncCallc                 C   sX   |  |j}|jdkrd| S |jdkrd| S |jdkr%d| |j S d|j|f S )Nzp++z%s++zp--z%s--Zsizeofz
sizeof(%s)z%s%s)r/   expropr   )r   r#   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 r   _is_simple_nodedr   r	   r
   <lambda>L       z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    r=   r   r>   r@   r   r	   r
   rB   N   rC   %s %s %s)_parenthesize_ifleftrightr:   )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
   rB   T   rC   z-CGenerator.visit_Assignment.<locals>.<lambda>rD   )rE   Zrvaluer   Zlvaluer:   )r   r#   rH   r	   r	   r
   visit_AssignmentQ   s
   zCGenerator.visit_Assignmentc                 C   s   d |jS r   )r   namesr"   r	   r	   r
   visit_IdentifierTypeW      zCGenerator.visit_IdentifierTypec                 C   sF   t |tjrd| | d S t |tjrd| | d S | |S )N{}r5   r6   )rJ   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r$|d| |j 7 }|S )Nz :  = )r'   _generate_declZbitsizer   initrS   )r   r#   no_typesr	   r	   r
   
visit_Declb   s
   zCGenerator.visit_Declc                    sL     |jd }t|jdkr$|dd fdd|jdd  D  7 }|S )Nr   r   , c                 3   s    | ]
} j |d dV  qdS )T)rW   N)rY   r   declr   r	   r
   r   o   s    z,CGenerator.visit_DeclList.<locals>.<genexpr>)r   declslenr   r   r#   rX   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_typer2   r_   r	   r	   r
   visit_Typedefs   s   zCGenerator.visit_Typedefc                 C   s,   d| j |jdd d }|d | |j S )Nr5   Femit_declnamer6   r   )rb   Zto_typer/   r9   r_   r	   r	   r
   
visit_Casty   s   zCGenerator.visit_Castc                 C   *   g }|j D ]
}|| | qd|S NrZ   exprsappendrS   r   r   r#   Zvisited_subexprsr9   r	   r	   r
   visit_ExprList}      

zCGenerator.visit_ExprListc                 C   rg   rh   ri   rl   r	   r	   r
   visit_InitList   rn   zCGenerator.visit_InitListc                 C      | j |ddS )Nenumr&   _generate_struct_union_enumr"   r	   r	   r
   
visit_Enum      zCGenerator.visit_Enumc                 C   s8   |j sdj|  |jdS dj|  |j| |j dS )Nz{indent}{name},
)indentr'   z{indent}{name} = {value},
)rv   r'   r!   )r!   formatr   r'   r   r"   r	   r	   r
   visit_Enumerator   s   
zCGenerator.visit_Enumeratorc                    sf     |j}d _  |j}|jr+d fdd|jD }|d | d | d S |d | d S )Nr   ;
c                 3       | ]}  |V  qd S r   r   )r   pr   r	   r
   r          z+CGenerator.visit_FuncDef.<locals>.<genexpr>
)r   r\   r   bodyZparam_declsr   )r   r#   r\   r~   Zknrdeclsr	   r   r
   visit_FuncDef   s   zCGenerator.visit_FuncDefc                 C   sb   d}|j D ])}t|tjr|| |7 }qt|tjr%|| |d 7 }q|| |d 7 }q|S )Nr   r}   ry   )extrJ   r   ZFuncDefr   ZPragma)r   r#   rX   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   c                 3   rz   r   _generate_stmt)r   stmtr   r	   r
   r      r|   z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Zblock_itemsr   r_   r	   r   r
   visit_Compound   s   zCGenerator.visit_Compoundc                 C   s$   d|  |j d |  |j d S )Nr5   z){rQ   )r   r2   rV   r"   r	   r	   r
   visit_CompoundLiteral   s   $z CGenerator.visit_CompoundLiteralc                 C      dS )N;r	   r"   r	   r	   r
   visit_EmptyStatement      zCGenerator.visit_EmptyStatementc                    s   d  fdd|jD S )NrZ   c                 3   rz   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   )r9   r   r_   r	   r	   r
   visit_Return   s   zCGenerator.visit_Returnc                 C   r   )Nzbreak;r	   r"   r	   r	   r
   visit_Break   r   zCGenerator.visit_Breakc                 C   r   )Nz	continue;r	   r"   r	   r	   r
   visit_Continue   r   zCGenerator.visit_Continuec                 C   sH   d|  |j d }|d|  |j d 7 }|d|  |j d 7 }|S )Nr5   z) ? z) : r6   )rS   condiftrueiffalser_   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r0||  d 7 }|| j|jdd7 }|S )Nzif ()
T
add_indentzelse
)r   r   r   r   r   r   r_   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   )rV   r   r   nextr   r   r_   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   r_   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   r_   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   r   r   r_   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   r9   stmtsr   r   r#   rX   r   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   r   r   r	   r	   r
   visit_Default  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_Goto
  ru   zCGenerator.visit_Gotoc                 C   r   )Nz...r	   r"   r	   r	   r
   visit_EllipsisParam  r   zCGenerator.visit_EllipsisParamc                 C      |  |dS )Nstructrr   r"   r	   r	   r
   visit_Struct  rO   zCGenerator.visit_Structc                 C   s   |  |jS r   )rb   r2   r"   r	   r	   r
   visit_Typename  rO   zCGenerator.visit_Typenamec                 C   r   )Nunionrr   r"   r	   r	   r
   visit_Union  rO   zCGenerator.visit_Unionc                 C   sZ   d}|j D ]}t|tjr|d|j  7 }q|d| | d 7 }q|d| |j 7 }|S )Nr   .r-   r.   rT   )r'   rJ   r   IDr   rS   r9   )r   r#   rX   r'   r	   r	   r
   visit_NamedInitializer  s   
z!CGenerator.visit_NamedInitializerc                 C   s
   |  |S r   rb   r"   r	   r	   r
   visit_FuncDecl#  r   zCGenerator.visit_FuncDeclc                 C   rp   NFrd   r   r"   r	   r	   r
   visit_ArrayDecl&  ru   zCGenerator.visit_ArrayDeclc                 C   rp   r   r   r"   r	   r	   r
   visit_TypeDecl)  ru   zCGenerator.visit_TypeDeclc                 C   rp   r   r   r"   r	   r	   r
   visit_PtrDecl,  ru   zCGenerator.visit_PtrDeclc                 C   s   |dv r|j }| j}n|dksJ |jdu rdn|jj}| j}|d |jp&d }|durV|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   rq   Nr   r   r}   r   r   rQ   )r]   _generate_struct_union_bodyvaluesZenumerators_generate_enum_bodyr'   r   r   )r   r#   r'   membersZbody_functionrX   r	   r	   r
   rs   /  s    z&CGenerator._generate_struct_union_enumc                    s   d  fdd|D S )Nr   c                 3   rz   r   r   r[   r   r	   r
   r   H  r|   z9CGenerator._generate_struct_union_body.<locals>.<genexpr>r   r   r   r	   r   r
   r   G  s   z&CGenerator._generate_struct_union_bodyc                    s$   d  fdd|D d d d S )Nr   c                 3   rz   r   r   )r   r!   r   r	   r
   r   L  r|   z1CGenerator._generate_enum_body.<locals>.<genexpr>r}   r   r   r	   r   r
   r   J  s   $zCGenerator._generate_enum_bodyc                 C   s   t |}|r|  jd7  _|  }|r|  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 rA|| | d S |tjfv rL| |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   ry   r}   )r2   r   r   r   DeclrK   ZCastUnaryOpZBinaryOpZ	TernaryOpFuncCallArrayRef	StructRefConstantr   ZTypedefrR   r   ZCompound)r   r#   r   typrv   r	   r	   r
   r   N  s   
zCGenerator._generate_stmtc                 C   sH   d}|j rd|j d }|jr|d|jd 7 }|| |j7 }|S )z& Generation from a Decl node.
        r   r   )Zfuncspecr   ra   rb   r2   r_   r	   r	   r
   rU   j  s
   zCGenerator._generate_declTc           	      C   s  t |}|tjkrd}|jr|d|jd 7 }|| |j 7 }|jr(|r(|jnd}t|D ]\}}t|tj	rh|dkrLt||d  tj
rLd| d }|d7 }|jr]|d|jd 7 }|| |jd 7 }q.t|tjr|dkrt||d  tj
rd| d }|d| |j d 7 }q.t|tj
r|jrd	d|j|rd| 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rd|jd S |tj	tj
tjfv r| j|j ||g |dS | |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   r5   r6   r-   r.   z* %s%s*rd   )r2   r   ZTypeDeclZqualsr   r   Zdeclname	enumeraterJ   Z	ArrayDeclZPtrDeclZ	dim_qualsZdimZFuncDeclr7   r   rU   ZTypenamerb   ZIdentifierTyperM   )	r   r#   	modifiersre   r   rX   Znstrimodifierr	   r	   r
   rb   s  sT   




zCGenerator._generate_typec                 C   s"   |  |}||rd| d S |S )z Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r5   r6   )rS   )r   r#   	conditionrX   r	   r	   r
   rE     s   
zCGenerator._parenthesize_ifc                    s     | fddS )z. Common use case for _parenthesize_if
        c                    r=   r   r>   r@   r   r	   r
   rB     rC   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rE   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.
        )rJ   r   r   r   r   r   r   r"   r	   r	   r
   r?     s   zCGenerator._is_simple_nodeN)F)@r   
__module____qualname____doc__r   r   r   r   r$   r(   r+   r0   r4   r8   r<   rI   rL   rN   rS   rY   r`   rc   rf   rm   ro   rt   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   r   rs   r   r   r   rU   rb   rE   r/   r?   r	   r	   r	   r
   r      s|    


	


	5
r   N)r   r   objectr   r	   r	   r	   r
   <module>   s   