
    YhlE                     &    d dl mZ  G d de      Zy)   )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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 Z0dJ Z1dK Z2dL Z3dM Z4dN Z5dO Z6dP Z7dQ Z8dR Z9dS Z:dT Z;dU Z<d^dVZ=dW Z>g dXfdYZ?dZ Z@d[ ZAd\ ZBy])_
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                      d| _         || _        y)z Constructs C-code generator

            reduce_parentheses:
                if True, eliminates needless parentheses on binary operators
            N)indent_levelreduce_parentheses)selfr	   s     f/var/www/django-portfolio.reubendavern.link/venv/lib/python3.12/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                 n    d|j                   j                  z   } t        | || j                        |      S )Nvisit_)	__class____name__getattrgeneric_visit)r
   nodemethods      r   visitzCGenerator.visit   s2    DNN3338wtVT%7%78>>r   c                 Z     |ydj                   fd|j                         D              S )N c              3   F   K   | ]  \  }}j                  |        y wNr   ).0c_namecr
   s      r   	<genexpr>z+CGenerator.generic_visit.<locals>.<genexpr>'   s     JYVQ4::a=Js   !)joinchildren)r
   r   s   ` r   r   zCGenerator.generic_visit#   s&    <77J$--/JJJr   c                     |j                   S r   )valuer
   ns     r   visit_ConstantzCGenerator.visit_Constant)   s    wwr   c                     |j                   S r   namer(   s     r   visit_IDzCGenerator.visit_ID,   s    vvr   c                 F    d}|j                   r|d|j                   z   z  }|S )Nz#pragmar   )string)r
   r)   rets      r   visit_PragmazCGenerator.visit_Pragma/   s%    883>!C
r   c                     | j                  |j                        }|dz   | j                  |j                        z   dz   S )N[])_parenthesize_unless_simpler-   r   	subscript)r
   r)   arrrefs      r   visit_ArrayRefzCGenerator.visit_ArrayRef5   s7    11!&&9|djj55;;r   c                     | j                  |j                        }||j                  z   | j                  |j                        z   S r   )r6   r-   typer   field)r
   r)   srefs      r   visit_StructRefzCGenerator.visit_StructRef9   s6    //7aff}tzz!''222r   c                     | j                  |j                        }|dz   | j                  |j                        z   dz   S )N())r6   r-   r   args)r
   r)   frefs      r   visit_FuncCallzCGenerator.visit_FuncCall=   s7    //7czDJJqvv..44r   c                    |j                   dk(  rd| j                  |j                        z  S | j                  |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   sw    448  $**QVV"44466qvv>Gttu}''''!"w//r   z||r   z&&r   |   ^   &   z==   z!=>   z>=<z<=z>>   z<<+   -*	   /%c                       j                  j                   fd      } j                  j                   fd      }|dj                  d|S )Nc                     j                  |       xs] j                  xrO t        | t        j                        xr3 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   sf    4//2 M-- M*Q2O M))!$$/43F3Fqtt3LLN r   c                     j                  |       xs] j                  xrO t        | t        j                        xr3 j
                  | j                     j
                  j                     kD   S r   r_   rd   s    r   rf   z+CGenerator.visit_BinaryOp.<locals>.<lambda>w   sf    4//2 L-- L*Q2O L))!$$/$2E2Eadd2KKM r   r   )_parenthesize_ifleftrightrG   )r
   r)   lval_strrval_strs   ``  r   visit_BinaryOpzCGenerator.visit_BinaryOp_   sV     ((FFNO ((GGMN
 &qttX66r   c                     | j                  |j                  d       }| j                  |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E4D4D&E r   r   )rh   rvaluer   lvaluerG   )r
   r)   rl   s      r   visit_AssignmentzCGenerator.visit_Assignment|   s=    ((HHEG "ZZ1144BBr   c                 8    dj                  |j                        S r   )r$   namesr(   s     r   visit_IdentifierTypezCGenerator.visit_IdentifierType   s    xx  r   c                     t        |t        j                        rd| j                  |      z   dz   S t        |t        j                        rd| j                  |      z   dz   S | j                  |      S )N{}r@   rA   )ra   r   InitListr   ExprListr(   s     r   _visit_exprzCGenerator._visit_expr   s\    a(A&,,5>>*A&,,::a= r   c                     |r|j                   n| j                  |      }|j                  r!|d| j                  |j                        z   z  }|j                  r!|d| j                  |j                        z   z  }|S )Nz :  = )r-   _generate_declbitsizer   initr|   )r
   r)   no_typess       r   
visit_DeclzCGenerator.visit_Decl   sh     AFF4#6#6q#999a54::aii#888a66))!&&111Ar   c                       j                  |j                  d         }t        |j                        dkD  r-|ddj                   fd|j                  dd  D              z   z  }|S )Nr   r   , c              3   D   K   | ]  }j                  |d         yw)T)r   N)r   r    declr
   s     r   r#   z,CGenerator.visit_DeclList.<locals>.<genexpr>   s&      "=(, #'//$/"E "=s    )r   declslenr$   r
   r)   r   s   `  r   visit_DeclListzCGenerator.visit_DeclList   sa    JJqwwqz"qww<!		 "=01"= = = =Ar   c                     d}|j                   r!|dj                  |j                         dz   z  }|| j                  |j                        z  }|S )Nr   r   )storager$   _generate_typer;   r   s      r   visit_TypedefzCGenerator.visit_Typedef   sG    99a388AII.44a	T  ((r   c                     d| j                  |j                  d      z   dz   }|dz   | j                  |j                        z   S )Nr@   Femit_declnamerA   r   )r   to_typer6   rH   r   s      r   
visit_CastzCGenerator.visit_Cast   sC    $%%aiiu%EEK3w99!&&AAAr   c                     g }|j                   D ]"  }|j                  | j                  |             $ dj                  |      S Nr   exprsappendr|   r$   r
   r)   visited_subexprsrH   s       r   visit_ExprListzCGenerator.visit_ExprList   D    GG 	<D##D$4$4T$:;	<yy)**r   c                     g }|j                   D ]"  }|j                  | j                  |             $ dj                  |      S r   r   r   s       r   visit_InitListzCGenerator.visit_InitList   r   r   c                 (    | j                  |d      S )Nenumr,   _generate_struct_union_enumr(   s     r   
visit_EnumzCGenerator.visit_Enum   s    ///??r   c                 V    dj                  | j                  |j                              S )Nz_Alignas({}))formatr   	alignmentr(   s     r   visit_AlignaszCGenerator.visit_Alignas   s     $$TZZ%<==r   c                     |j                   s+dj                  | j                         |j                        S dj                  | j                         |j                  | 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   sq    ww&--((*VV .  
 177((*VVjj) 8  r   c                      j                  |j                        }d _         j                  |j                        }|j                  r5dj                   fd|j                  D              }|dz   |z   dz   |z   dz   S |dz   |z   dz   S )Nr   ;
c              3   @   K   | ]  }j                  |        y wr   r   )r    pr
   s     r   r#   z+CGenerator.visit_FuncDef.<locals>.<genexpr>   s     !GA$**Q-!G   
)r   r   r   bodyparam_declsr$   )r
   r)   r   r   knrdeclss   `    r   visit_FuncDefzCGenerator.visit_FuncDef   s    zz!&&!zz!&&!==zz!G!GGH$;)E1D84??$;%,,r   c                    d}|j                   D ]z  }t        |t        j                        r|| j	                  |      z  }2t        |t        j
                        r|| j	                  |      dz   z  }d|| j	                  |      dz   z  }| |S )Nr   r   r   )extra   r   FuncDefr   Pragma)r
   r)   r   r   s       r   visit_FileASTzCGenerator.visit_FileAST   s}    55 	-C#u}}-TZZ_$C.TZZ_t++TZZ_u,,	- r   c                      j                         dz   } xj                  dz  c_        |j                  r'|dj                   fd|j                  D              z  } xj                  dz  c_        | j                         dz   z  }|S )N{
rL   r   c              3   @   K   | ]  }j                  |        y wr   _generate_stmt)r    stmtr
   s     r   r#   z,CGenerator.visit_Compound.<locals>.<genexpr>   s     Mt,,T2Mr   z}
)r   r   block_itemsr$   r   s   `  r   visit_CompoundzCGenerator.visit_Compound   sy    %'Q==Mq}}MMMAQ	T 5((r   c                     d| j                  |j                        z   dz   | j                  |j                        z   dz   S )Nr@   z){ry   )r   r;   r   r(   s     r   visit_CompoundLiteralz CGenerator.visit_CompoundLiteral   s6    TZZ''$.AFF1CCcIIr   c                      y)N; r(   s     r   visit_EmptyStatementzCGenerator.visit_EmptyStatement   s    r   c                 L     dj                   fd|j                  D              S )Nr   c              3   @   K   | ]  }j                  |        y wr   r   )r    paramr
   s     r   r#   z-CGenerator.visit_ParamList.<locals>.<genexpr>   s     AuE*Ar   )r$   paramsr(   s   ` r   visit_ParamListzCGenerator.visit_ParamList   s    yyAAAAr   c                 j    d}|j                   r!|d| j                  |j                         z   z  }|dz   S )Nreturnr   r   )rH   r   r   s      r   visit_ReturnzCGenerator.visit_Return   s2    661djj00013wr   c                      y)Nzbreak;r   r(   s     r   visit_BreakzCGenerator.visit_Break   s    r   c                      y)Nz	continue;r   r(   s     r   visit_ContinuezCGenerator.visit_Continue   s    r   c                     d| j                  |j                        z   dz   }|d| j                  |j                        z   dz   z  }|d| j                  |j                        z   dz   z  }|S )Nr@   z) ? z) : rA   )r|   condiftrueiffalser   s      r   visit_TernaryOpzCGenerator.visit_TernaryOp   sk    4##AFF++f4	S4##AHH--66	S4##AII..44r   c                 ,   d}|j                   r|| j                  |j                         z  }|dz  }|| j                  |j                  d      z  }|j                  r6|| j                         dz   z  }|| j                  |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    661

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

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

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

166**1	T	r   c                     d}|| j                  |j                        z  }|j                  r#|dz  }|| j                  |j                        z  }|dz  }|S )Nz_Static_assert(,rA   )r   r   messager   s      r   visit_StaticAssertzCGenerator.visit_StaticAssert$  sS    	TZZ99HAAII&&A	Sr   c                     d| j                  |j                        z   dz   }|| j                  |j                  d      z  }|S )Nzswitch (r   Tr   )r   r   r   r   r   s      r   visit_SwitchzCGenerator.visit_Switch-  sA    AFF++e3	T  D 99r   c                     d| j                  |j                        z   dz   }|j                  D ]  }|| j                  |d      z  } |S )Nzcase :
Tr   )r   rH   stmtsr   r
   r)   r   r   s       r   
visit_CasezCGenerator.visit_Case2  sP    djj((50GG 	<D$$Td$;;A	<r   c                 X    d}|j                   D ]  }|| j                  |d      z  } |S )Nz	default:
Tr   )r   r   r   s       r   visit_DefaultzCGenerator.visit_Default8  s9    GG 	<D$$Td$;;A	<r   c                 X    |j                   dz   | j                  |j                        z   S )Nr   )r-   r   r   r(   s     r   visit_LabelzCGenerator.visit_Label>  s$    vv~ 3 3AFF ;;;r   c                 &    d|j                   z   dz   S )Nzgoto r   r,   r(   s     r   
visit_GotozCGenerator.visit_GotoA  s    #%%r   c                      y)Nz...r   r(   s     r   visit_EllipsisParamzCGenerator.visit_EllipsisParamD  s    r   c                 &    | j                  |d      S )Nstructr   r(   s     r   visit_StructzCGenerator.visit_StructG  s    //8<<r   c                 8    | j                  |j                        S r   )r   r;   r(   s     r   visit_TypenamezCGenerator.visit_TypenameJ  s    ""166**r   c                 &    | j                  |d      S )Nunionr   r(   s     r   visit_UnionzCGenerator.visit_UnionM  s    //7;;r   c                     d}|j                   D ]I  }t        |t        j                        r|d|j                   z   z  }0|d| j	                  |      z   dz   z  }K |d| j                  |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|    FF 	2D$)S499_$S4::d++c11		2
 	
UT%%aff---r   c                 $    | j                  |      S r   r   r(   s     r   visit_FuncDeclzCGenerator.visit_FuncDeclZ  s    ""1%%r   c                 (    | j                  |d      S NFr   r	  r(   s     r   visit_ArrayDeclzCGenerator.visit_ArrayDecl]      ""1E"::r   c                 (    | j                  |d      S r  r	  r(   s     r   visit_TypeDeclzCGenerator.visit_TypeDecl`  r  r   c                 (    | j                  |d      S r  r	  r(   s     r   visit_PtrDeclzCGenerator.visit_PtrDeclc  r  r   c                    |dv r|j                   }| j                  }n7|dk(  sJ |j                  dn|j                  j                  }| j                  }|dz   |j
                  xs dz   }|h|dz  }|| j                         z  }| xj                  dz  c_        |dz  }| ||      z  }| xj                  dz  c_        || j                         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     &&ggG <<M6>!>hh.dAHH4H4HG 44M3J!&&,B' IA""$$A"JAw''A"""$s**Ar   c                 8     dj                   fd|D              S )Nr   c              3   @   K   | ]  }j                  |        y wr   r   r   s     r   r#   z9CGenerator._generate_struct_union_body.<locals>.<genexpr>  s     ETt**40Er   r$   r
   r  s   ` r   r  z&CGenerator._generate_struct_union_body~  s    wwEWEEEr   c                 D     dj                   fd|D              d d dz   S )Nr   c              3   @   K   | ]  }j                  |        y w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  s$    ww>g>>sCdJJr   c                    t        |      }|r| xj                  dz  c_        | j                         }|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|| j#                  |      z   dz   S |t        j$                  fv r| j#                  |      S |t        j&                  fv r|| j#                  |      z   S || j#                  |      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   
 1gt((A-(""$t((A-(

E,,ejj%--5==	    DJJqM)E11U^^%%
 ::a= UXXKDJJqM))DJJqM)D00r   c                 T   d}|j                   rdj                  |j                         dz   }|j                  r!|dj                  |j                        dz   z  }|j                  r$|| j	                  |j                  d         dz   z  }|| j                  |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     ::388AJJ/#5q99a388AII.44a77AAGGAJ/#55A	T  ((r   Tc                    t        |      }|t        j                  k(  rd}|j                  r!|dj	                  |j                        dz   z  }|| j                  |j                         z  }|j                  r|r|j                  nd}t        |      D ]d  \  }}t        |t        j                        r|dk7  r(t        ||dz
     t        j                        rd|z   dz   }|dz  }|j                  r!|dj	                  |j                        dz   z  }|| j                  |j                        dz   z  }t        |t        j                        rS|dk7  r(t        ||dz
     t        j                        rd|z   dz   }|d| j                  |j                        z   dz   z  }t        |t        j                        s+|j                  r)d	dj	                  |j                        |rd|z   nd}`d
|z   }g |r|d|z   z  }|S |t        j                  k(  r| j!                  |j                         S |t        j"                  k(  r| j%                  |j                   |      S |t        j&                  k(  rdj	                  |j(                        dz   S |t        j                  t        j                  t        j                  fv r"| j%                  |j                   ||gz   |      S | j                  |      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    1g %.. AwwSXXagg.44AFF##A!"1::2D
  )3 *8h8Q"9QU#3U]]C#&:#3DCKD)));); <s BBDJJx||4s::D%..9Q"9QU#3U]]C#&:#3DC$**X]]";;cAAD%--8~~+.88HNN+C9=3:2+E G  #Tz'*( Q#*_QHEJJ&&qvv..ENN"&&qvv}&MME(((88AGG$s**U__emmU^^DD&&qvvyA37D ' F F ::a= r   c                 H    | j                  |      } ||      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Q<7S= Hr   c                 .      j                  | fd      S )z. Common use case for _parenthesize_if
        c                 (    j                  |        S r   )r`   )re   r
   s    r   rf   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>  s    d6J6J16M2M r   )rh   r(   s   ` r   r6   z&CGenerator._parenthesize_unless_simple  s     $$Q(M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  s9     !ennehh#oou~~? @ 	@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'?K<350 	a 	a	
 	Q 	Q 	Q 	a q 	Q a a "&q 	a q 	Q Q 	Q Q QN7:C!!B++@>-	JB
	
<&=+<&;;;0FK1< +-d 3!jO
@r   r   N)r   r   objectr   r   r   r   <module>rJ     s    j@ j@r   