U 1_Ǭ@sddlmZddlmZmZddlmZmZzddlmZ Wne k rXddl Z YnXddl Z ddl Z ddl Z z(e jdkrddlZnddlZeZWne k rdZYnXdd Zd Ze d e je jBZe d e je jBZe d e jZe dZe dZe dZe dZdae de j Z!e dZ"e dZ#e dZ$e dZ%e dZ&e dZ'e dZ(ddZ)ddZ*ddZ+d d!Z,d"d#Z-d$d%Z.d&d'Z/d(d)Z0d*d+Z1Gd,d-d-e2Z3dS).)model) COMMON_TYPESresolve_common_type)FFIError CDefError) _pycparserN)cCsddl}ddl}dSNr)Zpycparser.yacctabZpycparser.lextab) pycparserr 0/tmp/pip-unpacked-wheel-9t_xacz3/cffi/cparser.py%_workaround_for_static_import_finderssrzz/\*.*?\*/|//([^\n\\]|\\.)*?$z?^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)\b((?:[^\n\\]|\\.)*?)$z^[ \t]*#[ \t]*(?:line|\d+)\b.*$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*\.\.\.cCstdkrtatSN) _parser_cacher ZCParserr r r r _get_parser2srcCsg}t|}|sq||d||dd}|||}|d|rl|d|d7}d}|}|t|kr||}|dkr|d7}n.|dkr|dkrq|d8}n|dkr|dkrq|d7}qt||||||d}q||d|S)N()*rrz,;=) _r_star_const_spacesearchappendstartgroupend startswithlenjoin)csourcepartsmatchclosingendposlevelicr r r _workaround_for_old_pycparser8s:          r'cCs,g}t|}|sq|d}||d|d|dkrR|dn |d||dkr|d|}|dkrtd|d|d|dkrtd |||d|||dd}nB|d |}|dkrtd ||||d||dd}|d q||d |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)rr r!r#r"Z semicolonr r r _preprocess_extern_pythonbs2          r/cCsJd|kr dS|D]0}d|kr|dsddl}|dqFqdS)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.) splitlineslstriprwarningswarn)rliner4r r r _warn_for_string_literals  r7cCs$|js ddl}|d|jfdS)NrzrGlobal variable '%s' in cdef(): for consistency with C it should have a storage class specifier (usually 'extern'))Zstorager4r5name)declr4r r r /_warn_for_non_extern_non_static_global_variables r:cs$gfdd}t||}|fS)Ncst}|d|S)Nz#line@%d)rrr)mr%line_directivesr r replacesz(_remove_line_directives..replace_r_line_directivesub)rr>r r<r _remove_line_directivess  rBcsfdd}t||S)Ncs.|}|dstdt|ddS)Nz#line@zBunexpected #line directive (should have been processed and removed)rrAssertionErrorint)r;sr<r r r>s z*_put_back_line_directives..replacer?)rr=r>r r<r _put_back_line_directivess rGc Cst|\}}dd}t||}i}t|D](}|\}}|dd}|||<q.td|}tj dkrvt |}t d|}t d|}t d|}t|}t|td |}tt|}tt|D]\}}|} || d kr2|d | |} | | kstd |d| ||| d df}q|| | d d ksLtd|d| ||| d df}qtd|}td|}|d d}t||}||fS)NcSsd|ddS)N  )rcount)r;r r r replace_keeping_newlinessz-_preprocess..replace_keeping_newlinesz\ rz2.14z volatile volatile const(z volatile volatile const rHz[__dotdotdotarray__]=...z%s,__dotdotdot%d__ %sr z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )rB _r_commentrA _r_definefinditergroupsr>stripr __version__r' _r_stdcall2 _r_stdcall1_r_cdeclr/r7_r_partial_arraylist_r_partial_enum enumeratereversedrr-rrD_r_int_dotdotdot_r_float_dotdotdotrG) rr=rKmacrosr!Z macronameZ macrovaluematchesnumberpp2r r r _preprocesssF              rccCstt}|d|d|d|d|dt}d}d}d}t|D]}||kr|dkr|r||||d}nj|dkrd }d}nX|dkr|d 7}nF|dkr|d 8}n4|dkr|r|dkr||||n |||}qV|S) Nr+,rrtypedefFrrTr)setradd_r_wordsfindalldiscard)rZlook_for_wordsZ words_usedZ is_typedefZparenZ previous_wordwordr r r _common_type_namess>             rlc@seZdZddZddZddZddZd:d d Zd dZddZ ddZ ddZ ddZ ddZ ddZddZd;ddZd d!Zdd&d'Zd(d)Zd?d*d+Zd,d-Zd@d.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd S)AParsercCs:i|_t|_d|_t|_i|_i|_g|_ d|_ dSr ) _declarationsrf_included_declarations_anonymous_counterweakrefWeakKeyDictionary_structnode2type_options_int_constants _recomplete_uses_new_featureselfr r r __init__)s zParser.__init__c Cs,t|\}}t|}g}t|jD].}|dr"|dd}||||q"|t|7}g}|d|D]}|d|qp|d|dtf||d|}t dk rt zJzt |} Wn4tjjk r} z|| |W5d} ~ XYnXW5t dk r t X| ||fS)Ntypedef z*# 1 ""ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "%s"rI)rcrlsortedrnrrrjCDEF_SOURCE_STRINGrlockacquirereleaserparser Zc_parser ParseErrorconvert_pycparser_error) ryrr^Zctn typenamesr8 csourcelinestypenameZ fullcsourceaster r r _parse3s4          "  z Parser._parsecCsfd}t|}tdtf|}|rbt|dd}|}d|krRt|krbnn ||d}|S)Nz %s:(\d+):r )strrer!r~rErr2r)ryrrr6msgr!linenumrr r r _convert_pycparser_errorYs zParser._convert_pycparser_errorcCs@|||}t|}|r*d||f}n d|f}t|dS)Nzcannot parse "%s" %szparse error %s)rrrRr)ryrrr6rr r r rgs   zParser.convert_pycparser_errorFNcCsz|r&|dkrtd|r tdd}n$|rF||d@rJtd|fnd}|j}z|||d|_||W5||_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) ValueErrorrt_internal_parse)ryrrrpackrZ prev_optionsr r r rqs( z Parser.parsec Cs&||\}}}||t|j}|D]}|jdkr(qDq(dsDtd}zFd|_|D]4}|}t|tj j rz| |qVt|tj j rj|jst d|d}t|jjtj jr|jjjddr||}nt|jtj jr0t|jjtj jr0t|jjjtj jr0|jjjjddr0||}n"|j|j|jdd|jfd \}}|jd |j||d qV|jjd krzqVt d |jj|qVWnt k r} z$t| jdkr| j|f| _W5d} ~ XYnNtk r } z.|| |} | r| jdd| f| _W5d} ~ XYnXdS)N __dotdotdot__r__cffi_extern_python_stopz!typedef does not declare any nameZ __dotdotdotTz*(%s *)0)r8partial_length_oktypedef_exampler{qualsZPragmazBunexpected <%s>: this construct is valid C but not valid in cdef()rz *** Err: %s)r_process_macrositerextr8rD_inside_extern_python isinstancer c_astZDecl _parse_declZTypedefrtypeIdentifierTypenamesr_get_unknown_typePtrDeclTypeDecl_get_unknown_ptr_type_get_type_and_quals_declare __class____name__rargsrr) ryrrr^iteratorr9Z current_declrZrealtyperrr r r rsr           zParser._internal_parsecCs8||jkr*|j||krdStd|f||j|<dS)Nz%multiple declarations of constant: %s)rur)rykeyvalr r r _add_constantss zParser._add_constantscCs|d}|d}|r(|dd}|drT|dkrT|dsTd|dd}t|d}|rh| }||||d||dS) Nul-r00xZ0ormacro )lowerrstriprrErr)ryr8Zint_strnegZpyvaluer r r _add_integer_constants    zParser._add_integer_constantcCsd|D]V\}}|}t|r0|||q|dkrJ|d||qtd||||fqdS)NrMrzonly 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)itemsrR_r_int_literalr!rrr)ryr^rvaluer r r rs  zParser._process_macroscCsX|||}|jdrd}n$|jdkr.d}n|jdkr>d}nd}|||j|dS)Nrzdllexport_python Z__cffi_extern_python_startzextern_python Z!__cffi_extern_python_plus_c_startzextern_python_plus_c z function )_get_type_pointerrtgetrrr8)rytprr9tagr r r _declare_functions    zParser._declare_functioncCs|j}t|tjjrJ|j||jd\}}t|tjs8t | |||nt|tjj rf| d|nHt|tjj r| d|n,t|tjjr| d|n|jstd||jr|j|dd\}}|jr| |||n0|r(t|dr(t|jd r(t|jjr(||j|jjn|rt|jtjjr|jjd krt|jjd rt|jjjr||jd |jjjn|tjkr|jd r|j|_n^|jd krtd |tj@r|js|j d|j||dnt!||j d|j||ddS)N)r8structunionenumz'construct does not declare any variableTrinitrrZ__cffi_extern_python_rzsz/Parser._parse_function_type..rrrZ __stdcall)rXgetattrrrZrrrrrr rrrrpoprrrrrtuple) ryrfuncnamerr%argZellipsisrresultrabir rxr rsH      zParser._parse_function_typecCs6t|tjrt|j|St|tjr.|S|SdSr)rrrritemrrrr r r rs   zParser._as_func_argcCs*z |j|WStk r YnX|}|j}|dkrd|dk rFd|}n|jd7_d|j}d}n"|}d||f}|j|d\}} |dkr|dkrt|ddd}nP|dkrt|ddd}n6|dkr|d krt d | ||j }nt d |f|dk r4| ||n"|dkr4|j dk r4td ||jsF|||jrld |jkrl| d|j|||j|<|dkr|S|jdkr|S|jdk rt d|g} g} g} g} |jD]}t|jtjjrd|jjd kr|||q|jdkrd}n ||j}d|_|j|jdd\}}|jrH|||t|tjrj|jrj|||| |jpxd| || || |qt!| |_t!| |_"t!| |_#t!| |_$| dgt%| krt|tjr|jrtd|f|j&d|_'|j(r&d|_(|j) ||S)Nz$%srz$%dz%s %s)NNrrrrz!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 %srrFTrz#%s: using both bitfields and '...;'rr)*rsKeyErrorr8rprnrrZ StructTypeZ UnionTyper_build_enum_typevaluesrDrr.rZforce_the_namedeclsfldnamesrrr rrrr _make_partialbitsizer_partial_lengthrpartialrrfldtypes fldbitsizefldqualsrrtrZ completedrv)rykindrr8rZ force_name explicit_namerr_rrrrr9rZfqualr r r rs                            z"Parser._get_struct_union_enum_typecCs>t|tjstd|f|s4|s4td|fd|_dS)Nz%s cannot be partialz%s is partial but has no C nameT)rrZ StructOrUnionrZ has_c_namer.r)ryrrr r r r_s   zParser._make_partialcCst|tjjr8|j}d|dkr.dkrnn|d}z&|drTt|dWSt|dWSWndtk rt |dkr| ddd krt|d YS| ddd krt|dYSYnXt d |fn`|dd kr*|dd kr*t |dkst |dkr*|ddkr*t |dSt d |ft|tjj r`|jdkr`||jSt|tjj r|jdkr||j St|tjjr|j|jkr|j|jSt|tjjr|jdkr|rd|_dStd|jjt|tjjr||j}||j}|jdkr,||S|jdkr@||S|jdkrT||S|jdkrl|||S|jdkr|||||S|jdkr||>S|jdkr||?S|jdkr||@S|jdkr||BS|jd kr||AStd!|jjdS)"Nrr9ZuUlLr|rrrr0bzinvalid constant %r'rr \+rZ__dotdotdotarray__TrMzT:%d: unsupported '[...]' here, cannot derive the actual array length in this contextr/%z<>&|^z?:%d: unsupported expression: expected a simple numeric constant)rr rConstantrrrrErrrrordrrrrrr8rurrrr6ZBinaryOpleftright_c_div)ryrrrFr(r)r r r rfs                        zParser._parse_constantcCs0||}|dk|dkAr,||dkr,|d7}|S)Nrrr )ryabrr r r r*sz Parser._c_divc Cs|dk rd}g}g}d}|jD]X}t|jr4d}q|jdk rJ||j}||j||||j||d7}qt|}t|}t |||}||_ nt |dd}|S)NFrTrr ) enumerators_r_enum_dotdotdotr!r8rrrrrrZEnumTyper) ryrr rr-Z enumvaluesZ nextenumvaluerrr r r r s*       zParser._build_enum_typecCsr|jD]B\}\}}|dr"q |ddd}|dkr |j||d|dq |jD]\}}|||qXdS)Nzanonymous $enum_$rHrr)rrrZ anonymousreT)rr)rnrrrrrur)ryotherr8rrrkvr r r includes zParser.includecCs|jjj}|dgkr t|jS|dgkrL|jdkr@d|j|_t|jS|dgkrx|jdkrld|j|_t|jStd|j j dS)NrZ__dotdotdotint__z'typedef int... %s'Z__dotdotdotfloat__z'typedef float... %s'*:%d: unsupported usage of "..." in typedef) rrrZ unknown_typer8rwZUnknownIntegerTypeZUnknownFloatTyperrr6)ryr9rr r r rs           zParser._get_unknown_typecCs2|jjjjdgkrt|jStd|jjdS)Nrr3)rrrZunknown_ptr_typer8rrr6)ryr9r r r rs  zParser._get_unknown_ptr_type)FFNF)Fr)N)NFN)N)NF)F)r __module__ __qualname__rzrrrrrrrrrrrrrrrrrrrrrr*r r2rrr r r r rm's> &  7 3   i # v I rm)4rrZ commontypesrrerrorrrrr ImportErrorrqrsys version_infothread_thread allocate_lockrrr~compileDOTALL MULTILINErNrOr@rYr.rWrhr IGNORECASErrUrTrVr,rr\r]rr'r/r7r:rBrGrcrlobjectrmr r r r s`                 *2   B(