ó g¨wUc@s*ddlmZdefd„ƒYZdS(i(tc_astt CGeneratorcBsëeZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z!d„Z"d „Z#d!„Z$d"„Z%d#„Z&d$„Z'd%„Z(d&„Z)d'„Z*d(„Z+d)„Z,d*„Z-d+„Z.d,„Z/d-„Z0d.„Z1ed/„Z2d0„Z3gd1„Z4d2„Z5d3„Z6d4„Z7RS(5s¬ 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(Ni(t indent_level(tself((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt__init__scCs d|jS(Nt (R(R((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt _make_indentscCs)d|jj}t|||jƒ|ƒS(Ntvisit_(t __class__t__name__tgetattrt generic_visit(Rtnodetmethod((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisitscs7|dkrdSdj‡fd†|jƒDƒƒSdS(Ntc3s$|]\}}ˆj|ƒVqdS(N(R(t.0tc_nametc(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pys #s(tNonetjointchildren(RR ((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR s cCs|jS(N(tvalue(Rtn((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_Constant%scCs|jS(N(tname(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_ID(scCs.|j|jƒ}|d|j|jƒdS(Nt[t](t_parenthesize_unless_simpleRRt subscript(RRtarrref((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_ArrayRef+scCs-|j|jƒ}||j|j|jƒS(N(RRttypeRtfield(RRtsref((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_StructRef/scCs.|j|jƒ}|d|j|jƒdS(Nt(t)(RRRtargs(RRtfref((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_FuncCall3scCsx|j|jƒ}|jdkr)d|S|jdkr@d|S|jdkrcd|j|jƒSd|j|fSdS(Nsp++s%s++sp--s%s--tsizeofs sizeof(%s)s%s%s(RtexprtopR(RRtoperand((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_UnaryOp7scsPˆj|j‡fd†ƒ}ˆj|j‡fd†ƒ}d||j|fS(Ncsˆj|ƒ S(N(t_is_simple_node(td(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytFscsˆj|ƒ S(N(R/(R0(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR1Hss%s %s %s(t_parenthesize_iftlefttrightR,(RRtlval_strtrval_str((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_BinaryOpDs   cCs8|j|jd„ƒ}d|j|jƒ|j|fS(NcSst|tjƒS(N(t isinstanceRt Assignment(R((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR1Nss%s %s %s(R2trvalueRtlvalueR,(RRR6((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_AssignmentKs cCsdj|jƒS(NR(Rtnames(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_IdentifierTypeQscCs_t|tjƒr'd|j|ƒdSt|tjƒrNd|j|ƒdS|j|ƒSdS(Nt{t}R%R&(R8RtInitListRtExprList(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt _visit_exprTs cCsn|r|jn |j|ƒ}|jrD|d|j|jƒ7}n|jrj|d|j|jƒ7}n|S(Ns : s = (Rt_generate_decltbitsizeRtinitRC(RRtno_typets((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Decl\s   cs`ˆj|jdƒ}t|jƒdkr\|ddj‡fd†|jdDƒƒ7}n|S(Niis, c3s$|]}ˆj|dtƒVqdS(RGN(RItTrue(Rtdecl(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pys is(RtdeclstlenR(RRRH((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_DeclListfs cCsFd}|jr,|dj|jƒd7}n||j|jƒ7}|S(NRR(tstorageRt_generate_typeR!(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Typedefms  cCs2d|j|jƒd}|d|j|jƒS(NR%R&R(RPtto_typeRR+(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_CastsscCs=g}x'|jD]}|j|j|ƒƒqWdj|ƒS(Ns, (texprstappendRCR(RRtvisited_subexprsR+((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_ExprListwscCs=g}x'|jD]}|j|j|ƒƒqWdj|ƒS(Ns, (RTRURCR(RRRVR+((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_InitList}scCsÆd}|jr#|d|j7}n|jrÂ|d7}x|t|jjƒD]h\}}||j7}|jrˆ|d|j|jƒ7}n|t|jjƒdkrI|d7}qIqIW|d7}n|S(NtenumRs {s = is, R@(Rtvaluest enumeratet enumeratorsRRRM(RRRHtit enumerator((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Enumƒs      cs„ˆj|jƒ}dˆ_ˆj|jƒ}|jrpdj‡fd†|jDƒƒ}|d|d|dS|d|dSdS(Nis; c3s|]}ˆj|ƒVqdS(N(R(Rtp(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pys –ss (RRKRtbodyt param_declsR(RRRKRatknrdecls((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_FuncDef‘s  "cCs]d}xP|jD]E}t|tjƒr>||j|ƒ7}q||j|ƒd7}qW|S(NRs; (textR8RtFuncDefR(RRRHRe((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_FileAST›s csxˆjƒd}ˆjd7_|jrQ|dj‡fd†|jDƒƒ7}nˆjd8_|ˆjƒd7}|S(Ns{ iRc3s|]}ˆj|ƒVqdS(N(t_generate_stmt(Rtstmt(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pys ¨ss} (RRt block_itemsR(RRRH((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_Compound¤s )cCsdS(Nt;((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_EmptyStatement­scs dj‡fd†|jDƒƒS(Ns, c3s|]}ˆj|ƒVqdS(N(R(Rtparam(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pys ±s(Rtparams(RR((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_ParamList°scCs4d}|jr,|d|j|jƒ7}n|dS(NtreturnRRl(R+R(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Return³s cCsdS(Nsbreak;((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Break¸scCsdS(Ns continue;((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_Continue»scCsJ|j|jƒd}||j|jƒd7}||j|jƒ7}|S(Ns ? s : (RCtcondtiftruetiffalse(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_TernaryOp¾scCsŽd}|jr(||j|jƒ7}n|d7}||j|jdtƒ7}|jrŠ||jƒd7}||j|jdtƒ7}n|S(Nsif (s) t add_indentselse (RuRRhRvRJRwR(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_IfÄs   cCs²d}|jr(||j|jƒ7}n|d7}|jrX|d|j|jƒ7}n|d7}|jrˆ|d|j|jƒ7}n|d7}||j|jdtƒ7}|S(Nsfor (RlRs) Ry(RFRRutnextRhRiRJ(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_ForÎs      cCsRd}|jr(||j|jƒ7}n|d7}||j|jdtƒ7}|S(Nswhile (s) Ry(RuRRhRiRJ(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_WhileÙs   cCsfd}||j|jdtƒ7}||jƒd7}|jrX||j|jƒ7}n|d7}|S(Nsdo Ryswhile (s);(RhRiRJRRuR(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_DoWhileàs  cCs:d|j|jƒd}||j|jdtƒ7}|S(Nsswitch (s) Ry(RRuRhRiRJ(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_SwitchèscCsKd|j|jƒd}x*|jD]}||j|dtƒ7}q$W|S(Nscase s: Ry(RR+tstmtsRhRJ(RRRHRi((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_CaseíscCs7d}x*|jD]}||j|dtƒ7}qW|S(Ns default: Ry(R€RhRJ(RRRHRi((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_DefaultóscCs|jd|j|jƒS(Ns: (RRhRi(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_LabelùscCsd|jdS(Nsgoto Rl(R(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_GotoüscCsdS(Ns...((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_EllipsisParamÿscCs|j|dƒS(Ntstruct(t_generate_struct_union(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_StructscCs|j|jƒS(N(RPR!(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_TypenamescCs|j|dƒS(Ntunion(R‡(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_UnionscCsˆd}xa|jD]V}t|tjƒr<|d|j7}qt|tjƒr|d|jd7}qqW|d|j|jƒ7}|S(NRt.RRs = (RR8RtIDtConstantRRR+(RRRHR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_NamedInitializer scCs |j|ƒS(N(RP(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_FuncDeclscCs¤|d|jpd}|jr |d7}||jƒ7}|jd7_|d7}x$|jD]}||j|ƒ7}q]W|jd8_||jƒd7}n|S(se Generates code for structs and unions. name should be either 'struct' or union. RRs is{ R@(RRLRRRh(RRRRHRK((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR‡s   cCsït|ƒ}|r$|jd7_n|jƒ}|rH|jd8_n|tjtjtjtjtjtj tj tj tj tj tjtjtjf kr·||j|ƒdS|tjfkrÖ|j|ƒS||j|ƒdSdS(sÄ 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. is; s N(R!RRRtDeclR9tCasttUnaryOptBinaryOpt TernaryOptFuncCalltArrayReft StructRefRŽRtTypedefRBRtCompound(RRRyttyptindent((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyRh(s   cCshd}|jr(dj|jƒd}n|jrN|dj|jƒd7}n||j|jƒ7}|S(s& Generation from a Decl node. RR(tfuncspecRRORPR!(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyRDDs  cCsrt|ƒ}|tjkrÈd}|jrG|dj|jƒd7}n||j|jƒ7}|jro|jnd}x5t|ƒD]'\}}t|tj ƒrø|dkr×t||dtj ƒr×d|d}n|d|j|j ƒd7}q‚t|tj ƒrb|dkrAt||dtj ƒrAd|d}n|d|j|j ƒd7}q‚t|tj ƒr‚|jrœd dj|jƒ|f}q©d |}q‚q‚W|rÄ|d|7}n|S|tjkrç|j|jƒS|tjkr|j|jƒS|tjkr)dj|jƒdS|tj tj tj fkra|j|j||gƒS|j|ƒSd S( sø 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. RRiiR%R&RRs* %s %st*N(R!RtTypeDecltqualsRRtdeclnameR[R8t ArrayDecltPtrDecltdimtFuncDeclR'R‘RDtTypenameRPtIdentifierTypeR=(RRt modifiersR›RHtnstrR]tmodifier((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyRPMs@  &!&! cCs/|j|ƒ}||ƒr'd|dS|SdS(s‘ Visits 'n' and returns its string representation, parenthesized if the condition function applied to the node returns True. R%R&N(RC(RRt conditionRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR2{s  csˆj|‡fd†ƒS(s. Common use case for _parenthesize_if csˆj|ƒ S(N(R/(R0(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR1ˆs(R2(RR((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR…scCs+t|tjtjtjtjtjfƒS(s~ Returns True for nodes that are "simple" - i.e. nodes that always have higher precedence than operators. (R8RRŽRR—R˜R–(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR/Šs(8R t __module__t__doc__RRRR RRR R$R)R.R7R<R>RCtFalseRIRNRQRSRWRXR_RdRgRkRmRpRrRsRtRxRzR|R}R~RRR‚RƒR„R…RˆR‰R‹RRR‡RhRDRPR2RR/(((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR sj                                        . N(RRtobjectR(((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt s