
    Mh                     l   d dl mZ d dlmZmZ d dlmZmZ 	 d dl mZ	 n# e
$ r ddl	Z	Y nw xY wddlZddlZddlZ	 ej        dk     rddlZnddlZ ej                    Zn# e
$ r dZY nw xY wd Zd	Z ej        d
ej        ej        z            Z ej        dej        ej        z            Z ej        dej                  Z ej        d          Z ej        d          Z ej        d          Z ej        d          Zda ej        dej                   Z! ej        d          Z" ej        d          Z# ej        d          Z$ ej        d          Z% ej        d          Z& ej        d          Z' ej        d          Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d  Z0d! Z1 G d" d#e2          Z3dS )$   )model)COMMON_TYPESresolve_common_type)FFIError	CDefError)
_pycparser    N)   c                      dd l } dd l} d S Nr	   )pycparser.yacctabpycparser.lextab)	pycparsers    L/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/cffi/cparser.py%_workaround_for_static_import_findersr      s"         z<cdef source string>z/\*.*?\*/|//([^\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*\.\.\.c                  D    t           t          j                    a t           S N)_parser_cacher   CParser r   r   _get_parserr   2   s    !)++r   c                    g }	 t                               |           }|sn,|                    | d |                                                    |                    d           d}|                    |                                           |                                }|                     d|          r|                    d           |dz  }d}|}|t          |           k     rJ| |         }|dk    r|dz  }n|dk    r|dk    rn)|dz  }n|dv r|dk    rn|dz  }|t          |           k     J| ||         |z   | |d          z   } J|                    |            d                    |          S )	NT()*r	   r   z,;= )	_r_star_const_spacesearchappendstartgroupend
startswithlenjoin)csourcepartsmatchclosingendposlevelics           r   _workaround_for_old_pycparserr/   8   s    E<#**733 	W^ekkmm^,---SS7U[[]]###c6** 	.LLw#~w#g,,
ACxx
cA::
eA::FA #g,, &(#g-;3<6 
LL775>>r   c                    g }	 t                               |           }|sn|                                dz
  }|                    | d |                                                    d|                    d          v r|                    d           n|                    d           | |         dk    r|                     d|          }|dk     rt          d	          |                     d|dz   |          dk    rt          d
          |                    | |dz   |                    | |dz   d          } nX|                     d|          }|dk     rt          d          |                    | ||dz                       | |dz   d          } |                    d           |                    |            d	                    |          S )NTr   Cz(void __cffi_extern_python_plus_c_start; z!void __cffi_extern_python_start; {}r	   z!'extern "Python" {': no '}' foundz7cannot use { } inside a block 'extern "Python" { ... }';z'extern "Python": no ';' foundz  void __cffi_extern_python_stop;r   )
_r_extern_pythonr   r#   r    r!   r"   findr   NotImplementedErrorr&   )r'   r(   r)   r+   r*   	semicolons         r   _preprocess_extern_pythonr9   b   s    E9 ''00 	q 	W^ekkmm^,---%++a..  LLCDDDDLL<===6?c!!ll3//G{{ EFFF||C!W55::) +H I I ILL'!12333gaijj)GG  S&11I1}} BCCCLL	!!34555ikll+G7888=9B 
LL775>>r   c                     d| vrd S |                                  D ]I}d|v rC|                                                    d          sdd l}|                    d            d S Jd S )N"#r	   zString 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.)
splitlineslstripr$   warningswarn)r'   liner?   s      r   _warn_for_string_literalrB      s    
'""$$  $;;t{{}}77<<;OOOMM 1 2 2 2 EE r   c                 \    | j         s$dd l}|                    d| j        d           d S d S )Nr	   zGlobal variable 'z_' in cdef(): for consistency with C it should have a storage class specifier (usually 'extern'))storager?   r@   name)declr?   s     r   /_warn_for_non_extern_non_static_global_variablerG      sO    < ;.2iii: 	; 	; 	; 	; 	;; ;r   c                 P    g fd}t                               ||           } | fS )Nc                 z    t                    }                    |                                            d|z  S )Nz#line@%d)r%   r    r"   )mr-   line_directivess     r   replacez(_remove_line_directives.<locals>.replace   s6      qwwyy)))A~r   _r_line_directivesub)r'   rL   rK   s     @r   _remove_line_directivesrP      sE    
 O      ##GW55GO##r   c                 D    fd}t                               ||           S )Nc                     |                                  }|                    d          st          d          t          |dd                             S )Nz#line@zBunexpected #line directive (should have been processed and removed   )r"   r$   AssertionErrorint)rJ   srK   s     r   rL   z*_put_back_line_directives.<locals>.replace   sY    GGII||H%% 	L  "K L L Ls1QRR5zz**r   rM   )r'   rK   rL   s    ` r   _put_back_line_directivesrW      s4    + + + + +   '222r   c                 8   t          |           \  } }d }t                              ||           } i }t                              |           D ]F}|                                \  }}|                    dd                                          }|||<   Gt                              d|           } t          j	        dk     rt          |           } t                              d|           } t                              d|           } t                              d|           } t          |           } t          |            t                               d|           } t#          t$                              |                     }t'          t)          |                    D ]\  }}|                                }	| |	         d	k    rM|                     d
|	|                                          }
|
|	k    sJ d| d |	         || |
dz   d          fz  } r| |	|	dz            d
k    sJ d| d |	         || |	dz   d          fz  } t0                              d|           } t2                              d|           } |                     d
d          } t5          | |          } | |fS )Nc                 \    d|                                                      d          dz  z   S )N 
)r"   count)rJ   s    r   replace_keeping_newlinesz-_preprocess.<locals>.replace_keeping_newlines   s&    QWWYY__T**T111r   z\
r   z2.14z volatile volatile const(z volatile volatile const rZ   z[__dotdotdotarray__]=...z%s,__dotdotdot%d__ %sr
   z%s __dotdotdot%d__ %sz __dotdotdotint__ z __dotdotdotfloat__ z __dotdotdot__ )rP   
_r_commentrO   	_r_definefinditergroupsrL   stripr   __version__r/   _r_stdcall2_r_stdcall1_r_cdeclr9   rB   _r_partial_arraylist_r_partial_enum	enumeratereversedr!   r6   r#   _r_int_dotdotdot_r_float_dotdotdotrW   )r'   rK   r]   macrosr)   	macroname
macrovaluematchesnumberpp2s              r   _preprocessrw      s     7w??G_2 2 2nn5w??GF##G,, ' ' %	:''3399;;
&ymmB((Gv%%/88 oo97CCGoo97CCGll3((G (00G W%%% ""#97CCG ?++G4455G"8G#4#455 
@ 
@KKMM1:eQ		44B6666-!f18A1A AGG 1QqS5>U****-!f1811@ @GG ""#7AAG $$%;WEEG ooe%677G'AAGF?r   c                    t          t                    }|                    d           |                    d           |                    d           |                    d           |                    d           t                      }d}d}d}t                              |           D ]}||v r|dk    r/|r,|                    |           |                    |           d}nq|dk    rd	}d}nf|dk    r|d
z  }nZ|dk    r|d
z  }nN|dk    r3|r0|dk    r*|                    |           |                    |           n|                    |           |}|S )Nr4   ,r   r   typedefFr	   r   Tr   )setr   add_r_wordsfindalldiscard)r'   look_for_words
words_used
is_typedefparenprevious_wordwords          r   _common_type_namesr      s    &&Nssssy!!!JJEM  ))  >!!s{{ '&&}555"**=999!&J""!


 :%1**&&}555"**=999t$$$r   c                       e Zd Zd Zd Zd Zd Z	 	 ddZd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd dZd Zd!dZ	 	 d"dZd!dZd Zd#dZd Zd$dZd Zd Zd Zd Zd ZdS )%Parserc                     i | _         t                      | _        d| _        t	          j                    | _        i | _        i | _        g | _	        d | _
        d S r   )_declarationsr{   _included_declarations_anonymous_counterweakrefWeakKeyDictionary_structnode2type_options_int_constants_recomplete_uses_new_feature)selfs    r   __init__zParser.__init__)  sT    &)ee#"# ' 9 ; ; !%r   c                    t          |          \  }}t          |          }g }t          | j                  D ]K}|                    d          r4|dd          }|                    |           |                    |           L|t          |          z  }g }|                    d           |D ]}|                    d|z             |                    d           |                    dt          d           |                    |           |                    d           d	                    |          }t          t          
                                 	 t                                          |          }	n7# t          j        j        $ r }
|                     |
|           Y d }
~
nd }
~
ww xY wt          t                                           n&# t          t                                           w w xY w|	||fS )
Ntypedef    z*# 1 "<cdef automatic initialization code>"ztypedef int %s;z@typedef int __dotdotdotint__, __dotdotdotfloat__, __dotdotdot__;z# 1 "r;   r   r[   )rw   r   sortedr   r$   r    r   CDEF_SOURCE_STRINGr&   lockacquirer   parser   c_parser
ParseErrorconvert_pycparser_errorrelease)r   r'   rp   ctn	typenamesrE   csourcelinestypenamefullcsourceastes              r   _parsezParser._parse3  s   %g..
 !))	4-.. 	" 	"Dz** "ABBx  &&&D!!!VC[[ 	HIII! 	> 	>H 1H <==== . 	/ 	/ 	/ 	*<*<*<>???G$$$Bii--LLNNN	--%%k22CC!, 	5 	5 	5((G44444444	5     FG##s0   !E? >G ?F3F.)G .F33G #G:c                 $   d }t          |          }t          j        t          d|          }|r_t	          |                    d          d          }|                                }d|cxk    rt          |          k    rn n||dz
           }|S )Nz:(\d+):r   
   )strrer)   r   rU   r"   r=   r%   )r   r   r'   rA   msgr)   linenumr   s           r   _convert_pycparser_errorzParser._convert_pycparser_errorZ  s     !ff);););=sCC 	/%++a.."--G"--//LG0000s<0000000#GAI.r   c                     |                      ||          }t          |          }|rd|                                d|}nd|}t          |          )Nzcannot parse "z"
zparse error
)r   r   rd   r   )r   r   r'   rA   r   s        r   r   zParser.convert_pycparser_errorh  sf    ,,Q88!ff 	- 	--1ZZ\\\\33?CC	- (+s,Cnnr   FNc                    |r)|dk    rt          d          |rt          d          d}n|r||dz
  z  rt          d|          nd}| j        }	 |||d| _        |                     |           || _        d S # || _        w xY w)NTzB'packed' should be False or True; use 'pack' to give another valuez$cannot give both 'pack' and 'packed'r   z#'pack' must be a power of two, not r	   )overridepacked	dllexport)
ValueErrorr   _internal_parse)r   r'   r   r   packr   prev_optionss          r   r   zParser.parser  s     	~~  "@ A A A I !GHHHDD 	tax   jT"    D}	))1'+*35 5DM   )))(DMMMLDM((((s    A< <	Bc           	      (   |                      |          \  }}}|                     |           t          |j                  }|D ]}|j        dk    r nJ d }	 d| _        |D ]3}|}t          |t          j        j	                  r| 
                    |           :t          |t          j        j                  r|j        st          d|          d}t          |j        j        t          j        j                  r@|j        j        j        d                             d          r|                     |          }nt          |j        t          j        j                  rt          |j        j        t          j        j                  rst          |j        j        j        t          j        j                  rE|j        j        j        j        d                             d          r|                     |          }n/|                     |j        |j        dd|j        d	
          \  }}|                     d|j        z   ||           |j        j        dk    rdd l}	|	                    d           t          d|j        j        z  |          d S # t          $ r.}
t7          |
j                  dk    r|
j        |fz   |
_         d }
~
wt:          $ r7}
|                     |
|          }|r|
j        d         d|z  z   f|
_         d }
~
ww xY w)N__dotdotdot__r	   __cffi_extern_python_stopz!typedef does not declare any name__dotdotdotTz*(z *)0)rE   partial_length_oktypedef_exampler   qualsPragmaa  #pragma in cdef() are entirely ignored. They should be removed for now, otherwise your code might behave differently in a future version of CFFI if #pragma support gets added. Note that '#pragma pack' needs to be replaced with the 'packed' keyword argument to cdef().zBunexpected <%s>: this construct is valid C but not valid in cdef()r   z
    *** Err: %s)r   _process_macrositerextrE   _inside_extern_python
isinstancer   c_astDecl_parse_declTypedefr   typeIdentifierTypenamesr$   _get_unknown_typePtrDeclTypeDecl_get_unknown_ptr_type_get_type_and_quals_declare	__class____name__r?   r@   r%   argsr   r   )r   r'   r   rp   iteratorrF   current_declr   realtyper?   r   r   s               r   r   zParser._internal_parse  s^   #{{733VWV$$$ == 	 	DyO++ , H/	)DD&  $C $C#dIO$899 "C$$T****io&=>>  C9 .'(K(,. . .E"49>9?3QRR G IN04??NNG#'#9#9$#?#?$TY	0GHH 	G$TY^Y_5MNN	G$TY^%8%._%CE E	G ).-3B7BB=QQ		G
 $(#=#=d#C#C*.*B*B IDI:>))),E +C +G +G% MM*ty"8(%MPPPP^,88#OOOMM?@ @ @ @ $ %@$(N$;%<=AC C CE$C $CJ  	 	 	16{{a</1 	 	 	//7;;C B&)&9C&??A		s%   H>J 
L$)KL2LLc                 v    || j         v r%| j         |         |k    rd S t          d|          || j         |<   d S )Nz#multiple declarations of constant: )r   r   )r   keyvals      r   _add_constantszParser._add_constants  sZ    $%%%"3'3..(;>3@B B B#&C   r   c                    |                                                     d          }|                    d          }|r
|dd          }|                    d          r(|dk    r"|                    d          sd|dd          z   }t          |d          }|r| }|                     ||           |                     d|z   |           d S )	Nul-r   00x0or	   macro )lowerrstripr$   rU   r   r   )r   rE   int_strnegpyvalues        r   _add_integer_constantzParser._add_integer_constant  s    --//((..  %% 	"abbkGs## 	)3**400 )7WQRR[(Ggq// 	hGD'***how/////r   c                 8   |                                 D ]\  }}|                                }t                              |          r|                     ||           J|dk    r|                     d|z   |           jt          d|d|d|d|          d S )Nr_   r   z5only supports one of the following syntax:
  #define z+ ...     (literally dot-dot-dot)
  #define zM NUMBER  (with NUMBER an integer constant, decimal/hex/octal)
got:
  #define rZ   )itemsrd   _r_int_literalr)   r   r   r   )r   rp   r   values       r   r   zParser._process_macros  s     ,,.. 	. 	.JCKKMME##E** .**36666%hne4444i ssCCCee-. . .	. 	.r   c                     |                      ||          }| j                            d          rd}n| j        dk    rd}n| j        dk    rd}nd}|                     ||j        z   |           d S )Nr   zdllexport_python __cffi_extern_python_startzextern_python !__cffi_extern_python_plus_c_startzextern_python_plus_c z	function )_get_type_pointerr   getr   r   rE   )r   tpr   rF   tags        r   _declare_functionzParser._declare_function  s    ##B..=[)) 	%CC'+GGG"CC'+NNN)CCCcDIor*****r   c                    |j         }t          |t          j        j                  rT|                     ||j                  \  }}t          |t          j                  sJ | 	                    |||           d S t          |t          j        j
                  r|                     d|           nt          |t          j        j                  r|                     d|           nMt          |t          j        j                  r|                     d|           n|j        st          d|          |j        r1|                     |d          \  }}|j        r| 	                    |||           d S |                                rpt#          |d          r`t#          |j        d	          rKt&                              |j        j                  r'|                     |j        |j        j                   d S |                                rt          |j        t          j        j                  r|j        j        d
k    rrt#          |j        j        d	          rXt&                              |j        j        j                  r/|                     |j        d
|j        j        j        z              d S |t          j        u r(|j                            d          r|j        | _        d S | j        dk    rt          d          |t          j        z  r)|j        s"|                     d|j        z   ||           d S tA          |           |                     d|j        z   ||           d S d S )N)rE   structunionenumz'construct does not declare any variableTr   initr   r   __cffi_extern_python_r   z<cannot declare constants or variables with 'extern "Python"'z	constant r   z	variable )!r   r   r   r   FuncDeclr   rE   r   RawFunctionTyper   Struct_get_struct_union_enum_typeUnionEnumr   is_raw_functionis_integer_typehasattrr   r   r)   r   r   UnaryOpopexpr	void_typer$   r   Q_CONSTis_array_typer   rG   )r   rF   noder   r   s        r   r   zParser._parse_decl  s   ydIO455 /	P00DI0FFIBb%"788888""2ud33333$	 677 &004@@@@D)/"788 &00$????D)/"677 &00>>>>Y & I $& & & y  P 44TGK 5 M M	E% P**2ud;;;;;((** Pf--P	733P ',,TY_==P ..ty$)/JJJJJ((** P"49io.EFFP	++	88 ,&,,TY^-ABB , ..ty/2TY^5I/IK K K K KEO++i**+BCC ,
 26D...14OOO'AB B B - Pr7G PkDI&=rOOOOOGMMMkDI&=rOOOOOA P  Pr   c                 8    |                      |          d         S r   )parse_type_and_quals)r   cdecls     r   
parse_typezParser.parse_type0  s    ((//22r   c                 6   |                      d|z            d d         \  }}|rJ |j        d         j        j        j        d         }t          |t          j        j                  rt          d|j
        d          |                     |j                  S )Nzvoid __dummy(
%s
);   r   r	   zunknown identifier '')r   r   r   r   paramsr   r   r   IDr   rE   r   )r   r  r   rp   exprnodes        r   r  zParser.parse_type_and_quals3  s    kk"9E"ABB2A2FV72;#(/2h	 233 	J)HIII''666r   r	   c                 .   || j         v rI| j         |         \  }}||u r||k    rd S | j                            d          st          d|d          d|                                vsJ ||f| j         |<   |r| j                            |           d S d S )Nr   zmultiple declarations of z5 (for interactive usage, try cdef(xx, override=True))r   )r   r   r   r   splitr   r|   )r   rE   objincludedr   prevobj	prevqualss          r   r   zParser._declare;  s    4%%%!%!3D!9GY#~~)u"4"4=$$Z00 >h6:dd=> > > djjll2222$'<4  	1'++C00000	1 	1r   c                     d}t          |t          j        j        t          j        j        f          rHd|j        v r|t          j        z  }d|j        v r|t          j        z  }d|j        v r|t          j	        z  }|S )Nr	   constvolatilerestrict)
r   r   r   r   r   r   r   r  
Q_VOLATILE
Q_RESTRICTr   r   r   s      r   _extract_qualszParser._extract_qualsI  s    dY_5&_46 7 7 	*$*$$&TZ''))TZ''))r   c                 p   t          |t          j                  r|                                S t          |t          j                  rZ|j                            d          r@|j        dd                                          r|j        |t          j	        |||          S t          j
        ||          S )N$r   )r   r   r  as_function_pointerStructOrUnionOrEnumrE   r$   isdigit	forcenameNamedPointerTypePointerType)r   r   r   declnames       r   r   zParser._get_type_pointerU  s    dE122 	.++---tU677 	A	$$S))	A.2im.C.C.E.E	A&8+?)$%@@@ u---r   c                 4	   t          |t          j        j                  rt          |j        t          j        j                  rxt          |j        j                  dk    r[d|j        j        d         z   | j        v r?| j        d|j        j        d         z            \  }}|| 	                    |          z  }||fS t          |t          j        j
                  rp|j        d }n|                     |j        |          }||dk    rd|d}d|z   }|                     |j        ||	          \  }}t          j        ||          |fS t          |t          j        j                  rN|                     |j                  \  }}	|                     ||	|
          }| 	                    |          }||fS t          |t          j        j                  r| 	                    |          }|j        }
t          |
t          j        j                  rt%          |
j                  }|ddgk    ri }|r/|d         }|dv r |                    |d          dz   ||<   |d= nn|/g }dD ]=}t)          |                    |d                    D ]}|                    |           >|sdg}|dgk    r
d|v sd|v rg }||z   }d                    |          }|dk    rt          j        |fS |dk    rt1          d|j        j        z            t7          | |          \  }}|||z  fS t          |
t          j        j                  r|                     d|
|          }||fS t          |
t          j        j                  r|                     d|
|          }||fS t          |
t          j        j                  r|                     d|
|          }||fS t          |t          j        j                   r| !                    ||          dfS t          |t          j        j                  r|                     d||d          dfS t          |t          j        j                  r|                     d||d          dfS t1          d|j        j        z            )Nr   r   r	   r   r_   z_cffi_array_len(r   r   )r   r   )r0  signedchar)shortlongr2  unsigned)r6  r4  r5  rU   r4  r5  rZ   voidr   z:%d: bad usage of "..."r   r   r   T)nestedz(:%d: bad or unsupported type declaration)"r   r   r   r   r   r   r%   r   r   r'  	ArrayDecldim_parse_constantr   r   	ArrayTyper   r   rj   r   ranger    r&   r  r   coordrA   r   r  r  r  r  r   _parse_function_type)r   typenoderE   r   r   r   r   lengthitemtype	itemqualsr   r   prefixesnewnamesprefixr-   identtp0quals0s                      r   r   zParser._get_type_and_quals^  s$    x!9:: 	x}io&DEE	#$$))(--a00T5GGG*:8KA8N+NOIBT((222Eu9h	 9:: 	6|#--L4E . G G *U???6EooGF"%"7002C0? 1 A AIB ?2v..55h	 788 	"&":":8="I"IHi'')d'KKB''11Eu9h	 899 1	!''11E=D$	 >?? - TZ((Xv...!H "$Qx#JJJ-5\\$-B-BQ-FHTN %a!   "  "H"? 4 4!&x||FA'>'>!?!? 4 4A$OOF33334  (!&''"h..&H2D2D$&E$u,EF?? ?E11O++"#<$N/$0 1 1 11$>>VUV^,,$	 677 !55hdKK5y $	 566 !55gtTJJ5y $	 455 !55fdDII5y h	 899 	@,,Xt<<a?? h	 677 	D33Hh;? 4 A ABCD Dh	 566 	D33GXt;? 4 A ABCD D A#$ % % 	%r   c                 |    t          t          |j        dg                     }t          |          D ]>\  }}t	          |d          s)t          d|pd|dz   t          |dd          fz            ?t          |          dk    ott          |d	         j        t          j
        j                  oJt          |d	         j        j        t          j
        j                  o|d	         j        j        j        d
gk    }|r*|                                 |st          d|pdz             fd|D             }|s|t          j        gk    rg }                     |j                  \  }}	d }
t	          |j        d          r|j        j        dd          g dk    rd}
t          j        t)          |          |||
          S )Nr  r   zt%s arg %d: unknown type '%s' (if you meant to use the old C syntax of giving untyped arguments, it is not supported)zin expressionr   rE   ?r	   r   r   z=%s: a function with only '(...)' as argument is not correct Cc                 T    g | ]$} j                             |j                   %S r   )_as_func_argr   r   ).0argdeclnoder   s     r   
<listcomp>z/Parser._parse_function_type.<locals>.<listcomp>  sD     + + + "!4#;#;K<L#M#MN + + +r   r   )r"  r"  r!  	__stdcall)rj   getattrr   rl   r  r   r%   r   r   r   r   r   r   r   popr   r  r   r   r  tuple)r   r@  funcnamer  r-   argellipsisr   resultr   abis   `          r   r?  zParser._parse_function_type  s   ghmXr::;;'' 	3 	3FAs3'' 3 !?  2?AEsFC002!2 3 3 33 KK!O <vbz	(@AA<vbz+ 57 7< 2JO &?*;; 	  	IJJLLL I(+3+FHI I I+ + + +#)+ + + 	DU_$555D00?? 8='** 	"}"233'+L+L+LLL!$U4[[&(CHHHr   c                     t          |t          j                  rt          j        |j        |          S t          |t          j                  r|                                S |S r   )r   r   r<  r/  itemr  r*  r&  s      r   rM  zParser._as_func_arg  sW    dEO,, 	$TY666e344 	++---Kr   c                    	 | j         |         S # t          $ r Y nw xY w|}|j        }|%|d|z  }n| xj        dz  c_        d| j        z  }d }n'|}|d|}| j                            |d          \  }}	||dk    rt          j        |d d d           }ng|dk    rt          j        |d d d           }nI|dk    r1|d	k    rt          d
          | 
                    ||j                  }nt          d|          ||                     ||           n|dk    r|j        t          d|z            |j        s|                    |           |j        r'd|j        v r|                     d|j        z  |           || j         |<   |dk    r|S |j        |S |j        t          d|z            g }
g }g }g }|j        D ]Z}t'          |j        t*          j        j                  r:d                    |j        j                  d	k    r|                     ||           a|j        d}n|                     |j                  }d| _        |                     |j        d          \  }}| j        r|                     ||           t'          |t          j                  r|j        r|                     ||           |
                     |j        pd           |                     |           |                     |           |                     |           \tC          |
          |_        tC          |          |_"        tC          |          |_#        tC          |          |_$        |dgtK          |          z  k    r3t'          |t          j                  r|j        rt          |d          | j&                            d          |_'        |j(        r!d|_(        | j)                             |           |S )Nz$%sr   z$%drZ   )NNr   r   r   r   z!Enums cannot be declared with ...zkind = z^enum %s: the '{}' declaration should appear on the first time the enum is mentioned, not laterr)  zanonymous %sz"duplicate declaration of struct %sr   r   FTr   z!: using both bitfields and '...;'r   r	   )*r   KeyErrorrE   r   r   r   r   
StructType	UnionTyper   _build_enum_typevaluesrT   r   r7   r-  force_the_namedeclsfldnamesr   r   r   r   r   r&   r   _make_partialbitsizer;  _partial_lengthr   partialr    rU  fldtypes
fldbitsizefldqualsr%   r   r   	completedr   )r   kindr   rE   r8  
force_nameexplicit_namer   r   _re  rj  rk  rl  rF   rg  fquals                    r   r  z"Parser._get_struct_union_enum_type  sr   	(.. 	 	 	D	 
y < % %
 2''1,'' %(? ?BB M!TT44(C&**3==EB:x%mT4FF_]D$EE O33#$GHHH**=$+FF$nDD%:;;;c2&&&v~~$+"9)<>KLM M M | 	*j)))< 	=C27NNMM.2<7<<<&(d# 6>>I
 :I;"@4GHHH
J 	# 	#D49io&DEE GGDIO,,?? ""2v...|#..t|<<#(D 2249EI 3 K KKD%# /""2v...$ 011 /dl /""2v...OODIO,,,OOD!!!g&&&OOE""""HooHooj))Hoo"J///"e.// 3BJ 3)-/RR+2 3 3 3M%%h//	< 	(BL##B'''	s    
c                     t          |t          j                  st          |d          |                                s|st          |d          d|_        d S )Nz cannot be partialz is partial but has no C nameT)r   r   StructOrUnionr   
has_c_namer7   ri  )r   r   r8  s      r   rf  zParser._make_partialh  se    "e122 	<bbb:;;;}} 	Pv 	P%"""&NOOO


r   c                    t          |t          j        j                  rr|j        }d|d         cxk    rdk    rn n|                    d          }	 |                    d          rt          |d          S t          |d          S # t          $ rz t          |          dk    rd|
                                dd         d	k    rt          |d
          cY S |
                                dd         dk    rt          |d          cY S Y nw xY wt          d|          |d         dk    rS|d         dk    rGt          |          dk    st          |          dk    r!|d         dk    rt          |d                   S t          d|          t          |t          j        j                  r%|j        dk    r|                     |j                  S t          |t          j        j                  r&|j        dk    r|                     |j                   S t          |t          j        j                  r |j        | j        v r| j        |j                 S t          |t          j        j                  r2|j        dk    r'|r	d| _        dS t+          d|j        j        z            t          |t          j        j                  r|                     |j                  }|                     |j                  }|j        dk    r||z   S |j        dk    r||z
  S |j        dk    r||z  S |j        dk    r|                     ||          S |j        dk    r||                     ||          |z  z
  S |j        dk    r||z  S |j        dk    r||z	  S |j        dk    r||z  S |j        dk    r||z  S |j        d k    r||z  S t+          d!|j        j        z            )"Nr   r	   9uUlLr   r   r   r  r      0bzinvalid constant r  r   r
      \+r   __dotdotdotarray__Tr_   zT:%d: unsupported '[...]' here, cannot derive the actual array length in this contextr   /%z<<z>>&|^z?:%d: unsupported expression: expected a simple numeric constant)r   r   r   Constantr   r   r$   rU   r   r%   r   r   ordr	  r
  r;  r  r  rE   r   rh  r   r>  rA   BinaryOpleftright_c_div)r   r  r   rV   r  r  s         r   r;  zParser._parse_constanto  s    h	 899 	>Aad!!!!c!!!!!HHV$$
-||C(( *"1ayy("1bzz)! - - -1vvzz7799QqS>T11#&q"::---WWYYqs^t33#&q!99,,,-  i <===12#FFaKKCFFaKKAaDDLL1R5zz!i <===x!899 	7s""''666x!899 	8s""((7777x!344 	6!444&x}55x!344 	2M%999  '+$u E%^01 2 2 2 h	 899 	$''66D((88E{c!!e|###e|###e|###{{4///##dkk$66>>>$$u}$$$u}$##e|###e|###e|# 13;>3FG H H 	Hs   $B	 9B	 	AD0DDc                 F    ||z  }|dk     |dk     z  r||z  dk    r|dz  }|S )Nr	   r   r   )r   abrY  s       r   r  zParser._c_div  s:    aUq1u 	AEa<<aKFr   c                    |d}g }g }d}|j         D ]}t                              |j                  rd}$|j        |                     |j                  }|                    |j                   |                    |           |                     |j        |           |dz  }t          |          }t          |          }t          j
        |||          }||_        nt          j
        |dd          }|S )NFr	   Tr   r   )enumerators_r_enum_dotdotdotr)   rE   r   r;  r    r   rU  r   EnumTyperi  )	r   rp  rd  ri  r  
enumvaluesnextenumvaluer   r   s	            r   ra  zParser._build_enum_type  s   GKJM) 	# 	#$**4955 "G:)$($8$8$D$DM""49---!!-000##DI}===",,Kz**J{JGGB BJJr266B	r   c                 R   |j                                         D ]W\  }\  }}|                    d          r|                    dd          d         }|dv r|                     ||d|           X|j                                        D ]\  }}|                     ||           d S )Nzanonymous $enum_$rZ   r   r	   )r   r   r   	anonymousrz   T)r  r   )r   r   r$   r  r   r   r   )r   otherrE   r   r   rn  kvs           r   includezParser.include  s    !&!4!:!:!<!< 	D 	DD+2u233 ::c1%%a(DJJJdBUCCC(..00 	& 	&DAq1%%%%	& 	&r   c                 t   |j         j         j        }|dgk    rt          j        |j                  S |dgk    r/| j        d|j        z  | _        t          j        |j                  S |dgk    r/| j        d|j        z  | _        t          j        |j                  S t          d|j	        j
        z            )Nr   __dotdotdotint__z'typedef int... %s'__dotdotdotfloat__z'typedef float... %s'*:%d: unsupported usage of "..." in typedef)r   r   r   unknown_typerE   r   UnknownIntegerTypeUnknownFloatTyper   r>  rA   )r   rF   r   s      r   r   zParser._get_unknown_type  s    IN(	)))%di000+,,,%-)>)J&+DI666-...%-)@49)L&)$)444C) * * 	*r   c                     |j         j         j         j        dgk    rt          j        |j                  S t          d|j        j        z            )Nr   r  )r   r   r   unknown_ptr_typerE   r   r>  rA   )r   rF   s     r   r   zParser._get_unknown_ptr_type  sN    9>$(999)$)444C) * * 	*r   )FFNF)Fr	   r   )NFN)NF)F)r   
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r  r  r   r'  r   r   r?  rM  r  rf  r;  r  ra  r  r   r   r   r   r   r   r   '  s       & & &%$ %$ %$N     AE#) ) ) )0= = =~' ' '0 0 0. . ."
+ 
+ 
+1P 1P 1Pf3 3 37 7 71 1 1 1
 
 
. . . . JO,0g% g% g% g%R!I !I !I !IF  t t t tl  GH GH GH GHR    0& & &* * *&* * * * *r   r   )4r   r   commontypesr   r   errorr   r   r   r   ImportErrorr   r   sysversion_infothread_threadallocate_lockr   r   r   compileDOTALL	MULTILINEr`   ra   rN   rk   r  ri   r}   r   
IGNORECASEr   rg   rf   rh   r5   r   rn   ro   r   r/   r9   rB   rG   rP   rW   rw   r   objectr   r   r   r   <module>r     sM         : : : : : : : : & & & & & & & &)))))))               
$      7 ""DD   DDD   , RZ7	BL02 2
RZ 2	BL02 2	 BJA2<PP "*=>>BJ344 2:122 2:i  4bmDDbj233bj6772:n%%2: O P P  bj.0 0 2: ( ) ) RZ <==   ( ( (T0 0 0d
 
 
; ; ;$ $ $3 3 3@ @ @D% % %PP* P* P* P* P*V P* P* P* P* P*s    	++#A A)(A)