gwUc@s*ddlmZdefdYZdS(i(tc_astt CGeneratorcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZedZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"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/Z2d0Z3gd1Z4d2Z5d3Z6d4Z7RS(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|dkrdSdjfd|jDSdS(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|jdS(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|jS(N(RRttypeRtfield(RRtsref((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_StructRef/scCs.|j|j}|d|j|jdS(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|jSd|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_UnaryOp7scsPj|jfd}j|jfd}d||j|fS(Ncsj| S(N(t_is_simple_node(td(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytFscsj| 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|tjS(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|jS(NR(Rtnames(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_IdentifierTypeQscCs_t|tjr'd|j|dSt|tjrNd|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|j7}n|jrj|d|j|j7}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|jdkr\|ddjfd|jdD7}n|S(Niis, c3s$|]}j|dtVqdS(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|jd7}n||j|j7}|S(NRR(tstorageRt_generate_typeR!(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Typedefms  cCs2d|j|jd}|d|j|jS(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}scCsd}|jr#|d|j7}n|jr|d7}x|t|jjD]h\}}||j7}|jr|d|j|j7}n|t|jjdkrI|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_Enums      csj|j}d_j|j}|jrpdjfd|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_FuncDefs  "cCs]d}xP|jD]E}t|tjr>||j|7}q||j|d7}qW|S(NRs; (textR8RtFuncDefR(RRRHRe((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_FileASTs csxjd}jd7_|jrQ|djfd|jD7}njd8_|jd7}|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_Compounds )cCsdS(Nt;((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_EmptyStatementscs djfd|jDS(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_ParamListscCs4d}|jr,|d|j|j7}n|dS(NtreturnRRl(R+R(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Returns cCsdS(Nsbreak;((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_BreakscCsdS(Ns continue;((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_ContinuescCsJ|j|jd}||j|jd7}||j|j7}|S(Ns ? s : (RCtcondtiftruetiffalse(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_TernaryOpscCsd}|jr(||j|j7}n|d7}||j|jdt7}|jr||jd7}||j|jdt7}n|S(Nsif (s) t add_indentselse (RuRRhRvRJRwR(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_Ifs   cCsd}|jr(||j|j7}n|d7}|jrX|d|j|j7}n|d7}|jr|d|j|j7}n|d7}||j|jdt7}|S(Nsfor (RlRs) Ry(RFRRutnextRhRiRJ(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Fors      cCsRd}|jr(||j|j7}n|d7}||j|jdt7}|S(Nswhile (s) Ry(RuRRhRiRJ(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_Whiles   cCsfd}||j|jdt7}||jd7}|jrX||j|j7}n|d7}|S(Nsdo Ryswhile (s);(RhRiRJRRuR(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_DoWhiles  cCs:d|j|jd}||j|jdt7}|S(Nsswitch (s) Ry(RRuRhRiRJ(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_SwitchscCsKd|j|jd}x*|jD]}||j|dt7}q$W|S(Nscase s: Ry(RR+tstmtsRhRJ(RRRHRi((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_CasescCs7d}x*|jD]}||j|dt7}qW|S(Ns default: Ry(RRhRJ(RRRHRi((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_DefaultscCs|jd|j|jS(Ns: (RRhRi(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_LabelscCsd|jdS(Nsgoto Rl(R(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_GotoscCsdS(Ns...((RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_EllipsisParamscCs|j|dS(Ntstruct(t_generate_struct_union(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_StructscCs|j|jS(N(RPR!(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pytvisit_TypenamescCs|j|dS(Ntunion(R(RR((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyt visit_UnionscCsd}xa|jD]V}t|tjr<|d|j7}qt|tjr|d|jd7}qqW|d|j|j7}|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}||j7}|jd7_|d7}x$|jD]}||j|7}q]W|jd8_||jd7}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.pyRs   cCst|}|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 StructRefRRtTypedefRBRtCompound(RRRyttyptindent((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyRh(s   cCshd}|jr(dj|jd}n|jrN|dj|jd7}n||j|j7}|S(s& Generation from a Decl node. RR(tfuncspecRRORPR!(RRRH((s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyRDDs  cCsrt|}|tjkrd}|jrG|dj|jd7}n||j|j7}|jro|jnd}x5t|D]'\}}t|tj r|dkrt||dtj rd|d}n|d|j|j d7}qt|tj rb|dkrAt||dtj rAd|d}n|d|j|j d7}qt|tj r|jrd dj|j|f}qd |}qqW|r|d|7}n|S|tjkr|j|jS|tjkr|j|jS|tjkr)dj|jdS|tj tj tj fkra|j|j||gS|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'RRDtTypenameRPtIdentifierTypeR=(RRt modifiersRRHtnstrR]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  csj|fdS(s. Common use case for _parenthesize_if csj| S(N(R/(R0(R(s9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyR1s(R2(RR((Rs9/usr/lib/python2.7/site-packages/pycparser/c_generator.pyRscCs+t|tjtjtjtjtjfS(s~ Returns True for nodes that are "simple" - i.e. nodes that always have higher precedence than operators. (R8RRRRRR(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~RRRRRRRRRRRRRhRDRPR2RR/(((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