
    MhlE                     .    d dl mZ  G d de          ZdS )   )c_astc                      e Zd ZdZd_dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zi ddddddddddddddddddddddd d!d"d!d#d$d%d$d&d'd(d'd)d'iZd* Zd+ Zd, Zd- Zd_d.Zd/ Zd0 Zd1 Zd2 Zd3 Zd4 Zd5 Zd6 Zd7 Zd8 Zd9 Zd: Z d; Z!d< Z"d= Z#d> Z$d? Z%d@ Z&dA Z'dB Z(dC Z)dD Z*dE Z+dF Z,dG Z-dH Z.dI Z/dJ Z0dK Z1dL Z2dM Z3dN Z4dO Z5dP Z6dQ Z7dR Z8dS Z9dT Z:dU Z;dV Z<d_dWZ=dX Z>g dYfdZZ?d[ Z@d\ ZAd] 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                 "    d| _         || _        dS )z Constructs C-code generator

            reduce_parentheses:
                if True, eliminates needless parentheses on binary operators
            N)indent_levelreduce_parentheses)selfr	   s     U/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pycparser/c_generator.py__init__zCGenerator.__init__   s     "4    c                     d| j         z  S N )r   )r
   s    r   _make_indentzCGenerator._make_indent   s    T&&&r   c                 ^    d|j         j        z   } t          | || j                  |          S )Nvisit_)	__class____name__getattrgeneric_visit)r
   nodemethods      r   visitzCGenerator.visit   s0    DN338wtVT%788>>>r   c                 r     |dS d                      fd|                                D                       S )N c              3   H   K   | ]\  }}                     |          V  d S Nr   ).0c_namecr
   s      r   	<genexpr>z+CGenerator.generic_visit.<locals>.<genexpr>'   s1      JJYVQ4::a==JJJJJJr   )joinchildren)r
   r   s   ` r   r   zCGenerator.generic_visit#   s<    <277JJJJ$--//JJJJJJr   c                     |j         S r   )valuer
   ns     r   visit_ConstantzCGenerator.visit_Constant)   s	    wr   c                     |j         S r   namer(   s     r   visit_IDzCGenerator.visit_ID,   s	    vr   c                 2    d}|j         r|d|j         z   z  }|S )Nz#pragmar   )string)r
   r)   rets      r   visit_PragmazCGenerator.visit_Pragma/   s&    8 	"3>!C
r   c                 |    |                      |j                  }|dz   |                     |j                  z   dz   S )N[])_parenthesize_unless_simpler-   r   	subscript)r
   r)   arrrefs      r   visit_ArrayRefzCGenerator.visit_ArrayRef5   s9    11!&99|djj555;;r   c                     |                      |j                  }||j        z   |                     |j                  z   S r   )r6   r-   typer   field)r
   r)   srefs      r   visit_StructRefzCGenerator.visit_StructRef9   s6    //77af}tzz!'2222r   c                 |    |                      |j                  }|dz   |                     |j                  z   dz   S )N())r6   r-   r   args)r
   r)   frefs      r   visit_FuncCallzCGenerator.visit_FuncCall=   s9    //77czDJJqv...44r   c                     |j         dk    rd|                     |j                  z  S |                     |j                  }|j         dk    rd|z  S |j         dk    rd|z  S |j         |S )Nsizeofz
sizeof(%s)zp++z%s++zp--z%s--)opr   exprr6   )r
   r)   operands      r   visit_UnaryOpzCGenerator.visit_UnaryOpA   s|    48  $**QV"4"44466qv>>Gtu}}''''!"ww//r   z||r   z&&r   |   ^   &   z==   z!=>   z>=<z<=z>>   z<<+   -*	   /%c                                            j         fd          }                      j         fd          }|dj        d|S )Nc                                          |           pFj        o?t          | t          j                  o%j        | j                 j        j                 k     S r   _is_simple_noder	   
isinstancer   BinaryOpprecedence_maprG   dr)   r
   s    r   <lambda>z+CGenerator.visit_BinaryOp.<locals>.<lambda>k   s]    4//22 M- M*Q2O2O M)!$/43Fqt3LLN r   c                                          |           pFj        o?t          | t          j                  o%j        | j                 j        j                 k     S r   r_   rd   s    r   rf   z+CGenerator.visit_BinaryOp.<locals>.<lambda>w   s]    4//22 L- L*Q2O2O L)!$/$2Ead2KKM r   r   )_parenthesize_ifleftrightrG   )r
   r)   lval_strrval_strs   ``  r   visit_BinaryOpzCGenerator.visit_BinaryOp_   s     ((FN N N N NO O ((GM M M M MN N
 &XXqtttXX66r   c                     |                      |j        d           }|                     |j                  d|j        d|S )Nc                 6    t          | t          j                  S r   )ra   r   
Assignment)r)   s    r   rf   z-CGenerator.visit_Assignment.<locals>.<lambda>   s    jE4D&E&E r   r   )rh   rvaluer   lvaluerG   )r
   r)   rl   s      r   visit_AssignmentzCGenerator.visit_Assignment|   sO    ((HEEG G "ZZ11111444BBr   c                 6    d                     |j                  S r   )r$   namesr(   s     r   visit_IdentifierTypezCGenerator.visit_IdentifierType   s    xx   r   c                     t          |t          j                  rd|                     |          z   dz   S t          |t          j                  rd|                     |          z   dz   S |                     |          S )N{}r@   rA   )ra   r   InitListr   ExprListr(   s     r   _visit_exprzCGenerator._visit_expr   sn    a(( 	!A&,,5>** 	!A&,,::a== r   c                     |r|j         n|                     |          }|j        r |d|                     |j                  z   z  }|j        r |d|                     |j                  z   z  }|S )Nz :  = )r-   _generate_declbitsizer   initr|   )r
   r)   no_typess       r   
visit_DeclzCGenerator.visit_Decl   st     9AFF4#6#6q#9#998a54::ai#8#888a6 	2))!&1111Ar   c                                            |j        d                   }t          |j                  dk    r4|dd                     fd|j        dd          D                       z   z  }|S )Nr   r   , c              3   F   K   | ]}                     |d           V  dS )T)r   N)r   r    declr
   s     r   r#   z,CGenerator.visit_DeclList.<locals>.<genexpr>   sG       "= "=(, #'//$/"E"E "= "= "= "= "= "=r   )r   declslenr$   r
   r)   r   s   `  r   visit_DeclListzCGenerator.visit_DeclList   s    JJqwqz""qw<<!		 "= "= "= "=01"= "= "= = = = =Ar   c                     d}|j         r |d                    |j                   dz   z  }||                     |j                  z  }|S )Nr   r   )storager$   _generate_typer;   r   s      r   visit_TypedefzCGenerator.visit_Typedef   sJ    94a388AI..44a	T  (((r   c                     d|                      |j        d          z   dz   }|dz   |                     |j                  z   S )Nr@   Femit_declnamerA   r   )r   to_typer6   rH   r   s      r   
visit_CastzCGenerator.visit_Cast   sE    $%%aiu%EEEK3w99!&AAAAr   c                     g }|j         D ]*}|                    |                     |                     +d                    |          S Nr   exprsappendr|   r$   r
   r)   visited_subexprsrH   s       r   visit_ExprListzCGenerator.visit_ExprList   Q    G 	< 	<D##D$4$4T$:$:;;;;yy)***r   c                     g }|j         D ]*}|                    |                     |                     +d                    |          S r   r   r   s       r   visit_InitListzCGenerator.visit_InitList   r   r   c                 0    |                      |d          S )Nenumr,   _generate_struct_union_enumr(   s     r   
visit_EnumzCGenerator.visit_Enum   s    ///???r   c                 \    d                     |                     |j                            S )Nz_Alignas({}))formatr   	alignmentr(   s     r   visit_AlignaszCGenerator.visit_Alignas   s$    $$TZZ%<%<===r   c                     |j         s.d                    |                                 |j                  S d                    |                                 |j        |                     |j                             S )Nz{indent}{name},
)indentr-   z{indent}{name} = {value},
)r   r-   r'   )r'   r   r   r-   r   r(   s     r   visit_EnumeratorzCGenerator.visit_Enumerator   s    w 
	&--((**V .   
 177((**Vjj)) 8   r   c                                           |j                  }d _                              |j                  }|j        r7d                     fd|j        D                       }|dz   |z   dz   |z   dz   S |dz   |z   dz   S )Nr   ;
c              3   B   K   | ]}                     |          V  d S r   r   )r    pr
   s     r   r#   z+CGenerator.visit_FuncDef.<locals>.<genexpr>   s-      !G!GA$**Q--!G!G!G!G!G!Gr   
)r   r   r   bodyparam_declsr$   )r
   r)   r   r   knrdeclss   `    r   visit_FuncDefzCGenerator.visit_FuncDef   s    zz!&!!zz!&!!= 	-zz!G!G!G!G!G!G!GGGH$;)E1D84??$;%,,r   c                 &   d}|j         D ]}t          |t          j                  r||                     |          z  }5t          |t          j                  r||                     |          dz   z  }k||                     |          dz   z  }|S )Nr   r   r   )extra   r   FuncDefr   Pragma)r
   r)   r   r   s       r   visit_FileASTzCGenerator.visit_FileAST   s    5 	- 	-C#u}-- -TZZ__$C.. -TZZ__t++TZZ__u,,r   c                 
                                      dz   } xj        dz  c_        |j        r)|d                     fd|j        D                       z  } xj        dz  c_        |                                  dz   z  }|S )N{
rL   r   c              3   B   K   | ]}                     |          V  d S r   _generate_stmt)r    stmtr
   s     r   r#   z,CGenerator.visit_Compound.<locals>.<genexpr>   s1      MMt,,T22MMMMMMr   z}
)r   r   block_itemsr$   r   s   `  r   visit_CompoundzCGenerator.visit_Compound   s    %'Q= 	NMMMMq}MMMMMMAQ	T  5((r   c                 ~    d|                      |j                  z   dz   |                      |j                  z   dz   S )Nr@   z){ry   )r   r;   r   r(   s     r   visit_CompoundLiteralz CGenerator.visit_CompoundLiteral   s8    TZZ'''$.AF1C1CCcIIr   c                     dS )N; r(   s     r   visit_EmptyStatementzCGenerator.visit_EmptyStatement   s    sr   c                 P     d                      fd|j        D                       S )Nr   c              3   B   K   | ]}                     |          V  d S r   r   )r    paramr
   s     r   r#   z-CGenerator.visit_ParamList.<locals>.<genexpr>   s/      AAuE**AAAAAAr   )r$   paramsr(   s   ` r   visit_ParamListzCGenerator.visit_ParamList   s,    yyAAAAAAAAAAr   c                 ^    d}|j         r |d|                     |j                   z   z  }|dz   S )Nreturnr   r   )rH   r   r   s      r   visit_ReturnzCGenerator.visit_Return   s4    601djj000013wr   c                     dS )Nzbreak;r   r(   s     r   visit_BreakzCGenerator.visit_Break   s    xr   c                     dS )Nz	continue;r   r(   s     r   visit_ContinuezCGenerator.visit_Continue   s    {r   c                     d|                      |j                  z   dz   }|d|                      |j                  z   dz   z  }|d|                      |j                  z   dz   z  }|S )Nr@   z) ? z) : rA   )r|   condiftrueiffalser   s      r   visit_TernaryOpzCGenerator.visit_TernaryOp   sn    4##AF+++f4	S4##AH---66	S4##AI...44r   c                    d}|j         r||                     |j                   z  }|dz  }||                     |j        d          z  }|j        r9||                                 dz   z  }||                     |j        d          z  }|S )Nzif ()
T
add_indentzelse
)r   r   r   r   r   r   r   s      r   visit_IfzCGenerator.visit_If   s    6*1

16***1	U
	T  d ;;;9 	A""$$x//A$$QY4$@@@Ar   c                 J   d}|j         r||                     |j                   z  }|dz  }|j        r |d|                     |j                  z   z  }|dz  }|j        r |d|                     |j                  z   z  }|dz  }||                     |j        d          z  }|S )Nzfor (r   r   r   Tr   )r   r   r   nextr   r   r   s      r   	visit_ForzCGenerator.visit_For
  s    6*1

16***1	S601djj00001	S601djj00001	U
	T  D 999r   c                     d}|j         r||                     |j                   z  }|dz  }||                     |j        d          z  }|S )Nwhile (r   Tr   )r   r   r   r   r   s      r   visit_WhilezCGenerator.visit_While  sS    6*1

16***1	U
	T  D 999r   c                     d}||                      |j        d          z  }||                                 dz   z  }|j        r||                     |j                  z  }|dz  }|S )Nzdo
Tr   r   z);)r   r   r   r   r   r   s      r   visit_DoWhilezCGenerator.visit_DoWhile  sn    	T  D 999	T  9,,6*1

16***1	T	r   c                     d}||                      |j                  z  }|j        r"|dz  }||                      |j                  z  }|dz  }|S )Nz_Static_assert(,rA   )r   r   messager   s      r   visit_StaticAssertzCGenerator.visit_StaticAssert$  sX    	TZZ9 	'HAAI&&&A	Sr   c                     d|                      |j                  z   dz   }||                     |j        d          z  }|S )Nzswitch (r   Tr   )r   r   r   r   r   s      r   visit_SwitchzCGenerator.visit_Switch-  sC    AF+++e3	T  D 999r   c                     d|                      |j                  z   dz   }|j        D ]}||                     |d          z  }|S )Nzcase :
Tr   )r   rH   stmtsr   r
   r)   r   r   s       r   
visit_CasezCGenerator.visit_Case2  sT    djj(((50G 	< 	<D$$Td$;;;AAr   c                 R    d}|j         D ]}||                     |d          z  }|S )Nz	default:
Tr   )r   r   r   s       r   visit_DefaultzCGenerator.visit_Default8  s<    G 	< 	<D$$Td$;;;AAr   c                 L    |j         dz   |                     |j                  z   S )Nr   )r-   r   r   r(   s     r   visit_LabelzCGenerator.visit_Label>  s#    v~ 3 3AF ; ;;;r   c                     d|j         z   dz   S )Nzgoto r   r,   r(   s     r   
visit_GotozCGenerator.visit_GotoA  s    #%%r   c                     dS )Nz...r   r(   s     r   visit_EllipsisParamzCGenerator.visit_EllipsisParamD  s    ur   c                 .    |                      |d          S )Nstructr   r(   s     r   visit_StructzCGenerator.visit_StructG  s    //8<<<r   c                 6    |                      |j                  S r   )r   r;   r(   s     r   visit_TypenamezCGenerator.visit_TypenameJ  s    ""16***r   c                 .    |                      |d          S )Nunionr   r(   s     r   visit_UnionzCGenerator.visit_UnionM  s    //7;;;r   c                     d}|j         D ]H}t          |t          j                  r|d|j         z   z  }*|d|                     |          z   dz   z  }I|d|                     |j                  z   z  }|S )Nr   .r4   r5   r~   )r-   ra   r   IDr   r|   rH   )r
   r)   r   r-   s       r   visit_NamedInitializerz!CGenerator.visit_NamedInitializerP  s    F 	2 	2D$)) 2S49_$S4::d+++c11	UT%%af----r   c                 ,    |                      |          S r   r   r(   s     r   visit_FuncDeclzCGenerator.visit_FuncDeclZ  s    ""1%%%r   c                 0    |                      |d          S NFr   r  r(   s     r   visit_ArrayDeclzCGenerator.visit_ArrayDecl]      ""1E":::r   c                 0    |                      |d          S r  r  r(   s     r   visit_TypeDeclzCGenerator.visit_TypeDecl`  r  r   c                 0    |                      |d          S r  r  r(   s     r   visit_PtrDeclzCGenerator.visit_PtrDeclc  r  r   c                 h   |dv r|j         }| j        }n$|dk    sJ |j        dn|j        j        }| j        }|dz   |j        pdz   }|i|dz  }||                                 z  }| xj        dz  c_        |dz  }| ||          z  }| xj        dz  c_        ||                                 d	z   z  }|S )
zq Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        )r   r  r   Nr   r   r   rL   r   ry   )r   _generate_struct_union_bodyvaluesenumerators_generate_enum_bodyr-   r   r   )r
   r)   r-   membersbody_functionr   s         r   r   z&CGenerator._generate_struct_union_enumf  s     &&&gG <MM6>>>>h.ddAH4HG 4M3J!&,B' IA""$$$A"JAw'''A"""$$s**Ar   c                 F     d                      fd|D                       S )Nr   c              3   B   K   | ]}                     |          V  d S r   r   r   s     r   r#   z9CGenerator._generate_struct_union_body.<locals>.<genexpr>  s1      EETt**400EEEEEEr   r$   r
   r  s   ` r   r  z&CGenerator._generate_struct_union_body~  s*    wwEEEEWEEEEEEr   c                 \     d                      fd|D                       d d         dz   S )Nr   c              3   B   K   | ]}                     |          V  d S r   r   )r    r'   r
   s     r   r#   z1CGenerator._generate_enum_body.<locals>.<genexpr>  s/      >>Utzz%((>>>>>>r   r   r  r  s   ` r   r  zCGenerator._generate_enum_body  s8    ww>>>>g>>>>>ssCdJJr   c                    t          |          }|r| xj        dz  c_        |                                 }|r| xj        dz  c_        |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||                     |          z   dz   S |t          j        fv r|                     |          S |t          j        fv r||                     |          z   S ||                     |          z   dz   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.
        rL   r   r   )r;   r   r   r   Declrp   CastUnaryOprb   	TernaryOpFuncCallArrayRef	StructRefConstantr  Typedefr{   r   CompoundIf)r
   r)   r   typr   s        r   r   zCGenerator._generate_stmt  s   
 1gg-t((A-((""$$-t((A-((
E,ej%-5=	      DJJqMM)E11U^%%%
 ::a== UXKDJJqMM))DJJqMM)D00r   c                 4   d}|j         rd                    |j                   dz   }|j        r |d                    |j                  dz   z  }|j        r&||                     |j        d                   dz   z  }||                     |j                  z  }|S )z& Generation from a Decl node.
        r   r   r   )funcspecr$   r   alignr   r   r;   r   s      r   r   zCGenerator._generate_decl  s     :5388AJ//#5q94a388AI..44a75AAGAJ//#55A	T  (((r   Tc                    t          |          }|t          j        k    rd}|j        r |d                    |j                  dz   z  }||                     |j                   z  }|j        r	|r|j        nd}t          |          D ]\\  }}t          |t          j	                  r~|dk    r+t          ||dz
           t          j
                  rd|z   dz   }|dz  }|j        r |d                    |j                  dz   z  }||                     |j                  dz   z  }t          |t          j                  rV|dk    r+t          ||dz
           t          j
                  rd|z   dz   }|d|                     |j                  z   dz   z  }t          |t          j
                  r4|j        r(d	d                    |j                  |rd|z   nd}Wd
|z   }^|r|d|z   z  }|S |t          j        k    r|                     |j                   S |t          j        k    r|                     |j         |          S |t          j        k    rd                    |j                  dz   S |t          j	        t          j
        t          j        fv r!|                     |j         ||gz   |          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   r@   rA   r4   r5   z* rY   r   )r;   r   TypeDeclqualsr$   r   declname	enumeratera   	ArrayDeclPtrDecl	dim_qualsdimFuncDeclrB   r!  r   Typenamer   IdentifierTyperu   )	r
   r)   	modifiersr   r,  r   nstrimodifiers	            r   r   zCGenerator._generate_type  s    1gg %.  Aw4SXXag..44AF###A!"EE1::2D
  )33 * *8h88 *Q"9QU#3U]CC #&:#3DCKD) C); < <s BBDJJx|44s::DD%.99 
*Q"9QU#3U]CC #&:#3DC$**X]";";;cAADD%-88 *~ * *+.88HN+C+C+C9=+E3::2+E G  #Tz$Q#*_QHEJ&&qv...EN""&&qv}&MMME(((88AG$$s**U_emU^DDD&&qvyA37D ' F F F ::a== r   c                 V    |                      |          } ||          rd|z   dz   S |S )z Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r@   rA   )r|   )r
   r)   	conditionr   s       r   rh   zCGenerator._parenthesize_if  s:     Q9Q<< 	7S= Hr   c                 6                           | fd          S )z. Common use case for _parenthesize_if
        c                 0                         |            S r   )r`   )re   r
   s    r   rf   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>  s    d6J6J16M6M2M r   )rh   r(   s   ` r   r6   z&CGenerator._parenthesize_unless_simple  s%     $$Q(M(M(M(MNNNr   c                     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.
        )ra   r   r(  r  r&  r'  r%  r(   s     r   r`   zCGenerator._is_simple_node  s5     !eneh#ou~? @ @ 	@r   N)F)Cr   
__module____qualname____doc__r   r   r   r   r*   r.   r2   r9   r>   rD   rJ   rc   rm   rs   rv   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  r  r   r  r  r   r   r   rh   r6   r`   r   r   r   r   r      s        	5 	5 	5 	5' ' '? ? ?K K K      < < <3 3 35 5 50 0 0 	a 	a	
 	Q 	Q 	Q 	a q 	Q a a "&q 	a q 	Q Q 	Q Q Q N7 7 7:C C C! ! !! ! !       B B B+ + ++ + +@ @ @> > >  - - -	 	 	  J J J  B B B  
        	 	 	        
    < < <& & &  = = =+ + +< < <  & & &; ; ;; ; ;; ; ;  0F F FK K K1 1 1 1<   +-d 3! 3! 3! 3!j  O O O
@ @ @ @ @r   r   N)r   r   objectr   r   r   r   <module>rI     sa         j@ j@ j@ j@ j@ j@ j@ j@ j@ j@r   