3 L]@sddlmZddlmZmZddlmZmZyddlmZ Wne k rXddl Z YnXddl Z ddl Z ddl Z y(e jd'krddlZnddlZejZWne k rdZYnXdd Zd Ze jd e je jBZe jd e je jBZe jd Ze jdZe jdZe jdZdae jde jZ e jdZ!e jdZ"e jdZ#e jdZ$e jdZ%e jdZ&e jdZ'ddZ(ddZ)ddZ*dd Z+d!d"Z,d#d$Z-Gd%d&d&e.Z/dS)()model) COMMON_TYPESresolve_common_type)FFIError CDefError) _pycparserNcCsddl}ddl}dS)Nr)Zpycparser.yacctabZpycparser.lextab) pycparserr ./tmp/pip-install-wfra5znf/cffi/cffi/cparser.py%_workaround_for_static_import_finderssr zz/\*.*?\*/|//([^\n\\]|\\.)*?$z?^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)\b((?:[^\n\\]|\\.)*?)$z=\s*\.\.\.\s*[,}]|\.\.\.\s*\}z__dotdotdot\d+__$z\[\s*\.\.\.\s*\]z\w+|\Sz-?0?x?[0-9a-f]+[lu]*$z\b(__stdcall|WINAPI)\bz[(]\s*(__stdcall|WINAPI)\bz \b__cdecl\bz9\bextern\s*"(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.z'[*]\s*((const|volatile|restrict)\b\s*)+z3(\b(int|long|short|signed|unsigned|char)\s*)+\.\.\.z\b(double|float)\s*\.\.\.cCstdkrtjatS)N) _parser_cacher ZCParserr r r r _get_parser1srcCs g}xtj|}|sP|j|d|j|jdd}|j|j|j}|jd|rn|jd|d7}d}|}x`|t|kr||}|dkr|d7}n.|dkr|dkrP|d8}n|dkr|dkrP|d7}qxW||||||d}qW|j|dj|S)N()*rrz,;=) _r_star_const_spacesearchappendstartgroupend startswithlenjoin)csourcepartsmatchclosingendposlevelicr r r _workaround_for_old_pycparser7s<          r%cCs0g}xtj|}|sP|jd}|j|d|jd|jdkrT|jdn |jd||dkr|jd|}|dkrtd|jd|d|dkrtd |j||d|||dd}nB|jd |}|dkrtd |j|||d||dd}|jd qW|j|d j |S)NrCz(void __cffi_extern_python_plus_c_start; z!void __cffi_extern_python_start; {}rz!'extern "Python" {': no '}' foundz7cannot use { } inside a block 'extern "Python" { ... }';z'extern "Python": no ';' foundz void __cffi_extern_python_stop;r) _r_extern_pythonrrrrrfindrNotImplementedErrorr)rrrr!r Z semicolonr r r _preprocess_extern_pythonas4         r-cCsd|krddl}|jddS)N"rzString literal found in cdef() or type source. String literals are ignored here, but you should remove them anyway because some character sequences confuse pre-parsing.)warningswarn)rr/r r r _warn_for_string_literalsr1c Cstjd|}i}x6tj|D](}|j\}}|jddj}|||<qWtjd|}tjdkrft |}t jd|}t jd|}t jd|}t |}t|tjd|}ttj|}xtt|D]\}}|j}||dkr"|jd ||j}||kstd |d||||d df}q|||d d ks             rUc@seZdZddZddZddZddZd8d d Zd dZddZ ddZ ddZ ddZ ddZ ddZddZd9ddZd d!Zd:d"d#Zd;d$d%Zdd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd S)?ParsercCs:i|_t|_d|_tj|_i|_i|_g|_ d|_ dS)Nr) _declarationsrO_included_declarations_anonymous_counterweakrefWeakKeyDictionary_structnode2type_options_int_constants _recomplete_uses_new_feature)selfr r r __init__s zParser.__init__c Cs4t|\}}t|}g}x"ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "%s" )rLrUsortedrWrrrSCDEF_SOURCE_STRINGrlockacquirerparser Zc_parser ParseErrorconvert_pycparser_errorrelease) rarrGZctn typenamesname csourcelinestypenameZ fullcsourceaster r r _parse s4          "  z Parser._parsecCsfd}t|}tjdtf|}|rbt|jdd}|j}d|koPt|knrb||d}|S)Nz %s:(\d+):r )strrerrfintr splitlinesr)rarrrlinemsgrlinenumror r r _convert_pycparser_error/s zParser._convert_pycparser_errorcCs@|j||}t|}|r*d|j|f}n d|f}t|dS)Nzcannot parse "%s" %szparse error %s)r|rur:r)rarrrryrzr r r rk=s   zParser.convert_pycparser_errorFNc Csz|r&|dkrtd|r tdd}n$|rF||d@rJtd|fnd}|j}z|||d|_|j|Wd||_XdS)NTzB'packed' should be False or True; use 'pack' to give another valuez$cannot give both 'pack' and 'packed'rz%'pack' must be a power of two, not %rr)overridepacked dllexport) ValueErrorr]_internal_parse)rarr}r~packrZ prev_optionsr r r riGs$   z Parser.parsec Cs$|j|\}}}|j|t|j}x |D]}|jdkr*Pq*WdsFtd}yBd|_x4|D]*}|}t|tj j r|j |q\t|tj j rf|jst d|d}t|jjtj jr|jjjdjdr|j|}nxt|jtj jr6t|jjtj jr6t|jjjtj jr6|jjjjdjdr6|j|}n|j|j|jdd\}}|jd |j||d q\|jjd krvq\t d |jj|q\WWnt k r} z&t| jdkr| j|f| _WYdd} ~ XnNtk r} z0|j| |} | r | jdd | f| _WYdd} ~ XnXdS)N __dotdotdot__r__cffi_extern_python_stopz!typedef does not declare any namerZ __dotdotdotT)rnpartial_length_okztypedef )qualsZPragmazBunexpected <%s>: this construct is valid C but not valid in cdef()z *** Err: %sr)rs_process_macrositerextrnrD_inside_extern_python isinstancer c_astZDecl _parse_declZTypedefrtypeIdentifierTypenamesr_get_unknown_typePtrDeclTypeDecl_get_unknown_ptr_type_get_type_and_quals_declare __class____name__rargsrr|) rarrqrGiteratordeclZ current_declrZrealtyperrrzr r r r_sX          zParser._internal_parsecCs8||jkr*|j||krdStd|f||j|<dS)Nz%multiple declarations of constant: %s)r^r)rakeyvalr r r _add_constantss   zParser._add_constantscCs|jjd}|jd}|r(|dd}|jdrV|dkrV|jd rVd|dd}t|d}|rj| }|j|||jd||dS) Nul-r00xZ0orzmacro )lowerrstriprrwrr)rarnZint_strnegZpyvaluer r r _add_integer_constants     zParser._add_integer_constantcCshxb|jD]V\}}|j}tj|r2|j||q |dkrL|jd||q td||||fq WdS)Nz...zmacro zonly supports one of the following syntax: #define %s ... (literally dot-dot-dot) #define %s NUMBER (with NUMBER an integer constant, decimal/hex/octal) got: #define %s %s)itemsr:_r_int_literalrrrr)rarGrvaluer r r rs zParser._process_macroscCsX|j||}|jjdrd}n$|jdkr.d}n|jdkr>d}nd}|j||j|dS)Nrzdllexport_python Z__cffi_extern_python_startzextern_python Z!__cffi_extern_python_plus_c_startzextern_python_plus_c z function )_get_type_pointerr]getrrrn)ratprrtagr r r _declare_functions    zParser._declare_functioncCs|j}t|tjjrJ|j||jd\}}t|tjs8t |j |||nt|tjj rf|j d|nHt|tjj r|j d|n,t|tjjr|j d|n|jstd||jr |j|dd\}}|jr|j |||n*|jr(t|dr(t|jd r(tj|jjr(|j|j|jjn|jrt|jtjjr|jjd krt|jjd rtj|jjjr|j|jd |jjjn||tjkr|jjd r|j|_nX|jd krtd |tj@r|j r|j d|j||dn|j d|j||ddS)N)rnstructunionenumz'construct does not declare any variableT)rinitrrZ__cffi_extern_python_rzsz/Parser._parse_function_type..rr rrZ __stdcallrrr)r@getattrrrBrrrrrr rrrrpoprrrrrtuple) rarfuncnamerr#argZellipsisrresultrabir )rar rs6       zParser._parse_function_typecCs6t|tjrtj|j|St|tjr.|jS|SdS)N)rrrritemrr)rarrr r r rs   zParser._as_func_argc Cs,y |j|Stk rYnX|}|j}|dkrb|dk rDd|}n|jd7_d|j}d}n"|}d||f}|jj|d\}} |dkr|dkrtj|ddd}nP|dkrtj|ddd}n6|dkr|dkrt d |j ||j }nt d |f|dk r2|j ||n"|dkr2|j dk r2td ||jsD|j||jrjd |jkrj|j d |j|||j|<|dkr|S|jdkr|S|jdk rt d|g} g} g} g} x|jD]}t|jtjjrdj|jjdkr|j||q|jdkrd}n |j|j}d|_|j|jdd\}}|jrH|j||t|tjrj|jrj|j||| j |jpxd| j || j || j |qWt!| |_t!| |_"t!| |_#t!| |_$| dgt%| krt|tjr|jrtd|f|j&jd|_'|j(r(d|_(|j)j ||S)Nz$%srz$%dz%s %srrrrz!Enums cannot be declared with ...z kind = %rz^enum %s: the '{}' declaration should appear on the first time the enum is mentioned, not laterrz anonymous %sz"duplicate declaration of struct %srFT)rz#%s: using both bitfields and '...;'r~r)NNrr)*r\KeyErrorrnrYrWrrZ StructTypeZ UnionTyper_build_enum_typevaluesrDrr,rZforce_the_namedeclsfldnamesrrr rrrr _make_partialbitsizer_partial_lengthrpartialrrfldtypes fldbitsizefldqualsrr]r~Z completedr_)rakindrrnrZ force_name explicit_namerr_rrrrrrZfqualr r r rs                             z"Parser._get_struct_union_enum_typecCsBt|tjstd|f|j r8| r8td|fd|_dS)Nz%s cannot be partialz%s is partial but has no C nameT)rrZ StructOrUnionrZ has_c_namer,r)rarrr r r r(s  zParser._make_partialc Cs`t|tjjr,|j}d|dko,dknr|jd}y"|jdrRt|dSt|dSWn\tk rt |dkr|j ddd krt|d S|j ddd krt|dSYnXt d |fn`|dd kr|dd krt |dkst |dkr|ddkrt |dSt d |ft|tjj rT|jdkrT|j|jSt|tjj r~|jdkr~|j|j St|tjjr|j|jkr|j|jSt|tjjr|jdkr|rd|_dStd|jjt|tjjr|jdkr|j|j|j|jSt|tjjrL|jdkrL|j|j|j|jStd|jjdS)Nrr9ZuUlLrcrtrrr0bzinvalid constant %r'r \+rZ__dotdotdotarray__Tz...zT:%d: unsupported '[...]' here, cannot derive the actual array length in this contextz?:%d: unsupported expression: expected a simple numeric constantr)rr rConstantrrrrwrrrrordrrrrrrnr^rrrryZBinaryOpleftright)rarrsr r r r/sZ     *           zParser._parse_constantc Cs|dk rd}g}g}d}xb|jD]X}tj|jr6d}q |jdk rL|j|j}|j|j|j||j|j||d7}q Wt|}t|}t j |||}||_ nt j |ff}|S)NFrTr) enumerators_r_enum_dotdotdotrrnrrrrrrZEnumTyper) rarrrrZ enumvaluesZ nextenumvaluerrr r r rjs*       zParser._build_enum_typecCszxP|jjD]B\}\}}|jdr$q |jddd}|d kr |j||d |d q Wx"|jjD]\}}|j||q^WdS) Nzanonymous $enum_$r2rrrrr anonymousrNT)rr)rrrrrN)rWrrrrr^r)raotherrnrrrkvr r r includes zParser.includecCs|jjj}|dgkr tj|jS|dgkrL|jdkr@d|j|_tj|jS|dgkrx|jdkrld|j|_tj|jStd|j j dS)NrZ__dotdotdotint__z'typedef int... %s'Z__dotdotdotfloat__z'typedef float... %s'z*:%d: unsupported usage of "..." in typedef) rrrZ unknown_typernr`ZUnknownIntegerTypeZUnknownFloatTyperrry)rarrmr r r rs           zParser._get_unknown_typecCs2|jjjjdgkrtj|jStd|jjdS)Nrz*:%d: unsupported usage of "..." in typedef)rrrZunknown_ptr_typernrrry)rarr r r rs zParser._get_unknown_ptr_type)FFNF)Fr)N)NF)N)NF)F)r __module__ __qualname__rbrsr|rkrirrrrrrrrrrrrrrrrrrrrrr r r r rVs6 &  6 2  ^ # v ; rV)r )0rrZ commontypesrrerrorrrrr ImportErrorrZrvsys version_infothread_thread allocate_lockrgr rfcompileDOTALL MULTILINEr4r6rArr?rQr IGNORECASErr=r<r>r*rrErFrr%r-r1rLrUobjectrVr r r r sR               *2:(