9(Zc@s-ddlmZddlmZmZddlmZmZyddlmZ Wne k roddl Z nXddl Z ddl Z ddl Z y:e jdkrddlZn ddlZejZWne k rdZnXdZe jd e je jBZe jd e je jBZe jd Ze jd Ze jd Ze jdZdae jde jZ e jdZ!e jdZ"e jdZ#e jdZ$e jdZ%e jdZ&e jdZ'dZ(dZ)dZ*dZ+dZ,de-fdYZ.dS(i(tmodel(t COMMON_TYPEStresolve_common_type(tFFIErrort CDefError(t _pycparseriNiss/\*.*?\*/|//([^\n\\]|\\.)*?$s?^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)\b((?:[^\n\\]|\\.)*?)$s=\s*\.\.\.\s*[,}]|\.\.\.\s*\}s__dotdotdot\d+__$s\[\s*\.\.\.\s*\]s\w+|\Ss-?0?x?[0-9a-f]+[lu]*$s\b(__stdcall|WINAPI)\bs[(]\s*(__stdcall|WINAPI)\bs \b__cdecl\bs9\bextern\s*"(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.s'[*]\s*((const|volatile|restrict)\b\s*)+s3(\b(int|long|short|signed|unsigned|char)\s*)+\.\.\.s\b(double|float)\s*\.\.\.cCstdkrtjantS(N(t _parser_cachetNonet pycparsertCParser(((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyt _get_parser*s cCsng}xKtrStj|}|s(Pn|j||j |jdd}|j|j|j}|jd|r|jd|d7}nd}|}x|t|kr6||}|dkr|d7}nH|dkr |dkrPn|d8}n|dkr)|dkr)Pq)n|d7}qW|||!|||}q W|j|dj |S(Nt(t)t*iis,;=t( tTruet_r_star_const_spacetsearchtappendtstarttgrouptendt startswithtlentjoin(tcsourcetpartstmatchtclosingtendpostleveltitc((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyt_workaround_for_old_pycparser0s<              cCsg}xptrxtj|}|s(Pn|jd}|j||j d|jdkrt|jdn |jd||dkr|jd|}|dkrtdn|jd|d|dkrt d n|j||d|!||d}nS|jd |}|dkrBtd n|j|||d!||d}|jd q W|j|d j |S(NitCs(void __cffi_extern_python_plus_c_start; s!void __cffi_extern_python_start; t{t}is!'extern "Python" {': no '}' founds7cannot use { } inside a block 'extern "Python" { ... }'t;s'extern "Python": no ';' founds void __cffi_extern_python_stop;R( Rt_r_extern_pythonRRRRRtfindRtNotImplementedErrorR(RRRRRt semicolon((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyt_preprocess_extern_pythonZs4      c Cstjd|}i}xKtj|D]:}|j\}}|jddj}|||                     tParsercBseZdZdZdZdZeeedZdZdZ dZ dZ d Z d Z d Zd Zed dZdZddZdedZddZdZdedZdZedZdZdZdZdZRS(cCsUi|_t|_d|_tj|_i|_i|_g|_ d|_ dS(Ni( t _declarationsRJt_included_declarationst_anonymous_countertweakreftWeakKeyDictionaryt_structnode2typet_optionst_int_constantst _recompleteRt_uses_new_feature(tself((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyt__init__s      c Cst|\}}t|}g}xMt|jD]<}|jdr4|d}|j||j|q4q4W|t|7}g}|jdx|D]}|jd|qW|jd|jdtf|j|dj|}t dk rt j nzFyt j |} Wn)tjjk rS} |j| |nXWdt dk rqt jnX| ||fS(Nstypedef is*# 1 ""stypedef int %s;s@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;s# 1 "%s"s (RGRVtsortedRXRRROtCDEF_SOURCE_STRINGRtlockRtacquireR tparseRtc_parsert ParseErrortconvert_pycparser_errortrelease( RbRR@tctnt typenamestnamet csourcelinesttypenamet fullcsourcetastte((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyt_parses6          cCsd}t|}tjdtf|}|rt|jdd}|j}d|kort|knr||d}qn|S(Ns %s:(\d+):ii ( RtstrtreRRetintRt splitlinesR(RbRtRtlinetmsgRtlinenumRp((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyt_convert_pycparser_errors  "cCsZ|j||}t|}|r=d|j|f}n d|f}t|dS(Nscannot parse "%s" %ssparse error %s(R}RvR3R(RbRtRRzR{((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRk+s   cCsI|j}z/i|d6|d6|d6|_|j|Wd||_XdS(Ntoverridetpackedt dllexport(R^t_internal_parse(RbRR~RRt prev_options((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRh5s   c Cs|j|\}}}|j|t|j}x-|D]}|jdkr;Pq;q;Wdsdtd}yd|_x|D]}|}t|t j j r|j |q}t|t j j r|jstd|nd}t|jjt j jr-|jjjdjdr-|j|}nt|jt j jrt|jjt j jrt|jjjt j jr|jjjjdjdr|j|}n'|j|jd|jdt\}}|jd |j|d |q}|jjd kr q}td |jj|q}WWntk rl} t| jd krf| j|f| _nnLtk r} |j| |} | r| jdd| f| _nnXdS(Nt __dotdotdot__it__cffi_extern_python_stops!typedef does not declare any nameit __dotdotdotRotpartial_length_okstypedef tqualstPragmasBunexpected <%s>: this construct is valid C but not valid in cdef()is *** Err: %s( Rut_process_macrostitertextRoR=Rt_inside_extern_pythont isinstanceRtc_asttDeclt _parse_decltTypedefRttypetIdentifierTypetnamesRt_get_unknown_typetPtrDecltTypeDeclt_get_unknown_ptr_typet_get_type_and_qualsRt_declaret __class__t__name__RtargsRR}( RbRRsR@titeratortdeclt current_declRtrealtypeRtR{((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyR?sX       ! cCsM||jkr<|j||kr&dStd|fn||j|||kr>dS|jjdsitd|fqind|jkst||f|j|<|r|jj|ndS(NR~sPmultiple declarations of %s (for interactive usage, try cdef(xx, override=True))R(RXR^RRtsplitR=RYRK(RbRotobjtincludedRtprevobjt prevquals((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRscCsd}t|tjjtjjfrd|jkrF|tjO}nd|jkre|tjO}nd|jkr|tj O}qn|S(Nitconsttvolatiletrestrict( RRRRRRRRt Q_VOLATILEt Q_RESTRICT(RbRR((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyt_extract_qualsscCst|tjr|jSt|tjr|jjdr|jdjr|jdkr|dk rtj |||Stj ||S(Nt$i( RRRtas_function_pointertStructOrUnionOrEnumRoRtisdigitt forcenameRtNamedPointerTypet PointerType(RbRRtdeclname((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRs %cCs}t|tjjrt|jtjjrt|jjdkrd|jjd|jkr|jd|jjd\}}||j |O}||fSt|tjj r|j dkrd}n|j |j d|}|j|jd|\}}tj|||fSt|tjjrw|j|j\}}|j||d|}|j |}||fSt|tjjr|j |}|j} t| tjjr1t| j} | ddgkri} xE| r'| d}|dkr#| j|dd| |<| d=qPqWg} x>dD]6} x-t| j| dD]}| j| qTWq5W| sd g} n| d gkrd| ksd | krg} qn| | } nd j| }|d krtj|fS|dkrtd|jjnt||\}}|||BfSt| tjjre|jd| |}||fSt| tjjr|jd| |}||fSt| tjj r|jd| |}||fSnt|tjj!r|j"||dfSt|tjjr/|jd||dt#dfSt|tjjrc|jd||dt#dfStd|jjdS(Nistypedef iRRtsignedtchartshorttlongtunsignedRxR+tvoidRs:%d: bad usage of "..."RRRtnesteds(:%d: bad or unsupported type declaration(sshortslongRR(Rsshortslong($RRRRRRRRRXRt ArrayDecltdimRt_parse_constantRRt ArrayTypeRRR9RtrangeRRRRtcoordRzRRRRRRt_parse_function_typeR(RbttypenodeRoRRRtlengthtitemtypet itemqualsRRtprefixestnewnamestprefixRtidentttp0tquals0((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyR s!                    c Cstt|jdg}x[t|D]M\}}t|ds(td|pRd|dt|ddfq(q(Wt|dkot|d jt j j ot|d jjt j j o|d jjj d gk}|r|j|std |pdqng|D]!}|j|j|j^q}| rd|tjgkrdg}n|j|j\} } d} t|jd r|jjd dddgkrd} qntjt|| || S(NRRst%s arg %d: unknown type '%s' (if you meant to use the old C syntax of giving untyped arguments, it is not supported)s in expressioniRot?iiRs=%s: a function with only '(...)' as argument is not correct CRiRRt __stdcall(R9tgetattrRR;RRRRRRRRRRtpopt _as_func_argRRRRRRttuple( RbRtfuncnameRRtargtellipsist argdeclnodeRtresultRtabi((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRgs6  +  cCsIt|tjr%tj|j|St|tjrA|jS|SdS(N(RRRRtitemRR(RbRR((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRs  cCsZy|j|SWntk r"nX|}|j}|dkr||dk rWd|}n|jd7_d|j}d}n1|}d||f}|jj|d\}} |dkr{|dkrtj|ddd}ny|dkrtj |ddd}nR|dkrF|dkr.t d n|j ||j }nt d |f|dk r|j||qn.|dkr|j dk rtd |n|js|j|n|jrd |jkr|jd |j|n||j|<|dkr|S|jdkr$|S|jdk rFt d|ng} g} g} g} x2|jD]'}t|jtjjrdj|jjdkr|j||qhn|jdkrd}n|j|j}t|_|j |jdt!\}}|jr$|j||nt|tjrR|j"rR|j||n| j#|jpdd| j#|| j#|| j#|qhWt$| |_t$| |_%t$| |_&t$| |_'| dgt(| krt|tjr|j"rtd|fqn|j)jd|_*|j+rVd|_+|j,j#|n|S(Ns$%sis$%ds%s %sRRRRs!Enums cannot be declared with ...s kind = %rs^enum %s: the '{}' declaration should appear on the first time the enum is mentioned, not laterRs anonymous %ss"duplicate declaration of struct %sRiRs#%s: using both bitfields and '...;'Ri(NN(-R]tKeyErrorRoRRZRXRRt StructTypet UnionTypeRt_build_enum_typetvaluesR=RR(Rtforce_the_nametdeclstfldnamesRRRRRRRt _make_partialtbitsizeRRLt_partial_lengthRRtpartialRRtfldtypest fldbitsizetfldqualsRR^Rt completedR`(RbtkindRRoRt force_namet explicit_nameRRt_RRRRRRtfqual((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRs                          cCs_t|tjs(td|fn|j rR| rRtd|fnt|_dS(Ns%s cannot be partials%s is partial but has no C name(RRt StructOrUnionRt has_c_nameR(RR(RbRR((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRs cCst|tjjr |j}|jdre|jdsK|jdrXt|dSt|dSd|dkodknrt|d S|dd kr|d d krt|d kst|d kr|ddkrt|dSt d|fnt|tjj r>|j dkr>|j |j St|tjj rs|j dkrs|j |j  St|tjjr|j|jkr|j|jSt|tjjr|jdkr|rt|_dStd|jjnt|tjjr<|j dkr<|j |j|j |jSt|tjjr|j dkr|j |j|j |jStd|jjdS(NRRt0Xiit1it9i t'iiiis\isinvalid constant %rt+Rt__dotdotdotarray__s...sT:%d: unsupported '[...]' here, cannot derive the actual array length in this contexts?:%d: unsupported expression: expected a simple numeric constant(RRRtConstantRRRxRtordRRRRRRRoR_RRRRRztBinaryOptlefttright(RbRRts((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRsL      4 c Cs|dk rt}g}g}d}x|jD]}tj|jrRt}q.n|jdk rv|j|j}n|j |j|j ||j |j||d7}q.Wt |}t |}t j |||}||_nt j |dd}|S(Nii(((RRLt enumeratorst_r_enum_dotdotdotRRoRRRRRRRtEnumTypeR( RbRRRR0t enumvaluest nextenumvalueRR((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRBs*     cCsxy|jjD]h\}\}}|jdr7qn|jddd}|d kr|j||d td |qqWx-|jjD]\}}|j||qWdS( Nsanonymous $enum_$R+iiRRRt anonymousRIRR(sstructsunionsenumR5stypedef(RXRRRRRR_R(RbtotherRoRRRtktv((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pytincludeZs" #cCs|jjj}|dgkr.tj|jS|dgkro|jdkr_d|j|_ntj|jS|dgkr|jdkrd|j|_ntj|jSt d|j j dS(NRt__dotdotdotint__s'typedef int... %s't__dotdotdotfloat__s'typedef float... %s's*:%d: unsupported usage of "..." in typedef( RRRt unknown_typeRoRaRtUnknownIntegerTypetUnknownFloatTypeRRRz(RbRRn((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRdscCsE|jjjjdgkr+tj|jStd|jjdS(NRs*:%d: unsupported usage of "..." in typedef(RRRtunknown_ptr_typeRoRRRz(RbR((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRwsN(Rt __module__RcRuR}RkRLRhRRRRRRRRRRRRRRRRRRRR9RR(((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pyRWs4 &   6    2   ^ # v  3  (i(/RRt commontypesRRterrorRRRRt ImportErrorR[Rwtsyst version_infotthreadt_threadt allocate_lockRfRRetcompiletDOTALLt MULTILINER-R/R:R1R8RMRt IGNORECASERR6R5R7R&RR>R?R R!R*RGRVtobjectRW(((s*/tmp/pip-build-wDUJoH/cffi/cffi/cparser.pytsN $        * 2 7 (