U
    œ9%elE  ã                   @   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dd,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   úT/var/www/html/Darija-Ai-API/env/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 )NÚ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   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 )NZ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_mapr4   ©Ú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   rJ   rO   rQ   r   r	   rR   w   s   
þú%s %s %s)Ú_parenthesize_ifÚleftÚrightr4   )r   r!   Zlval_strÚrval_strr   rQ   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   )rL   r   Ú
Assignment)r!   r   r   r	   rR      ó    z-CGenerator.visit_Assignment.<locals>.<lambda>rS   )rT   Zrvaluer   Zlvaluer4   )r   r!   rW   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Ú{Ú}r0   r1   )rL   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   Úinitra   )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)re   N)rg   ©r   Údeclr   r   r	   r   š   s   ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   ©r   r!   rf   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-   rm   r   r   r	   Úvisit_Typedefž   s
     zCGenerator.visit_Typedefc                 C   s,   d| j |jdd d }|d |  |j¡ S )Nr0   F©Úemit_declnamer1   r   )rp   Zto_typer+   r5   rm   r   r   r	   Ú
visit_Cast¤   s    zCGenerator.visit_Castc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S ©Nrh   ©ÚexprsÚappendra   r   ©r   r!   Zvisited_subexprsr5   r   r   r	   Úvisit_ExprList¨   s    
zCGenerator.visit_ExprListc                 C   s*   g }|j D ]}| |  |¡¡ q
d |¡S ru   rv   ry   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   Z	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   Ì   s     z+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)r   rj   r   ÚbodyZparam_declsr   )r   r!   rj   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„   )ÚextrL   r   ZFuncDefr   ZPragma)r   r!   rf   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ú{
r8   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   rm   r   r   r	   Úvisit_CompoundÜ   s    zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr0   z){r_   )r   r-   rd   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 )Nrh   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   r‘   )r5   r   rm   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 )Nr0   z) ? z) : r1   )ra   ÚcondÚiftrueÚiffalserm   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   rm   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Ÿ   )rd   r   rš   Únextr   rŽ   rm   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Ž   rm   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   rm   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(ú,r1   )r   rš   Úmessagerm   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Ž   rm   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   r5   Ústmtsr   ©r   r!   rf   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   )rp   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*   rb   )r$   rL   r   ÚIDr   ra   r5   )r   r!   rf   r$   r   r   r	   Úvisit_NamedInitializerP  s    
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   ©rp   r    r   r   r	   Úvisit_FuncDeclZ  s    zCGenerator.visit_FuncDeclc                 C   s   | j |ddS ©NFrr   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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 }||  ¡ 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†   r8   r‹   r_   )	rk   Ú_generate_struct_union_bodyÚAssertionErrorÚvaluesZenumeratorsÚ_generate_enum_bodyr$   r   r   )r   r!   r$   ÚmembersZbody_functionrf   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Œ   ri   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  ‡ fdd„|D ƒ¡d d… d S )Nr   c                 3   s   | ]}ˆ   |¡V  qd S r   r   )r   r   r   r   r	   r   ƒ  s     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kr‚||  |¡ d S |tjfkr˜|  |¡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.
        r8   r„   r†   N)r-   r   r   r   ÚDeclrY   ZCastÚUnaryOprM   Z	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantr¹   ZTypedefr`   r   ZCompoundÚIf)r   r!   r    Útypr‚   r   r   r	   r   …  s6               ü
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   ro   Úalignr   rp   r-   rm   r   r   r	   rc   £  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k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   r0   r1   r)   r*   z* %s%srG   rr   N)r-   r   ZTypeDeclZqualsr   r   ZdeclnameÚ	enumeraterL   Z	ArrayDeclZPtrDeclZ	dim_qualsÚdimZFuncDeclr2   rÉ   rc   ZTypenamerp   ZIdentifierTyper\   )	r   r!   Ú	modifiersrs   rÐ   rf   ZnstrÚiÚmodifierr   r   r	   rp   ­  sV     ÿ
ÿÿ
 ÿ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.
        r0   r1   N)ra   )r   r!   Ú	conditionrf   r   r   r	   rT   â  s    
zCGenerator._parenthesize_ifc                    s   ˆ   |‡ fdd„¡S )z. Common use case for _parenthesize_if
        c                    s   ˆ   | ¡ S r   )rK   rO   r   r   r	   rR   ï  rZ   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rT   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.
        )rL   r   rÎ   r¹   rÌ   rÍ   rË   r    r   r   r	   rK   ñ  s     ÿzCGenerator._is_simple_nodeN)F)F)F)Cr   Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r"   r%   r(   r,   r/   r3   r7   rN   rX   r[   r]   ra   rg   rn   rq   rt   rz   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   rc   rp   rT   r+   rK   r   r   r   r	   r      s¤   
        ô

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