3
+:X6                 @   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dnd!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` Z2dodadbZ3dcdd Z4g fdedfZ5dgdh Z6didj Z7dkdl Z8dmS )p
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   U/var/www/html/enquirykeeper_venv/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   	subscript)r   r   Zarrrefr   r   r   visit_ArrayRef1   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_StructRef5   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_FuncCall9   s    zCGenerator.visit_FuncCallc             C   s\   | j |j}|jdkrd| S |jdkr0d| S |jdkrJd| j|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   operandr   r   r   visit_UnaryOp=   s    


zCGenerator.visit_UnaryOpc                s<    j |j fdd} j |j fdd}d||j|f S )Nc                s    j |  S )N)_is_simple_node)d)r   r   r   <lambda>L   s    z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                s    j |  S )N)r3   )r4   )r   r   r   r5   N   s    z%s %s %s)_parenthesize_ifleftrightr0   )r   r   Zlval_strrval_strr   )r   r   visit_BinaryOpJ   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)
isinstancer   
Assignment)r   r   r   r   r5   T   s    z-CGenerator.visit_Assignment.<locals>.<lambda>z%s %s %s)r6   Zrvaluer   Zlvaluer0   )r   r   r9   r   r   r   visit_AssignmentQ   s    
zCGenerator.visit_Assignmentc             C   s   dj |jS )Nr
   )r   names)r   r   r   r   r   visit_IdentifierTypeW   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+   )r;   r   ZInitListr   ExprList)r   r   r   r   r   _visit_exprZ   s
    zCGenerator._visit_exprFc             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   initrC   )r   r   no_typesr   r   r   
visit_Declb   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)rF   N)rH   )r   decl)r   r   r   r   o   s   z,CGenerator.visit_DeclList.<locals>.<genexpr>)r   declslenr   )r   r   rG   r   )r   r   visit_DeclListl   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   rG   r   r   r   visit_Typedefs   s
     zCGenerator.visit_Typedefc             C   s(   d| j |j d }|d | j|j S )Nr*   r+   r
   )rN   Zto_typer$   r/   )r   r   rG   r   r   r   
visit_Casty   s    zCGenerator.visit_Castc             C   s.   g }x|j D ]}|j| j| qW dj|S )Nz, )exprsappendrC   r   )r   r   visited_subexprsr/   r   r   r   visit_ExprList}   s    zCGenerator.visit_ExprListc             C   s.   g }x|j D ]}|j| j| qW dj|S )Nz, )rQ   rR   rC   r   )r   r   rS   r/   r   r   r   visit_InitList   s    zCGenerator.visit_InitListc             C   s   d}|j r|d|j  7 }|jr|d7 }xXt|jjD ]H\}}||j 7 }|jr`|d| j|j 7 }|t|jjd kr4|d7 }q4W |d7 }|S )Nenumr
   z {z = r   z, rA   )r   values	enumerateZenumeratorsr   r   rK   )r   r   rG   iZ
enumeratorr   r   r   
visit_Enum   s     
zCGenerator.visit_Enumc                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   rI   r   bodyZparam_declsr   )r   r   rI   r]   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   r\   z;
)extr;   r   ZFuncDefr   ZPragma)r   r   rG   r_   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{
   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   rG   r   )r   r   visit_Compound   s    zCGenerator.visit_Compoundc             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
   re   )r/   r   )r   r   rG   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+   )rC   condiftrueiffalse)r   r   rG   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
)rn   r   rb   ro   rp   r   )r   r   rG   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 (re   r
   z)
T)rr   )rE   r   rn   nextrb   rc   )r   r   rG   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)rr   )rn   r   rb   rc   )r   r   rG   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)rr   zwhile (z);)rb   rc   r   rn   r   )r   r   rG   r   r   r   visit_DoWhile   s     zCGenerator.visit_DoWhilec             C   s,   d| j |j d }|| j|jdd7 }|S )Nzswitch (z)
T)rr   )r   rn   rb   rc   )r   r   rG   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)rr   )r   r/   stmtsrb   )r   r   rG   rc   r   r   r   
visit_Case   s    zCGenerator.visit_Casec             C   s*   d}x |j D ]}|| j|dd7 }qW |S )Nz	default:
T)rr   )ry   rb   )r   r   rG   rc   r   r   r   visit_Default   s    zCGenerator.visit_Defaultc             C   s   |j d | j|j S )Nz:
)r   rb   rc   )r   r   r   r   r   visit_Label  s    zCGenerator.visit_Labelc             C   s   d|j  d S )Nzgoto re   )r   )r   r   r   r   r   
visit_Goto  s    zCGenerator.visit_Gotoc             C   s   dS )Nz...r   )r   r   r   r   r   visit_EllipsisParam  s    zCGenerator.visit_EllipsisParamc             C   s   | j |dS )Nstruct)_generate_struct_union)r   r   r   r   r   visit_Struct
  s    zCGenerator.visit_Structc             C   s   | j |jS )N)rN   r'   )r   r   r   r   r   visit_Typename  s    zCGenerator.visit_Typenamec             C   s   | j |dS )Nunion)r   )r   r   r   r   r   visit_Union  s    zCGenerator.visit_Unionc             C   sf   d}xH|j D ]>}t|tjr,|d|j  7 }qt|tjr|d|j d 7 }qW |d| j|j 7 }|S )Nr   .r"   r#   z = )r   r;   r   IDConstantr   rC   r/   )r   r   rG   r   r   r   r   visit_NamedInitializer  s    z!CGenerator.visit_NamedInitializerc             C   s
   | j |S )N)rN   )r   r   r   r   r   visit_FuncDecl  s    zCGenerator.visit_FuncDeclc             C   s   |d |j pd }|jr~|d7 }|| j 7 }|  jd7  _|d7 }x|jD ]}|| j|7 }qJW |  jd8  _|| j d 7 }|S )ze Generates code for structs and unions. name should be either
            'struct' or union.
        r
   r   r\   ra   z{
rA   )r   rJ   r   r   rb   )r   r   r   rG   rI   r   r   r   r      s    z!CGenerator._generate_struct_unionc             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 || 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.
        ra   z;
r\   N)r'   r   r   r   Declr<   ZCastUnaryOpZBinaryOpZ	TernaryOpFuncCallArrayRef	StructRefr   r   ZTypedefrB   r   ZCompound)r   r   rr   typindentr   r   r   rb   0  s      

zCGenerator._generate_stmtc             C   sH   d}|j rdj|j d }|jr4|dj|jd 7 }|| j|j7 }|S )z& Generation from a Decl node.
        r   r
   )Zfuncspecr   rM   rN   r'   )r   r   rG   r   r   r   rD   L  s      zCGenerator._generate_declc             C   s  t |}|tjkrNd}|jr2|dj|jd 7 }|| j|j 7 }|jrN|jnd}xt|D ]\}}t|tj	r|dkrt||d  tj
rd| d }|d| j|j d 7 }q\t|tjr|dkrt||d  tj
rd| d }|d| j|j d 7 }q\t|tj
r\|jr,d	dj|j|f }q\d
| }q\W |rJ|d| 7 }|S |tjkrf| j|j S |tjkr~| j|j S |tjkrdj|jd S |tj	tj
tjfkr| j|j ||g 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 %s*N)r'   r   ZTypeDeclZqualsr   r   ZdeclnamerX   r;   Z	ArrayDeclZPtrDeclZdimZFuncDeclr,   r   rD   ZTypenamerN   ZIdentifierTyper>   )r   r   	modifiersr   rG   ZnstrrY   modifierr   r   r   rN   U  s@      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)rC   )r   r   Z	conditionrG   r   r   r   r6     s    
zCGenerator._parenthesize_ifc                s    j | fddS )z. Common use case for _parenthesize_if
        c                s    j |  S )N)r3   )r4   )r   r   r   r5     s    z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)r6   )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   r   r3     s    zCGenerator._is_simple_nodeN)F)F)9r   
__module____qualname____doc__r	   r   r   r   r   r   r!   r&   r)   r-   r2   r:   r=   r?   rC   rH   rL   rO   rP   rT   rU   rZ   r^   r`   rd   rf   ri   rk   rl   rm   rq   rs   ru   rv   rw   rx   rz   r{   r|   r}   r~   r   r   r   r   r   r   rb   rD   rN   r6   r$   r3   r   r   r   r   r      sl   

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