3 M •ZR™ã@sœddlmZddlmZmZddlmZmZyddlmZ Wne k rXddl Z YnXddl Z ddl Z ddl Z y(e jd#krˆddlZnddlZejƒZWne k r²dZYnXdZe jd e je jBƒZe jd e je jBƒZe jd ƒZe jd ƒZe jd ƒZe jdƒZdae jde jƒZe jdƒZ e jdƒZ!e jdƒZ"e jdƒZ#e jdƒZ$e jdƒZ%e jdƒZ&dd„Z'dd„Z(dd„Z)dd„Z*dd „Z+Gd!d"„d"e,ƒZ-dS)$é)Úmodel)Ú COMMON_TYPESÚresolve_common_type)ÚFFIErrorÚ CDefError)Ú _pycparseréNé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*\.\.\.cCstdkrtjƒatS)N)Ú _parser_cacheÚ pycparserZCParser©r r ú/usr/lib64/python3.6/cparser.pyÚ _get_parser*srcCs g}xòtj|ƒ}|sP|j|d|jƒ…ƒ|jdƒd}|j|jƒƒ|jƒ}|jd|ƒrn|jdƒ|d7}d}|}x`|t|ƒkrÖ||}|dkrž|d7}n.|dkrº|dkr°P|d8}n|dkrÌ|dkrÌP|d7}qxW|||…|||d…}qW|j|ƒdj|ƒS)Nú(ú)Ú*rrz,;=Ú) Ú_r_star_const_spaceÚsearchÚappendÚstartÚgroupÚendÚ startswithÚlenÚjoin)ÚcsourceÚpartsÚmatchÚclosingÚendposÚlevelÚiÚcr r r Ú_workaround_for_old_pycparser0s<          r$cCs0g}�xtj|ƒ}|sP|jƒd}|j|d|jƒ…ƒd|jdƒkrT|jdƒn |jdƒ||dkrÌ|jd|ƒ}|dkr†tdƒ‚|jd|d|ƒdkr¤td ƒ‚|j||d|…ƒ||dd…}nB|jd |ƒ}|dkrètd ƒ‚|j|||d…ƒ||dd…}|jd ƒqW|j|ƒd j |ƒS)NrÚCz(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_pythonrrrrrÚfindrÚNotImplementedErrorr)rrrr rZ semicolonr r r Ú_preprocess_extern_pythonZs4         r,c Cs\tjd|ƒ}i}x6tj|ƒD](}|jƒ\}}|jddƒjƒ}|||<qWtjd|ƒ}tjdkrft |ƒ}t jd|ƒ}t jd|ƒ}t jd|ƒ}t |ƒ}tjd|ƒ}ttj|ƒƒ}x†tt|ƒƒD]v\}}|jƒ}||dk�r|jd ||jƒƒ}d |d|…|||d d…f}qºd |d|…|||d d…f}qºWtjd |ƒ}tjd|ƒ}|jd dƒ|fS)Nú z\ rz2.14z volatile volatile const(z volatile volatile const z[__dotdotdotarray__]ú=z...z%s,__dotdotdot%d__ %sr z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )Ú _r_commentÚsubÚ _r_defineÚfinditerÚgroupsÚreplaceÚstripr Ú __version__r$Ú _r_stdcall2Ú _r_stdcall1Ú_r_cdeclr,Ú_r_partial_arrayÚlistÚ_r_partial_enumÚ enumerateÚreversedrr*rÚ_r_int_dotdotdotÚ_r_float_dotdotdot) rÚmacrosrZ macronameZ macrovalueZmatchesZnumberÚpZp2r r r Ú _preprocessŒs4           rCcCsttƒ}|jdƒ|jdƒ|jdƒ|jdƒ|jdƒtƒ}d}d}d}x®tj|ƒD] }||krô|dkrŠ|rô|j|ƒ|j|ƒd}nj|dkrœd }d}nX|dkr®|d 7}nF|dkrÀ|d 8}n4|dkrê|rô|dkrô|j|ƒ|j|ƒn |j|ƒ|}qXW|S) Nr(ú,rrÚtypedefFrrTr)ÚsetrÚaddÚ_r_wordsÚfindallÚdiscard)rZlook_for_wordsZ words_usedZ is_typedefZparenZ previous_wordZwordr r r Ú_common_type_namesÃs>             rKc@sêeZdZdd„Zdd„Zdd„Zdd„Zd8d d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zd9dd„Zdd „Zd:d"d#„Zd;d$d%„Zdd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd!S)?ÚParsercCs:i|_tƒ|_d|_tjƒ|_i|_i|_g|_ d|_ dS)Nr) Ú _declarationsrFÚ_included_declarationsÚ_anonymous_counterÚweakrefÚWeakKeyDictionaryÚ_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"Ú )rCrKÚsortedrMrrrJÚCDEF_SOURCE_STRINGrÚlockÚacquirerÚparser Zc_parserZ ParseErrorÚconvert_pycparser_errorÚrelease) rWrrAZctnÚ typenamesÚnameÚ csourcelinesÚtypenameZ fullcsourceÚastÚer r r Ú_parse÷s4          "  z Parser._parsecCsfd}t|ƒ}tjdtf|ƒ}|rbt|jdƒdƒ}|jƒ}d|koPt|ƒknrb||d}|S)Nz %s:(\d+):ré )ÚstrÚrerr\ÚintrÚ splitlinesr)rWrgrÚlineÚmsgrZlinenumrdr r r Ú_convert_pycparser_errors zParser._convert_pycparser_errorcCs@|j||ƒ}t|ƒ}|r*d|jƒ|f}n d|f}t|ƒ‚dS)Nzcannot parse "%s" %szparse error %s)rprjr5r)rWrgrrnror r r r`+s   zParser.convert_pycparser_errorFc Cs0|j}z|||dœ|_|j|ƒWd||_XdS)N)ÚoverrideÚpackedÚ dllexport)rSÚ_internal_parse)rWrrqrrrsZ prev_optionsr r r r_5s z Parser.parsec Cs|j|ƒ\}}}|j|ƒt|jƒ}x|D]}|jdkr*Pq*Wd}�yBd|_�x4|D�]*}|}t|tjj ƒrx|j |ƒqTt|tjj ƒ�r^|js˜t d|ƒ‚d}t|j j tjjƒrÎ|j j jdjdƒrÎ|j|ƒ}nxt|j tjjƒ�r.t|j j tjjƒ�r.t|j j j tjjƒ�r.|j j j jdjdƒ�r.|j|ƒ}n|j|j |jdd�\}}|jd |j||d �qT|jjd k�rnqTt d |jj|ƒ‚qTWWn�t k �rÊ} z&t| jƒdk�r¸| j|f| _‚WYdd} ~ XnNtk �r} z0|j| |ƒ} | �r| jdd | f| _‚WYdd} ~ XnXdS)NÚ __dotdotdot__Ú__cffi_extern_python_stopz!typedef does not declare any namerrZ __dotdotdotT)rcÚpartial_length_okztypedef )ÚqualsZPragmazBunexpected <%s>: this construct is valid C but not valid in cdef()z *** Err: %séÿÿÿÿry)rhÚ_process_macrosÚiterÚextrcÚ_inside_extern_pythonÚ isinstancer Úc_astZDeclÚ _parse_declZTypedefrÚtypeÚIdentifierTypeÚnamesrÚ_get_unknown_typeÚPtrDeclÚTypeDeclÚ_get_unknown_ptr_typeÚ_get_type_and_qualsÚ_declareÚ __class__Ú__name__rÚargsrrp) rWrrfrAÚiteratorÚdeclZ current_declrxZrealtypergror r r rt?sV          zParser._internal_parsecCs8||jkr*|j||krdStd|fƒ‚||j|<dS)Nz%multiple declarations of constant: %s)rTr)rWÚkeyÚvalr r r Ú_add_constantsus   zParser._add_constantscCsŠ|jƒjdƒ}|jdƒ}|r(|dd…}|jdƒrV|dkrV|jdƒ rVd|dd…}t|dƒ}|rj| }|j||ƒ|jd||ƒdS) NZulú-rÚ0Ú0xZ0orzmacro )ÚlowerÚrstriprrlr‘r‰)rWrcZint_strÚnegZpyvaluer r r Ú_add_integer_constant}s     zParser._add_integer_constantcCshxb|jƒD]V\}}|jƒ}tj|ƒr2|j||ƒq |dkrL|jd||ƒq td||||fƒ‚q WdS)Nz...zmacro z¶only 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)Úitemsr5Ú_r_int_literalrr˜r‰r)rWrAr�Úvaluer r r rzŒs zParser._process_macroscCsX|j||ƒ}|jjdƒrd}n$|jdkr.d}n|jdkr>d}nd}|j||j|ƒdS)Nrszdllexport_python Z__cffi_extern_python_startzextern_python Z!__cffi_extern_python_plus_c_startzextern_python_plus_c z function )Ú_get_type_pointerrSÚgetr}r‰rc)rWÚtprxrŽÚtagr r r Ú_declare_function�s    zParser._declare_functioncCsø|j}t|tjjƒr:|j||jd�\}}|j|||ƒ�nºt|tjjƒrV|j d|ƒnHt|tjj ƒrr|j d|ƒn,t|tjj ƒrŽ|j d|ƒn|jsžt d|ƒ‚|j�rô|j|dd�\}}|j rÐ|j|||ƒ�n$|jƒoút|dƒoút|jd ƒoútj|jjƒ�r|j|j|jjƒnâ|jƒ�rxt|jtjjƒ�rx|jjd k�rxt|jjd ƒ�rxtj|jjjƒ�rx|j|jd |jjjƒn||tjk�rœ|jjd ƒ�rœ|j|_nX|jd k�r°t d ƒ‚|tj@�rÞ|j �rÞ|jd|j||d�n|jd|j||d�dS)N)rcÚstructÚunionÚenumz'construct does not declare any variableT)rwÚinitr›r’Z__cffi_extern_python_rvz|sz/Parser._parse_function_type..rxr rºr¹Z __stdcallryryryéýÿÿÿ)r;ÚgetattrrŒr=rªrrr~r�r rr†r‚rƒÚpoprr®rˆrxr½Útuple) rWrÏÚfuncnamer´r"ÚargZellipsisrŒÚresultrxÚabir )rWr rÎgs6       zParser._parse_function_typecCs6t|tjƒrtj|j|ƒSt|tjƒr.|jƒS|SdS)N)r~rrËrÁÚitemr½r¾)rWr�rxr r r rÓŠs   zParser._as_func_argc Cs,y |j|Stk rYnX|}|j}|dkrb|dk rDd|}n|jd7_d|j}d}n"|}d||f}|jj|dƒ\}} |dk�r|dkr¨tj|dddƒ}nP|dkrÂtj|dddƒ}n6|dkrê|dkrÚt d ƒ‚|j ||j ƒ}nt d |fƒ‚|dk �r2|j ||ƒn"|dk�r2|j dk �r2td |ƒ‚|j�sD|j|ƒ|j�rjd |jk�rj|j d |j|ƒ||j|<|dk�r‚|S|jdk�r’|S|jdk �rªt d|ƒ‚g} g} g} g} xä|jD]Ú}t|jtjjƒ�rüdj|jjƒdk�rü|j||ƒ�qÂ|jdk�rd}n |j|jƒ}d|_|j|jdd�\}}|j�rH|j||ƒt|tjƒ�rj|j�rj|j||ƒ| j |j�pxdƒ| j |ƒ| j |ƒ| j |ƒ�qÂWt!| ƒ|_t!| ƒ|_"t!| ƒ|_#t!| ƒ|_$| dgt%| ƒk�rt|tjƒ�r|j�rtd|fƒ‚|j&jdƒ|_'|j(�r(d|_(|j)j |ƒ|S)Nz$%srz$%dz%s %sr¡r¢r£ruz!Enums cannot be declared with ...z kind = %rz^enum %s: the '{}' declaration should appear on the first time the enum is mentioned, not laterr¼z anonymous %sz"duplicate declaration of struct %srFT)rwz#%s: using both bitfields and '...;'rrr)NNryry)*rRÚKeyErrorrcrOrMr�rZ StructTypeZ UnionTyperÚ_build_enum_typeÚvaluesÚAssertionErrorr‰r+rÀZforce_the_nameÚdeclsÚfldnamesr~r�r rr‚rrƒÚ _make_partialÚbitsizerÊÚ_partial_lengthrˆÚpartialrrÙÚfldtypesÚ fldbitsizeÚfldqualsrrSrrZ completedrU)rWÚkindr�rcrÉZ force_nameÚ explicit_nameržr�Ú_rärérêrërŽræZfqualr r r r§’sœ                             z"Parser._get_struct_union_enum_typecCsBt|tjƒstd|fƒ‚|jƒ r8| r8td|fƒ‚d|_dS)Nz%s cannot be partialz%s is partial but has no C nameT)r~rZ StructOrUnionrZ has_c_namer+rè)rWržrÉr r r rås  zParser._make_partialcCsòt|tjjƒrÂ|j}|jdƒrF|jdƒs2|jdƒrsN               *27(