a ‚oelEã@s ddlmZGdd„deƒZdS)é)Úc_astc@s6eZdZdZdŒdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdddddddddddd d d!d!d"d"d"d#œZd$d%„Zd&d'„Zd(d)„Zd*d+„Zdd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Zd@dA„ZdBdC„ZdDdE„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}„Zgd‚fdƒ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. FcCsd|_||_dS)z“ Constructs C-code generator reduce_parentheses: if True, eliminates needless parentheses on binary operators éN)Ú indent_levelÚreduce_parentheses)Úselfr©rú6C:\Program Files\Certbot\pkgs\pycparser\c_generator.pyÚ__init__szCGenerator.__init__cCs d|jS©Nú )r©rrrr Ú _make_indentszCGenerator._make_indentcCsd|jj}t|||jƒ|ƒS)NZvisit_)Ú __class__Ú__name__ÚgetattrÚ generic_visit)rÚnodeÚmethodrrr Úvisits zCGenerator.visitcs,|dur dSd ‡fdd„| ¡Dƒ¡SdS)NÚc3s|]\}}ˆ |¡VqdS©N©r)Ú.0Zc_nameÚcr rr Ú 'óz+CGenerator.generic_visit..)ÚjoinZchildren)rrrr r r#szCGenerator.generic_visitcCs|jSr)Úvalue©rÚnrrr Úvisit_Constant)szCGenerator.visit_ConstantcCs|jSr©Únamerrrr Úvisit_ID,szCGenerator.visit_IDcCsd}|jr|d|j7}|S)Nz#pragmar )Ústring)rr Úretrrr Ú visit_Pragma/szCGenerator.visit_PragmacCs$| |j¡}|d| |j¡dS)Nú[ú])Ú_parenthesize_unless_simpler#rZ subscript)rr Zarrrefrrr Úvisit_ArrayRef5s zCGenerator.visit_ArrayRefcCs"| |j¡}||j| |j¡Sr)r*r#ÚtyperZfield)rr Zsrefrrr Úvisit_StructRef9s zCGenerator.visit_StructRefcCs$| |j¡}|d| |j¡dS)Nú(ú))r*r#rÚargs)rr Zfrefrrr Úvisit_FuncCall=s zCGenerator.visit_FuncCallcCs\|jdkrd| |j¡S| |j¡}|jdkr8d|S|jdkrJd|Sd|j|fSdS)NZsizeofz sizeof(%s)zp++z%s++zp--z%s--z%s%s)ÚoprÚexprr*)rr Úoperandrrr Ú visit_UnaryOpAs    zCGenerator.visit_UnaryOprréééééééé )z||z&&ú|ú^ú&z==z!=ú>z>=ú>z<<ú+ú-Ú*ú/ú%cs@ˆ ˆj‡‡fdd„¡}ˆ ˆj‡‡fdd„¡}d|ˆj|fS)Ncs6ˆ |¡p2ˆjo2t|tjƒo2ˆj|jˆjˆjk Sr©Ú_is_simple_noderÚ isinstancerÚBinaryOpÚprecedence_mapr2©Úd©r rrr Úks þz+CGenerator.visit_BinaryOp..cs6ˆ |¡p2ˆjo2t|tjƒo2ˆj|jˆjˆjk SrrHrMrOrr rPws þú%s %s %s)Ú_parenthesize_ifÚleftÚrightr2)rr Zlval_strÚrval_strrrOr Úvisit_BinaryOp_s  þ  þzCGenerator.visit_BinaryOpcCs*| |jdd„¡}d| |j¡|j|fS)NcSs t|tjƒSr)rJrÚ Assignment)r rrr rPrz-CGenerator.visit_Assignment..rQ)rRZrvaluerZlvaluer2)rr rUrrr Úvisit_Assignment|s þzCGenerator.visit_AssignmentcCs d |j¡Sr )rÚnamesrrrr Úvisit_IdentifierType‚szCGenerator.visit_IdentifierTypecCsJt|tjƒrd| |¡dSt|tjƒr.)rÚdeclsÚlenr©rr rcrr r Úvisit_DeclList—s  ÿ zCGenerator.visit_DeclListcCs2d}|jr|d |j¡d7}|| |j¡7}|S)Nrr )ÚstoragerÚ_generate_typer,rjrrr Ú visit_TypedefžszCGenerator.visit_TypedefcCs,d|j|jddd}|d| |j¡S)Nr.F©Ú emit_declnamer/r )rmZto_typer*r3rjrrr Ú visit_Cast¤szCGenerator.visit_CastcCs*g}|jD]}| | |¡¡q d |¡S©Nre©ZexprsÚappendr^r©rr Zvisited_subexprsr3rrr Úvisit_ExprList¨s zCGenerator.visit_ExprListcCs*g}|jD]}| | |¡¡q d |¡Srrrsrurrr Úvisit_InitList®s zCGenerator.visit_InitListcCs|j|ddS)NÚenumr"©Ú_generate_struct_union_enumrrrr Ú visit_Enum´szCGenerator.visit_EnumcCsd | |j¡¡S)Nz _Alignas({}))ÚformatrZ alignmentrrrr Ú visit_Alignas·szCGenerator.visit_AlignascCs<|jsdj| ¡|jdSdj| ¡|j| |j¡dSdS)Nz{indent}{name}, )Úindentr#z{indent}{name} = {value}, )r~r#r)rr|rr#rrrrr Úvisit_Enumeratorºsþ ýzCGenerator.visit_Enumeratorcsjˆ |j¡}dˆ_ˆ |j¡}|jrVd ‡fdd„|jDƒ¡}|d|d|dS|d|dSdS)Nrú; c3s|]}ˆ |¡VqdSrr)rÚpr rr rÌrz+CGenerator.visit_FuncDef..Ú )rrgrÚbodyZ param_declsr)rr rgrƒZknrdeclsrr r Ú visit_FuncDefÇs  zCGenerator.visit_FuncDefcCsbd}|jD]R}t|tjƒr*|| |¡7}q t|tjƒrJ|| |¡d7}q || |¡d7}q |S)Nrr‚r€)ÚextrJrZFuncDefrZPragma)rr rcr…rrr Ú visit_FileASTÑs   zCGenerator.visit_FileASTcs`ˆ ¡d}ˆjd7_|jr>|d ‡fdd„|jDƒ¡7}ˆjd8_|ˆ ¡d7}|S)Nú{ r6rc3s|]}ˆ |¡VqdSr©Ú_generate_stmt)rÚstmtr rr ràrz,CGenerator.visit_Compound..z} )rrZ block_itemsrrjrr r Úvisit_CompoundÜs zCGenerator.visit_CompoundcCs$d| |j¡d| |j¡dS)Nr.z){r\)rr,rarrrr Úvisit_CompoundLiteralåsz CGenerator.visit_CompoundLiteralcCsdS)Nú;rrrrr Úvisit_EmptyStatementészCGenerator.visit_EmptyStatementcsd ‡fdd„|jDƒ¡S)Nrec3s|]}ˆ |¡VqdSrr)rZparamr rr rírz-CGenerator.visit_ParamList..)rÚparamsrrr r Úvisit_ParamListìszCGenerator.visit_ParamListcCs&d}|jr|d| |j¡7}|dS)NÚreturnr r)r3rrjrrr Ú visit_ReturnïszCGenerator.visit_ReturncCsdS)Nzbreak;rrrrr Ú visit_BreakôszCGenerator.visit_BreakcCsdS)Nz continue;rrrrr Úvisit_Continue÷szCGenerator.visit_ContinuecCsHd| |j¡d}|d| |j¡d7}|d| |j¡d7}|S)Nr.z) ? z) : r/)r^ÚcondÚiftrueÚiffalserjrrr Úvisit_TernaryOpúszCGenerator.visit_TernaryOpcCsdd}|jr|| |j¡7}|d7}||j|jdd7}|jr`|| ¡d7}||j|jdd7}|S)Nzif (ú) T©Ú add_indentzelse )r•rr‰r–r—rrjrrr Úvisit_IfszCGenerator.visit_IfcCs~d}|jr|| |j¡7}|d7}|jr<|d| |j¡7}|d7}|jr^|d| |j¡7}|d7}||j|jdd7}|S)Nzfor (rr r™Trš)rarr•Únextr‰rŠrjrrr Ú visit_For szCGenerator.visit_ForcCs:d}|jr|| |j¡7}|d7}||j|jdd7}|S)Núwhile (r™Trš)r•rr‰rŠrjrrr Ú visit_Whiles zCGenerator.visit_WhilecCsJd}||j|jdd7}|| ¡d7}|jr>|| |j¡7}|d7}|S)Nzdo TršrŸz);)r‰rŠrr•rrjrrr Ú visit_DoWhiles zCGenerator.visit_DoWhilecCs>d}|| |j¡7}|jr2|d7}|| |j¡7}|d7}|S)Nz_Static_assert(ú,r/)rr•Úmessagerjrrr Úvisit_StaticAssert$szCGenerator.visit_StaticAssertcCs,d| |j¡d}||j|jdd7}|S)Nzswitch (r™Trš)rr•r‰rŠrjrrr Ú visit_Switch-szCGenerator.visit_SwitchcCs6d| |j¡d}|jD]}||j|dd7}q|S)Nzcase ú: Trš)rr3Ústmtsr‰©rr rcrŠrrr Ú visit_Case2s zCGenerator.visit_CasecCs&d}|jD]}||j|dd7}q |S)Nz default: Trš)r§r‰r¨rrr Ú visit_Default8s zCGenerator.visit_DefaultcCs|jd| |j¡S)Nr¦)r#r‰rŠrrrr Ú visit_Label>szCGenerator.visit_LabelcCsd|jdS)Nzgoto rr"rrrr Ú visit_GotoAszCGenerator.visit_GotocCsdS)Nz...rrrrr Úvisit_EllipsisParamDszCGenerator.visit_EllipsisParamcCs | |d¡S)NÚstructryrrrr Ú visit_StructGszCGenerator.visit_StructcCs | |j¡Sr)rmr,rrrr Úvisit_TypenameJszCGenerator.visit_TypenamecCs | |d¡S)NÚunionryrrrr Ú visit_UnionMszCGenerator.visit_UnioncCsZd}|jD]6}t|tjƒr*|d|j7}q |d| |¡d7}q |d| |j¡7}|S)NrÚ.r(r)r_)r#rJrÚIDrr^r3)rr rcr#rrr Úvisit_NamedInitializerPs  z!CGenerator.visit_NamedInitializercCs | |¡Sr©rmrrrr Úvisit_FuncDeclZszCGenerator.visit_FuncDeclcCs|j|ddS©NFror¶rrrr Úvisit_ArrayDecl]szCGenerator.visit_ArrayDeclcCs|j|ddSr¸r¶rrrr Úvisit_TypeDecl`szCGenerator.visit_TypeDeclcCs|j|ddSr¸r¶rrrr Ú visit_PtrDeclcszCGenerator.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±rxNr rr‚r6r‡r\)rhÚ_generate_struct_union_bodyÚvaluesZ enumeratorsÚ_generate_enum_bodyr#rr)rr r#ÚmembersZ body_functionrcrrr rzfs    z&CGenerator._generate_struct_union_enumcsd ‡fdd„|Dƒ¡S)Nrc3s|]}ˆ |¡VqdSrrˆrfr rr rrz9CGenerator._generate_struct_union_body..©r©rr¿rr r r¼~sz&CGenerator._generate_struct_union_bodycs$d ‡fdd„|Dƒ¡dd…dS)Nrc3s|]}ˆ |¡VqdSrr)rrr rr rƒrz1CGenerator._generate_enum_body..éþÿÿÿr‚rÀrÁrr r r¾szCGenerator._generate_enum_bodycCsÈt|ƒ}|r|jd7_| ¡}|r4|jd8_|tjtjtjtjtjtj tj tj tj tj tjtjtjf vr‚|| |¡dS|tjfvr˜| |¡S|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. r6r€r‚N)r,rrrÚDeclrWZCastZUnaryOprKZ TernaryOpÚFuncCallÚArrayRefÚ StructRefÚConstantr´ZTypedefr]rZCompoundZIf)rr r›Útypr~rrr r‰…s ü   zCGenerator._generate_stmtcCsfd}|jrd |j¡d}|jr4|d |j¡d7}|jrR|| |jd¡d7}|| |j¡7}|S)z& Generation from a Decl node. rr r)ZfuncspecrrlZalignrrmr,rjrrr r`£s zCGenerator._generate_declTc Cs t|ƒ}|tjkr€d}|jr2|d |j¡d7}|| |j¡7}|jrR|rR|jnd}t|ƒD]\}}t|tj ƒrÔ|dkrœt||dtj ƒrœd|d}|d7}|j r¾|d |j ¡d7}|| |j ¡d7}q^t|tj ƒr(|dkrt||dtj ƒrd|d}|d| |j¡d7}q^t|tj ƒr^|jr`d d |j¡|rVd|ndf}q^d |}q^|r||d|7}|S|tjkr˜| |j¡S|tjkr´|j|j|d S|tjkrÐd |j¡dS|tj tj tj fvrþ|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%srEroN)r,rZTypeDeclZqualsrrZdeclnameÚ enumeraterJZ ArrayDeclZPtrDeclZ dim_qualsZdimZFuncDeclr0rÃr`ZTypenamermZIdentifierTyperY) rr Ú modifiersrprÈrcZnstrÚiÚmodifierrrr rm­sR  ÿ  ÿ   ÿ     ÿ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)r^)rr Z conditionrcrrr rRâs  zCGenerator._parenthesize_ifcsˆ |‡fdd„¡S)z. Common use case for _parenthesize_if cs ˆ |¡ Sr)rIrMr rr rPïrz8CGenerator._parenthesize_unless_simple..)rRrrr r 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. )rJrrÇr´rÅrÆrÄrrrr rIñsÿzCGenerator._is_simple_nodeN)F)F)F)CrÚ __module__Ú __qualname__Ú__doc__r rrrr!r$r'r+r-r1r5rLrVrXrZr^rdrkrnrqrvrwr{r}rr„r†r‹rŒrŽrr’r“r”r˜rœržr r¡r¤r¥r©rªr«r¬r­r¯r°r²rµr·r¹rºr»rzr¼r¾r‰r`rmrRr*rIrrrr r s” ô           5 rN)rrÚobjectrrrrr Ú s