????

Your IP : 3.15.3.240


Current Path : /lib/python3.9/site-packages/pycparser/__pycache__/
Upload File :
Current File : //lib/python3.9/site-packages/pycparser/__pycache__/c_generator.cpython-39.pyc

a

��_^<�@s ddlmZGdd�de�ZdS)�)�c_astc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd}d!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;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;gdsfdtdu�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.
    cCs
d|_dS)N���indent_level��self�r	�9/usr/lib/python3.9/site-packages/pycparser/c_generator.py�__init__szCGenerator.__init__cCs
d|jS�N� rrr	r	r
�_make_indentszCGenerator._make_indentcCsd|jj}t|||j�|�S)NZvisit_)�	__class__�__name__�getattr�
generic_visit)r�node�methodr	r	r
�visitszCGenerator.visitcs,|durdSd��fdd�|��D��SdS)N�c3s|]\}}��|�VqdS�N�r)�.0Zc_name�crr	r
�	<genexpr>#�z+CGenerator.generic_visit.<locals>.<genexpr>)�joinZchildren)rrr	rr
rszCGenerator.generic_visitcCs|jSr)�value�r�nr	r	r
�visit_Constant%szCGenerator.visit_ConstantcCs|jSr��namerr	r	r
�visit_ID(szCGenerator.visit_IDcCsd}|jr|d|j7}|S)Nz#pragmar
)�string)rr �retr	r	r
�visit_Pragma+szCGenerator.visit_PragmacCs$|�|j�}|d|�|j�dS)N�[�])�_parenthesize_unless_simpler#rZ	subscript)rr Zarrrefr	r	r
�visit_ArrayRef1szCGenerator.visit_ArrayRefcCs"|�|j�}||j|�|j�Sr)r*r#�typerZfield)rr Zsrefr	r	r
�visit_StructRef5szCGenerator.visit_StructRefcCs$|�|j�}|d|�|j�dS)N�(�))r*r#r�args)rr Zfrefr	r	r
�visit_FuncCall9szCGenerator.visit_FuncCallcCs\|�|j�}|jdkrd|S|jdkr0d|S|jdkrJd|�|j�Sd|j|fSdS)Nzp++z%s++zp--z%s--Zsizeofz
sizeof(%s)z%s%s)r*�expr�opr)rr �operandr	r	r
�
visit_UnaryOp=s


zCGenerator.visit_UnaryOpcs<��|j�fdd��}��|j�fdd��}d||j|fS)Ncs��|�Sr��_is_simple_node��drr	r
�<lambda>Lrz+CGenerator.visit_BinaryOp.<locals>.<lambda>cs��|�Srr6r8rr	r
r:Nr�%s %s %s)�_parenthesize_if�left�rightr3)rr Zlval_str�rval_strr	rr
�visit_BinaryOpJs
�
�zCGenerator.visit_BinaryOpcCs*|�|jdd��}d|�|j�|j|fS)NcSst|tj�Sr)�
isinstancer�
Assignment)r r	r	r
r:Trz-CGenerator.visit_Assignment.<locals>.<lambda>r;)r<ZrvaluerZlvaluer3)rr r?r	r	r
�visit_AssignmentQs
�zCGenerator.visit_AssignmentcCsd�|j�Sr)r�namesrr	r	r
�visit_IdentifierTypeWszCGenerator.visit_IdentifierTypecCsJt|tj�rd|�|�dSt|tj�r<d|�|�dS|�|�SdS)N�{�}r.r/)rArZInitListr�ExprListrr	r	r
�_visit_exprZs
zCGenerator._visit_exprFcCsL|r
|jn|�|�}|jr.|d|�|j�7}|jrH|d|�|j�7}|S)Nz : � = )r#�_generate_declZbitsizer�initrI)rr �no_type�sr	r	r
�
visit_Declbs
zCGenerator.visit_DeclcsL��|jd�}t|j�dkrH|dd��fdd�|jdd�D��7}|S)Nrr�, c3s|]}�j|dd�VqdS)T)rMN)rO�r�declrr	r
ros�z,CGenerator.visit_DeclList.<locals>.<genexpr>)r�decls�lenr�rr rNr	rr
�visit_DeclListls�zCGenerator.visit_DeclListcCs2d}|jr|d�|j�d7}||�|j�7}|S)Nrr
)�storager�_generate_typer,rUr	r	r
�
visit_TypedefsszCGenerator.visit_TypedefcCs,d|j|jdd�d}|d|�|j�S)Nr.F��
emit_declnamer/r
)rXZto_typer*r2rUr	r	r
�
visit_CastyszCGenerator.visit_CastcCs*g}|jD]}|�|�|��q
d�|�S�NrP�Zexprs�appendrIr�rr Zvisited_subexprsr2r	r	r
�visit_ExprList}s
zCGenerator.visit_ExprListcCs*g}|jD]}|�|�|��q
d�|�Sr]r^r`r	r	r
�visit_InitList�s
zCGenerator.visit_InitListcCs|j|dd�S)N�enumr"��_generate_struct_union_enumrr	r	r
�
visit_Enum�szCGenerator.visit_EnumcCs<|jsdj|��|jd�Sdj|��|j|�|j�d�SdS)Nz{indent}{name},
)�indentr#z{indent}{name} = {value},
)rgr#r)r�formatrr#rrr	r	r
�visit_Enumerator�s�
�zCGenerator.visit_Enumeratorcsj��|j�}d�_��|j�}|jrVd��fdd�|jD��}|d|d|dS|d|dSdS)Nr�;
c3s|]}��|�VqdSrr)r�prr	r
r�rz+CGenerator.visit_FuncDef.<locals>.<genexpr>�
)rrRr�bodyZparam_declsr)rr rRrmZknrdeclsr	rr
�
visit_FuncDef�szCGenerator.visit_FuncDefcCsbd}|jD]R}t|tj�r*||�|�7}q
t|tj�rJ||�|�d7}q
||�|�d7}q
|S)Nrrlrj)�extrArZFuncDefrZPragma)rr rNror	r	r
�
visit_FileAST�s
zCGenerator.visit_FileASTcs`���d}�jd7_|jr>|d��fdd�|jD��7}�jd8_|���d7}|S)N�{
�rc3s|]}��|�VqdSr��_generate_stmt)r�stmtrr	r
r�rz,CGenerator.visit_Compound.<locals>.<genexpr>z}
)rrZblock_itemsrrUr	rr
�visit_Compound�szCGenerator.visit_CompoundcCs$d|�|j�d|�|j�dS)Nr.z){rG)rr,rLrr	r	r
�visit_CompoundLiteral�sz CGenerator.visit_CompoundLiteralcCsdS)N�;r	rr	r	r
�visit_EmptyStatement�szCGenerator.visit_EmptyStatementcsd��fdd�|jD��S)NrPc3s|]}��|�VqdSrr)rZparamrr	r
r�rz-CGenerator.visit_ParamList.<locals>.<genexpr>)r�paramsrr	rr
�visit_ParamList�szCGenerator.visit_ParamListcCs&d}|jr|d|�|j�7}|dS)N�returnr
rx)r2rrUr	r	r
�visit_Return�szCGenerator.visit_ReturncCsdS)Nzbreak;r	rr	r	r
�visit_Break�szCGenerator.visit_BreakcCsdS)Nz	continue;r	rr	r	r
�visit_Continue�szCGenerator.visit_ContinuecCsHd|�|j�d}|d|�|j�d7}|d|�|j�d7}|S)Nr.z) ? z) : r/)rI�cond�iftrue�iffalserUr	r	r
�visit_TernaryOp�szCGenerator.visit_TernaryOpcCsdd}|jr||�|j�7}|d7}||j|jdd�7}|jr`||��d7}||j|jdd�7}|S)Nzif (�)
T��
add_indentzelse
)r�rrtr�r�rrUr	r	r
�visit_If�szCGenerator.visit_IfcCs~d}|jr||�|j�7}|d7}|jr<|d|�|j�7}|d7}|jr^|d|�|j�7}|d7}||j|jdd�7}|S)Nzfor (rxr
r�Tr�)rLrr��nextrtrurUr	r	r
�	visit_For�szCGenerator.visit_ForcCs:d}|jr||�|j�7}|d7}||j|jdd�7}|S)N�while (r�Tr�)r�rrtrurUr	r	r
�visit_While�s
zCGenerator.visit_WhilecCsJd}||j|jdd�7}||��d7}|jr>||�|j�7}|d7}|S)Nzdo
Tr�r�z);)rtrurr�rrUr	r	r
�
visit_DoWhile�szCGenerator.visit_DoWhilecCs,d|�|j�d}||j|jdd�7}|S)Nzswitch (r�Tr�)rr�rtrurUr	r	r
�visit_Switch�szCGenerator.visit_SwitchcCs6d|�|j�d}|jD]}||j|dd�7}q|S)Nzcase �:
Tr�)rr2�stmtsrt�rr rNrur	r	r
�
visit_Case�s
zCGenerator.visit_CasecCs&d}|jD]}||j|dd�7}q
|S)Nz	default:
Tr�)r�rtr�r	r	r
�
visit_Defaults
zCGenerator.visit_DefaultcCs|jd|�|j�S)Nr�)r#rtrurr	r	r
�visit_LabelszCGenerator.visit_LabelcCsd|jdS)Nzgoto rxr"rr	r	r
�
visit_Goto
szCGenerator.visit_GotocCsdS)Nz...r	rr	r	r
�visit_EllipsisParam
szCGenerator.visit_EllipsisParamcCs|�|d�S)N�structrdrr	r	r
�visit_StructszCGenerator.visit_StructcCs|�|j�Sr)rXr,rr	r	r
�visit_TypenameszCGenerator.visit_TypenamecCs|�|d�S)N�unionrdrr	r	r
�visit_UnionszCGenerator.visit_UnioncCsZd}|jD]6}t|tj�r*|d|j7}q
|d|�|�d7}q
|d|�|j�7}|S)Nr�.r(r)rJ)r#rAr�IDrrIr2)rr rNr#r	r	r
�visit_NamedInitializers
z!CGenerator.visit_NamedInitializercCs
|�|�Sr�rXrr	r	r
�visit_FuncDecl#szCGenerator.visit_FuncDeclcCs|j|dd�S�NFrZr�rr	r	r
�visit_ArrayDecl&szCGenerator.visit_ArrayDeclcCs|j|dd�Sr�r�rr	r	r
�visit_TypeDecl)szCGenerator.visit_TypeDeclcCs|j|dd�Sr�r�rr	r	r
�
visit_PtrDecl,szCGenerator.visit_PtrDeclcCs�|dvr|j}|j}n(|dks"J�|jdur0dn|jj}|j}|d|jpLd}|dur�|d7}||��7}|jd7_|d7}|||�7}|jd8_||��d	7}|S)
zq Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        )r�r�rcNr
rrlrrrqrG)rS�_generate_struct_union_body�valuesZenumerators�_generate_enum_bodyr#rr)rr r#�membersZ
body_functionrNr	r	r
re/s z&CGenerator._generate_struct_union_enumcsd��fdd�|D��S)Nrc3s|]}��|�VqdSrrsrQrr	r
rHrz9CGenerator._generate_struct_union_body.<locals>.<genexpr>�r�rr�r	rr
r�Gsz&CGenerator._generate_struct_union_bodycs$d��fdd�|D��dd�dS)Nrc3s|]}��|�VqdSrr)rrrr	r
rLrz1CGenerator._generate_enum_body.<locals>.<genexpr>���rlr�r�r	rr
r�JszCGenerator._generate_enum_bodycCs�t|�}|r|jd7_|��}|r4|jd8_|tjtjtjtjtjtj	tj
tjtjtj
tjtjtjf
vr�||�|�dS|tjfvr�|�|�S||�|�dSdS)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.
        rrrjrlN)r,rrr�DeclrBZCastZUnaryOpZBinaryOpZ	TernaryOp�FuncCall�ArrayRef�	StructRef�Constantr�ZTypedefrHrZCompound)rr r��typrgr	r	r
rtNs�
zCGenerator._generate_stmtcCsHd}|jrd�|j�d}|jr4|d�|j�d7}||�|j�7}|S)z& Generation from a Decl node.
        rr
)ZfuncspecrrWrXr,rUr	r	r
rKjs
zCGenerator._generate_declTc	Cst|�}|tjk�r�d}|jr2|d�|j�d7}||�|j�7}|jrR|rR|jnd}t|�D�]\}}t|tj	�r�|dkr�t||dtj
�r�d|d}|d7}|jr�|d�|j�d7}||�|j�d7}q^t|tj
��r(|dk�rt||dtj
��rd|d}|d|�|j�d7}q^t|tj
�r^|j�r`d	d�|j�|�rVd|ndf}q^d
|}q^|�r||d|7}|S|tjk�r�|�|j�S|tjk�r�|j|j|d�S|tjk�r�d�|j�dS|tj	tj
tj
fv�r�|j|j||g|d�S|�|�Sd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.
        rr
rrr.r/r(r)z* %s%s�*rZN)r,rZTypeDeclZqualsrrZdeclname�	enumeraterAZ	ArrayDeclZPtrDeclZ	dim_qualsZdimZFuncDeclr0r�rKZTypenamerXZIdentifierTyperD)	rr �	modifiersr[r�rNZnstr�i�modifierr	r	r
rXssR�
��
�zCGenerator._generate_typecCs&|�|�}||�rd|dS|SdS)z� Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r.r/N)rI)rr Z	conditionrNr	r	r
r<�s
zCGenerator._parenthesize_ifcs��|�fdd��S)z. Common use case for _parenthesize_if
        cs��|�Srr6r8rr	r
r:�rz8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)r<rr	rr
r*�sz&CGenerator._parenthesize_unless_simplecCst|tjtjtjtjtjf�S)z~ Returns True for nodes that are "simple" - i.e. nodes that always
            have higher precedence than operators.
        )rArr�r�r�r�r�rr	r	r
r7�s�zCGenerator._is_simple_nodeN)F)F)@r�
__module__�__qualname__�__doc__rrrrr!r$r'r+r-r1r5r@rCrErIrOrVrYr\rarbrfrirnrprvrwryr{r}r~rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rer�r�rtrKrXr<r*r7r	r	r	r
rsz




	


	5
rN)rr�objectrr	r	r	r
�<module>	s